贪心法求解多处理器问题
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,因此一般情况下,不会再排在最小堆的顶上,下次出最小堆的就换成了别的处理器。
}
}
本质是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,因此一般情况下,不会再排在最小堆的顶上,下次出最小堆的就换成了别的处理器。
}
}
相关文章推荐
- 贪心法求解单源最短路径问题
- 贪心法求解背包问题
- C++作业: 贪心法求解问题
- 贪心法 背包问题求解
- 贪心法求解背包问题(物品可分)
- C语言及程序设计进阶例程-27 贪心法问题求解
- 用贪心法求解背包问题
- 贪心法求解三种有关区间覆盖问题
- 贪心法求解三种有关区间覆盖问题
- 贪心法求解背包问题
- 第十二周-项目四 利用遍历思想求解图问题(5)
- 第十二周-项目四 利用遍历思想求解图问题(7)
- 第12周上机实践项目4 - 利用遍历思想求解图问题(1-4)
- 求解常微分方程边值问题之试射法
- 人工智能3:通过搜索进行问题求解
- 滑雪问题的分支限界法求解
- C语言:汉诺塔问题求解
- Java动态规划求解最长公共子串问题
- 数独 问题求解