基于回溯法和贪婪法的多机调度问题.docx
《基于回溯法和贪婪法的多机调度问题.docx》由会员分享,可在线阅读,更多相关《基于回溯法和贪婪法的多机调度问题.docx(12页珍藏版)》请在冰豆网上搜索。
![基于回溯法和贪婪法的多机调度问题.docx](https://file1.bdocx.com/fileroot1/2022-12/12/a540899c-1a26-4a8b-8315-7c26588d3525/a540899c-1a26-4a8b-8315-7c26588d35251.gif)
基于回溯法和贪婪法的多机调度问题
目录
一.课程实验概述1
1.目的与任务1
2.开发环境1
3.软件配置1
4.参考资料1
5.任务完成的一般过程1
6.个人完成的程序模块和文档清单1
二.介绍本小组个人的构思与创意2
三、介绍自己在小组中完成的工作的具体过程2
四、算法与代码解析3
1.流程图3
2.关键代码,算法复杂度5
3.算法在解题中的应用策略8
4.程序运行结果8
5.问题、解决方法及编程体会11
五、实验个人小结11
一.课程实验概述
1.目的与任务
将对n个独立作业如何分配在m台相同的机器加工处理的多机调度问题进行解决,这就是我们要解决的任务。
目的在于编写一个程序使得解决问题的过程以图形界面方式动态的展示出来,以让用户能够轻易的看出解决的方案以及过程。
2.开发环境
系统:
Windows7
硬件条件:
PC机
3.软件配置
编程语言:
java
开发软件:
eclipse
本程序需要先装好jdk,并修改环境变量,才能运行。
4.参考资料
王晓东编著《算法设计与分析(第二版)》清华大学出版社
5.任务完成的一般过程
首先通过新建工程并确定n与m的大小,随机生成每个独立作业所要完成的时间,也可以对工作时间表的数据进行修改。
然后可以选择以贪心算法来进行求解得到的近似结果,或者以回溯法来进行求解得到的准确结果。
求解结果将会以分阶段柱图的形式展现。
6.个人完成的程序模块和文档清单
文本清单为课程设计报告一份。
二.介绍本小组个人的构思与创意
三、介绍自己在小组中完成的工作的具体过程
我们小组在一开始就确立了课程设计的方向为多机调度问题,因为对于这个问题的图形界面展示我们有很好的思路,就是以分阶段动态形式的柱图来展示。
因为这个问题较为简单,在贪心算法还是回溯法过程中都没有遇到什么困难,问题主要出现在数据的传递,以及图形界面的设计上,经过反复的修改与考虑之后一一解决。
我们最满意的是我们的界面,以及用不同的颜色代表不同的作业来形成柱图,从而更好的展示出方案的解决过程。
四、算法与代码解析
7.流程图
图1系统流程
图2合并排序
图3回溯法
图4贪心算法
8.关键代码,算法复杂度
关键代码:
publicclassAlgorithm{
publicstaticJobNode[]mergeSort(JobNodelist[],intleft,intright){
intmiddle=(left+right)/2;
JobNode[]list1=null,list2=null,ansList=null;
/*如果!
left*否则这将这个数组从中间分开,分别进行合并排序,递归求解,最后将两个数组合并。
*/
if(leftlist1=mergeSort(list,left,middle);
list2=mergeSort(list,middle+1,right);
ansList=merge(list1,list2);//将两个数组合并,合并后数组降序,长度为两个传入数组的长度和和
}else{
ansList=newJobNode[1];
ansList[0]=list[left];
returnansList;
}
returnansList;
}
privatestaticJobNode[]merge(JobNodelist1[],JobNodelist2[]){
JobNode[]ansList=newJobNode[list1.length+list2.length];
inti=0,j=0,k=0;
while(iif(list1[i].getTime()>list2[j].getTime()){
ansList[k]=list1[i];
i++;
}else{
ansList[k]=list2[j];
j++;
}
k++;
}
if(i==list1.length){
while(jansList[k]=list2[j];
j++;
k++;
}
}elseif(j==list2.length){
while(iansList[k]=list1[i];
i++;
k++;
}
}
returnansList;
}
publicstaticintminValueIndex(float[]group){
intans=0;
for(inti=1;iif(group[ans]>group[i])
ans=i;
}
returnans;
}
publicstaticfloatmaxValue(float[]group){
floatans=group[0];
for(inti=1;iif(ansans=group[i];
}
returnans;
}
publicstaticfloatgreedyJob(JobNode[]jobs,float[]machineTime,
int[]result){
for(inti=0;iintj=minValueIndex(machineTime);//回去当前机器利用时间最少的序号
result[i]=j;//将第i个工作给的j个机器。
machineTime[j]+=jobs[i].getTime();
}
floatbestTime=maxValue(machineTime);
returnbestTime;
}
publicstaticfloatbacktrackJob(JobNode[]jobs,
int[]bestChoose,intnumMachine){
float[]bestTime=newfloat[1];
bestTime[0]=Float.POSITIVE_INFINITY;
float[]machineTime=newfloat[numMachine];
for(inti=0;imachineTime[i]=0;
}
int[]nowChoose=newint[jobs.length];
bestTime[0]=backtrackJob(jobs,nowChoose,bestChoose,numMachine,0,machineTime,bestTime);
returnbestTime[0];
}
publicstaticFloatbacktrackJob(JobNode[]jobs,int[]nowChoose,
int[]bestChoose,intnumMachine,intstart,float[]machineTime,float[]bestTime){
if(start==jobs.length){//到达叶子节点
if(maxValue(machineTime)bestTime[0]=maxValue(machineTime);
for(inti=0;ibestChoose[i]=nowChoose[i];
}
returnbestTime[0];
}
returnbestTime[0];
}
for(inti=0;inowChoose[start]=i;
machineTime[i]+=jobs[start].getTime();
backtrackJob(jobs,nowChoose,bestChoose,numMachine,start+1,
machineTime,bestTime);//搜索下一层
machineTime[i]-=jobs[start].getTime();
}
returnbestTime[0];
}
}
贪心算法复杂度:
nln(n)
回溯算法复杂度:
9.算法在解题中的应用策略
在这次课程设计中,我们小组主要用了贪心算法以及回溯算法,解决过程以及结果以Java图形界面的方式展现出来。
使用贪心算法是因为用这种方法可以的出多机调度问题的近似解,即其解决结果并不一定是最优解。
用回溯法来求解出最优结果。
两种算法相互对比,可以让用户更容易理解这两种算法的不同,同时我们会以文字以及柱图动态变化的形式来说明解决过程,并得出最终的结果。
10.程序运行结果
图5建立项目
图6贪心算法求解
图7回溯算法求解
图8修改作业时间重新求解
图9建立另一个项目
图5通过点击“新建”按钮输入项目信息,然后系统会随机生成n个作业分别完成的时间
图6通过点击贪心算法部分的“结果”按钮会显示出用贪心算法求解的最终结果,点击“过程”按钮则会通过文字说明讲解求解过程,同时柱图会根据求解过程变化。
(注:
要获取柱图变化,需先点击“结果”按钮)。
图7回溯算法求解,同图6
图8可以通过修改表上的作业时间,来重新求解结果。
图9需要完成别的项目时,可以新建项目来求解新一个项目。
11.问题、解决方法及编程体会
我们遇到的问题主要是在图形界面与算法的连接以及动态的展示问题解决过程时出现。
然后通过查阅资料以及小组讨论最终一一解决
五、实验个人小结
这次的课程设计给予我们很大的感触,看到一份程序从无到有,通过团队的合作与配合诞生的那份喜悦无语言表。
让我们对理论的掌握更深,特别是在贪心算法和回溯法之中尤为深刻,因为我们的程序设计主要运用了这两种算法,同时我们能够更为熟练的运用javagui来编写我们心中的图形界面。
增加了一次程序设计的经验这无疑让我们的实践能力大大的增强,能够更好的对一项工程进行更好的评估,分配任务,解决问题。