多机调度问题贪心算法(多机调度问题贪心算法证明)
本篇文章给大家谈谈多机调度问题贪心算法,以及多机调度问题贪心算法证明对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
五大常用算法之一:贪心算法
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,换句话说,当考虑做何种选择的时候,我们只考虑对当前问题最佳的选择而不考虑子问题的结果。这是贪心算法可行的第一个基本要素。贪心算法以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。 对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。
当一个问题的最优解包含其子问题的最优解时册祥,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心算法求解的关键特征。
值得注意的是,贪心算法并不是完全不可以使用,贪心策略一旦经过证明成立后,它就是一种高效的算法。比如, 求最小生成树的Prim算法和Kruskal算法都是漂亮的贪心算法 。
贪心算法还是很常见的算法之一,这是由于它简单易行,构造贪心策略不是很困难。
可惜的是,它需要证明后才能真正运用到题目的算法中。
一般来说,贪心算法的证明围绕着:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的。
对于例题中的3种贪心策略,都是无法成立(无法被证明)的,解释如下:
贪心策略:选取价值最大者。反例:
W=30
物品:A B C
重量:28 12 12
价值:30 20 20
根据策略,首先选取物品A,接下来就无法再选取了,可是,选取B、C则更好。
(2)贪心策略:选取重量最小。它的反例与第一种策略的反例差不多。
(3)贪心策略:选取单位重量价值最大的物品。反例:
W=30
物品:A B C
重量:28 20 10
价值:28 20 10
根据策略,三种物品单位重量价值一样,程序无法依据现有策略作出判断,如果选择A,则答案错误。但是果在条件中加一句当遇见单位价值相同的时候,优先装重量小的,这样的问题就可以解决.
所以需要说明的是,贪心算法可以与随机化算法一起使用,具体的例子就不再多举了。(因为这一类算法普及性不高,而且技术含量是非常高的,需要通过一些反例确定随机的对象是什么,随机程度如何,但也是稿州不能保证完全正确,只能是极大州敬搏的几率正确)。
贪心算法的基本思想
贪心算法的基本思想就是分级处理。
贪心算法是一种分级处理的方法。用贪心法设计算法的特点是一步一步的进行,根据某个优化测度(可能是目标函数,也可能不是目标函数),每一步上都要保证能获得局部最优解。每一步只考虑一个数据,它的选取应满足握档局部优化条件。若下一个数据与部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加为止。
贪心算法可解决的问题通常大部分都有如下的特性:
1、随着算法的进行,将积累起其它两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包含已经被考世皮睁虑过但被丢弃的候选对象。
2、有一个函数来检查一个候选对象的集合是否提供了问题的解答。该函数不考虑此时的解决方法是否最优。
3、还有一个函数检查是否一个候选对象的集合是可行的,也即是否可能往该集合上添加更多的候选对象以获得一个解。和上一个函数一样,此时不考虑解决方法的最优性。
4、选搜岁择函数可以指出哪一个剩余的候选对象最有希望构成问题的解。
5、最后,目标函数给出解的值。
求C语言高手 多机调度问题 ,设计个程序 要C语言版的 不要C++的 谢谢啊
#includestdio.h
#define N 10
typedef struct node
{
int ID,time;
}jobnode;
typedef struct Node
{
int ID,avail;
}manode;
manode machine[N];
jobnode job[N];
manode* Find_min(manode a[],int m)
{
manode* temp=a[0];
for(int i=1;im;i++)
{
if(a[i].availtemp-avail)
temp=a[i];
}
return temp;
}
void Sort(jobnode t[],int n)
{
jobnode temp;
for(int i=0;in-1;i++)
for(int j=n-1;ji;j--)
{
if(job[j].timejob[j-1].time)
{
temp=job[j];
job[j]=job[j-1];
job[j-1]=temp;
}
}
}
void main()
{
int n,m,temp;
manode* ma;
printf("输入作业数目(作业编号按输入顺序处理)\n");
scanf("%d",n);
printf("输入相应裂孙闭作业所需处理时间:\n");
for(int i=0;in;i++)
{
scanf("%d",job[i].time);
job[i].ID=i+1;
}
printf("输入机器数目(机器编号按输入顺序处理)\n");
scanf("%d",m);
for(i=0;im;i++)
{
machine[i].ID=i+1;
machine[i].avail=0;
}
putchar('\n');
if(n=m)
{
printf("为每个凯基作业分配一台机器,可完成任务!\n");
return;
}
Sort(job,n);
for(i=0;in;i++)
{
ma=Find_min(machine,m);
printf("将机器: %d 从 %d ----- %d 的时间段分配给作业: %d\n",ma-ID,ma-avail,ma-avail+job[i].time,job[i].ID);
ma-avail+=job[i].time;
}
temp=machine[0].avail;
for(i=1;im;i++)
{
if(machine[i].availtemp)
temp=machine[i].avail;
}
putchar('\n');
printf("该批作业处理完成所需加工时间为: %d\n",temp);
}
刚写的,试过了,运行通过.主要运用贪心算法,应肆裂该算比较典型的吧,呵呵,该睡觉了,明天还有考试呢,希望对你有帮助!共同进步哈!
贪心算法多机调度问题伪代码
void machineWork::Sort( int timeId[] )
{
for( int i = 0 ; i works ; i++ )
timeId[i] = i;
for( i = 0 ; i works - 1 ; i++ )
{
double min = timesUnsorted[ timeId[i] ];
int p = i;
for( int j = i + 1 ; j works ; j++ )
{
if( this-timesUnsorted[ timeId[j] ] min )
{
min = this-timesUnsorted[ timeId[j] ];
p = j;
}
}
int t = timeId[i];
timeId[i] = timeId[p];
timeId[p] = t;
}
}
[img]贪心算法的多机调度问题
多塔问题??
可用动态规笑皮巧划试一握桥下。。
记录m台机器中使用时间最长的,时间为Tmax,以及其它m-1台机器所用时间为碰键Ti。
将Ti与Tmax时间差的和记录为St。则St越小时间Tmax越短。
关于多机调度问题贪心算法和多机调度问题贪心算法证明的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。