多机调度问题 贪心算法
多机调度问题
要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业
要求:
分别采用以下两种贪心策略实现算法求解,对比实验结果,分析哪种贪心策略更适合应用于多机调度问题。
- 最长处理时间作业优先的贪心选择策略。
- 最短处理时间作业优先的贪心选择策略。
至少采用两组实验数据进行实验,请参考实验数据一,自己再设计一组实验数据。
实验数据一:7个独立的作业由3台机器加工处理,各作业所需的处理时间为:{2,14,4,6,16,5,3}。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
@SuppressWarnings("all")
public class Multi_machine_scheduling_problem {//贪心算法之多机调度问题
static void Shell_Sort(int []a) {//希尔排序之升序
int i,j,key,mid;
for(mid = a.length / 2; mid > 0; mid /= 2){
for(i = mid; i < a.length; i ){
j = i;
key = a[j];
if (a[j] < a[j - mid]) {
while(j - mid >= 0 && a[j - mid] > key){
a[j] = a[j - mid];
j = j - mid;
}
a[j] = key;
}
}
}
}
static void Shell_Sort_contrary(int []a) {//希尔排序之降序
int i,j,key,mid;
for(mid = a.length / 2; mid > 0; mid /= 2){
for(i = mid; i < a.length; i ){
j = i;
key = a[j];
if (a[j] > a[j - mid]) {
while(j - mid >= 0 && a[j - mid] < key){
a[j] = a[j - mid];
j = j - mid;
}
a[j] = key;
}
}
}
}
private static int getMin(List<Integer> list){
int min = list.get(0);
for(int i = 0;i < list.size();i ){
if(list.get(i) < min){
min = list.get(i);
}
}
return list.indexOf(min);
}
private static int getMax(List<Integer> list){
int max = list.get(0);
for(int i = 0;i < list.size();i ){
if(list.get(i) > max){
max = list.get(i);
}
}
return list.indexOf(max);
}
private static void MachineDis(int []worksTime,int machineNum){//多机调度问题
int runMinNum;
List<Integer> list = new ArrayList<Integer>();
for(int i = 0;i < worksTime.length;i ){//存储现有的作业
list.add(worksTime[i]);
}
List<Integer> listRun = new ArrayList<Integer>();
for(int i = 0;i < machineNum;i ) {//将作业放入机器
listRun.add(list.get(i));
}
for(int i = 0;i < machineNum;i ) {//移除已经放入机器的作业
list.remove(0);
}
for(int i = 0;i < list.size();i ) {//更新最先完成作业的机器
runMinNum = getMin(listRun);
listRun.set(runMinNum,(list.get(i) listRun.get(runMinNum)));
}
System.out.println("最短时间为:" listRun.get(getMax(listRun)));
}
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入作业数和机器数");
int worksNum = scanner.nextInt();//工作数
int machineNum = scanner.nextInt();//机器数
System.out.println("请输入每个作业需要的时间");
int []worksTime = new int[worksNum];//每个作业时间
for(int i = 0;i < worksNum;i ){
worksTime[i] = scanner.nextInt();
}
System.out.print("最长处理时间作业优先贪心选择策略");
Shell_Sort_contrary(worksTime);//降序
MachineDis(worksTime,machineNum);
System.out.print("最短处理时间作业优先贪心选择策略");
Shell_Sort(worksTime);//升序
MachineDis(worksTime,machineNum);
}
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgehekf
系列文章
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01