流水作业调度问题: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
//System.out.println((ShiJian)list.get(i));
int[] result = new int[6];
int start =0;int end = 5;
for(int i = 0;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)+" ");
}
}
算法的基本思想是将作业所有的时间从小到大排序,然后从小到大安排。如果时间属于第一个处理机上的就安排在前面,如果属于第二个机器就安排在后面,前提是这个任务没有安排。
如果哪里错了还请指出。