您的位置:首页 > 编程语言 > Java开发

Java实现流水作业调度问题

2011-12-05 21:43 645 查看
【作者:孟祥月 博客:http://blog.csdn.net/mengxiangyue

流水作业调度问题:n个作业要求在两个机器上处理,要求先在第一个上处理,然后再在第二个处理器上处理,求如何安排使得完成后最后时间最短。

下面是程序代码:

import java.util.ArrayList;
import java.util.Collections;

class RenWu
{
	private int first;//第一个用的时间
	private int second;//第二个用的时间
	private boolean flag = false;//标志是否分配了
	public RenWu(int first, int second)
	{
		this.first = first;
		this.second = second;
	}
	public int getFirst()
	{
		return first;
	}
	public void setFirst(int first)
	{
		this.first = first;
	}
	public int getSecond()
	{
		return second;
	}
	public void setSecond(int second)
	{
		this.second = second;
	}
	public boolean isFlag()
	{
		return flag;
	}
	public void setFlag(boolean flag)
	{
		this.flag = flag;
	}
}
class ShiJian implements Comparable
{
	@Override
	public String toString()
	{
		return "ShiJian [time=" + time + ", shuYu=" + shuYu + ", diJiXiang="
				+ diJiXiang + "]";
	}
	public ShiJian(int time, int shuYu, int diJiXiang)
	{
		super();
		this.time = time;
		this.shuYu = shuYu;
		this.diJiXiang = diJiXiang;
	}
	private int time;//所用的时间
	private int shuYu;//代表属于第几个作业
	private int diJiXiang;//代表是第几个流水线上的时间
	
	public int getTime()
	{
		return time;
	}
	public void setTime(int time)
	{
		this.time = time;
	}
	public int getShuYn()
	{
		return shuYu;
	}
	public void setShuYn(int shuYn)
	{
		this.shuYu = shuYn;
	}
	public int getDiJiXiang()
	{
		return diJiXiang;
	}
	public void setDiJiXiang(int diJiXiang)
	{
		this.diJiXiang = diJiXiang;
	}
	@Override
	public int compareTo(Object arg0)
	{
		ShiJian obj = (ShiJian)arg0;
		return this.time>obj.getTime()?1:(this.time==obj.getTime()?0:-1);
	}	
}
public class liushuizuoye
{
	public static void main(String[] args)
	{
		RenWu[] renWu = new RenWu[6];
		renWu[0] = new RenWu(3,8);
		renWu[1] = new RenWu(12,10);
		renWu[2] = new RenWu(5,9);
		renWu[3] = new RenWu(2,6);
		renWu[4] = new RenWu(9,3);
		renWu[5] = new RenWu(11,1);
		ArrayList list = new ArrayList();//时间队列
		//将时间加入到时间队列
		for(int i = 0;i<6;i++)
		{
			list.add(new ShiJian(renWu[i].getFirst(),i,1));
			list.add(new ShiJian(renWu[i].getSecond(),i,2));
		}
		Collections.sort(list);
//		for(int i = 0;i<list.size();i++)
//			System.out.println((ShiJian)list.get(i));
		int[] result = new int[6];
		int start =0;int end = 5;
		for(int i = 0;i<list.size();i++)
		{
			ShiJian shijian = (ShiJian)list.get(i);
			int num = shijian.getShuYn();//得到属于第几项任务
			if(!renWu[num].isFlag())//如果未分配则分配
			{
				if(shijian.getDiJiXiang() == 1)//表示的是第一项
				{
					result[start] = num;
					start++;
					renWu[num].setFlag(true);
				}
				else//如果是第二个时间
				{
					result[end] = num;
					end--;
					renWu[num].setFlag(true);
				}
			}
		}
		System.out.println("流水作业的时间是:");
		for(int i = 0;i<6;i++)
			System.out.print((result[i]+1)+"  ");
	}

}
算法的基本思想是将作业所有的时间从小到大排序,然后从小到大安排。如果时间属于第一个处理机上的就安排在前面,如果属于第二个机器就安排在后面,前提是这个任务没有安排。

如果哪里错了还请指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: