您的位置:首页 > 其它

贪心法求解多处理器问题

2013-12-17 11:34 344 查看
有jobNum个任务等待machineNum个处理器去完成,任务不可细分,求最优完成时间。

本质是NP问题,但是可以通过贪心法来求近似解:

策略: 对jobNum个任务按其占用处理器的时间排序,最重的任务往前排,每次选择最早空出来的处理器安排给最重的任务。

例如7个独立作业{2,14,4,16,6,5,3}

的三处理器调度为

M1: 4

M2: 2-7

M3: 5-6-3-1

CLASS JobNode

{

public:operator int() const{return time;}; //该重载用来泛型算法algorithm.sort()的操作,即按照任务需要的处理器时间来对所有任务排序

private:

int ID; // 任务的标示符

int time; //任务需要耗费的时间

}

class MachineNode

{

public:

operator int() const{return avail;}// //该重载用来泛型算法algorithm.sort()的操作,即按照处理器的空闲开始时间avil对所有的处理器来排序

private:

int ID; // 处理器的标识符

int avail; // 处理器当前最早能空闲出来的时间

}

template<class Type>

void Greedy(Type a[], int jobNum, int machineNum) //传入JobNode数组a

{

if(jobNum<=machineNum) return; // 不用算了

algorithm.sort(a,n); // 泛型算法对JobNode数组排序,按照关键字time

MinHeap<MachineNode> H(machineNum); // 新建一个堆,大小为machineNum

MachineNode x;

for(int i=1;i<=machineNum;i++)

{

x.avail=0;

x.ID=i;

H.insert(x);

}// 该for循环先在最小堆里插入machineNum个元素,即machineNum个处理器,各个处理器的空闲开始时间都是0,标示都可以用,处理器之间没有区别。

for(int i=jobNum;i>=1;i--) //开始分配所有的任务

{

H.deleteMin(x); // 从最小堆里挑出那个空闲开始最早的机器

//注意数组a已经按照需要的时间排序

cout<<"machine"<<x.ID<<"from"<<x.avail<<"dispatch to task"<<a[i].ID<<endl;// 将当前最重的任务分配给最早空闲出来的机器

x.avail+=a[i].time;

H.insert(x); //刚才出栈的那个机器被安排了任务,空闲开始时间avail增加了a[i].time,因此一般情况下,不会再排在最小堆的顶上,下次出最小堆的就换成了别的处理器。

}

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