回溯法 批处理作业调度_使用回溯法解批处理作业调度问题<算法分析>

该博客通过一个Java程序展示了如何使用回溯法来解决批处理作业调度问题,以找到最短的完成时间。文章首先定义了作业数量、任务执行时间等变量,然后实现了一个BackTrack方法进行回溯搜索。在回溯过程中,如果总时间超过最优时间,则回溯并尝试其他策略。最终,程序输出最佳的作业顺序和最短的完成时间。
摘要由CSDN通过智能技术生成

package saunfafenxi;

import java.util.Scanner;

public class shiyan5 {

static int worknum=3; //作业总数

static int[] T1 = new int[worknum];//第i个任务在机器一上面执行的时间

static int[] T2 = new int[worknum];//第i个任务在机器一上面执行的时间

static int[] jieguo = new int[worknum];//保存结果的辅助数组

static int[][] mission2 = new int[worknum][2];//第i个任务在机器一上面执行的时间

int bestFinishtime = Integer.MAX_VALUE;//最短时间

int[] schedule = {0,1,2};//默认的策略顺序。

int[] bestSchedule = new int[worknum];//最佳顺序

int[] f2 = new int[worknum];//第二台机器的每个任务的结束时间

int f1,totaltime;//f1当前任务的结束时间,f2的总时间

public void swap(int[] str,int m,int n){

int temp = str[m];

str[m] = str[n];

str[n] = temp;

}

public void BackTrack(int t){ //当搜索到叶子节点后,将这次遍历的策略赋值到最佳策略。

if(t>worknum-1){

bestFinishtime = totaltime;

for(int i=0;i

bestSchedule[i] = schedule[i];

return;

}

for(int i=t;i

f1+=mission2[schedule[i]][0];

if(t==0)

f2[t]=f1+mission2[schedule[i]][1];

else

f2[t] = ((f2[t-1]>f1)?f2[t-1]:f1)+mission2[schedule[i]][1];

totaltime += f2[t];

//如果该作业处理完之后,总时间已经超过最优时间,就直接回溯。

if(totaltime

swap(schedule,t,i); //把选择出的原来在i位置上的任务序号调到当前执行的位置t

BackTrack(t+1);

swap(schedule,t,i);//进行回溯,还原,执行该层的下一个任务。

}

f1 -= mission2[schedule[i]][0];

totaltime -= f2[t];

}

}

public static void main(String[] args){

Scanner in_t1 = new Scanner(System.in);

System.out.println("请输入各任务在机器1上的执行时间:");//循环输入T1数组

for(int i=0;i

T1[i]=in_t1.nextInt();}

System.out.println("请输入各任务在机器2上的执行时间:");//循环输入T2数组

for(int i=0;i

T2[i]=in_t1.nextInt();}

System.out.println("|\t\t-----各个作业所需时间如下----\t\t|");

System.out.println("|\t作业\t|\t机器1\t|\t机器2\t|");

for(int i=0;i

int s=i+1;

System.out.println("|\t作业"+s+"\t|\t"+T1[i]+"\t|\t"+T2[i]+"\t|");//循环输出T1数组

}

for(int i=0;i

mission2[i][0]=T1[i];

mission2[i][1]=T2[i];

}

shiyan5 bs = new shiyan5();

bs.BackTrack(0);

System.out.println("\n\n使用回溯得出的作业安排顺序如下:");

for(int i=0;i

jieguo[i]=bs.bestSchedule[i]+1;

System.out.print("任务"+jieguo[i]+"\n");}

System.out.println("作业完成的总时间是"+bs.bestFinishtime);

}

}

结果截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值