Java语言描述:回溯法之批处理作业调度
2015-06-04 17:57
232 查看
问题描述
给定 n 个作业的集合 j = {j1, j2, ..., jn}。每一个作业 j[i] 都有两项任务分别在两台机器上完成。每一个作业必须先由机器1
处理,然后由机器2处理。作业 j[i] 需要机器 j 的处理时间为 t[j][i] ,其中i = 1, 2, ..., n, j = 1, 2。对于一个确定的作业调度,设F[j][i]是作业 i 在机器 j 上的完成处理的时间。所有作业在机器2上完成处理的时间之和 f = sigma F[2][i] 称为该作业调度的完成时间之和。
批处理作业调度问题要求对于给定的 n 个作业,制定最佳作业调度方案,使其完成时间和达到最小。
给定 n 个作业的集合 j = {j1, j2, ..., jn}。每一个作业 j[i] 都有两项任务分别在两台机器上完成。每一个作业必须先由机器1
处理,然后由机器2处理。作业 j[i] 需要机器 j 的处理时间为 t[j][i] ,其中i = 1, 2, ..., n, j = 1, 2。对于一个确定的作业调度,设F[j][i]是作业 i 在机器 j 上的完成处理的时间。所有作业在机器2上完成处理的时间之和 f = sigma F[2][i] 称为该作业调度的完成时间之和。
批处理作业调度问题要求对于给定的 n 个作业,制定最佳作业调度方案,使其完成时间和达到最小。
/*该代码采用了回溯法解决最优调度问题。 * 算法思想:对于有n个不同的任务,搜索出其最佳排列,属于一棵排列树搜索问题。 * 采用回溯法,搜索到第t层时,当已经是叶子节点时,说明该路径就是当前情况下的最优解。 * 当t不是叶子节点时,依次按照一定的顺序执行当前剩下的任务,将剩下的任务全部遍历一遍。 * 在遍历过程中,按照schedule[t:n]完成剩下的搜索。计算执行当前任务后,各个时间点 * 的变化。如果该层某个节点的任务执行之后,依然符合剪枝函数,则将当前的策略顺序做出 * 调整,将刚刚执行的那个节点的任务序号放置到当前,然后继续向下进行搜索。 * * 剪枝函数:当当前节点的总时间已经大于已找到的最优时间,则该节点后面的节点都不用进行搜索。直接回溯。 * * */ package BackTrack; public class BestSchedule2 { int n=3;//作业数 int[][] mission={{2,1},{3,1},{2,3}}; int bestFinishtime = Integer.MAX_VALUE;//最短时间 int[] schedule = {0,1,2};//默认的策略顺序。 int[] bestSchedule = new int ;//最佳顺序 int[] f2 = new int ;//第二台机器的每个任务的结束时间 int f1,totaltime;//f1当前任务的结束时间,f2的总时间 public void swap(int[] str,int m,int n){ int temp = str[m]; str[m] = str ; str = temp; } public void BackTrack(int t){ //当搜索到叶子节点后,将这次遍历的策略赋值到最佳策略。 if(t>n-1){ bestFinishtime = totaltime; for(int i=0;i<n;i++) bestSchedule[i] = schedule[i]; return; } for(int i=t;i<n;i++){ //下面执行的是第t次的任务,全部遍历剩下的可能性。 f1+=mission[schedule[i]][0]; if(t==0) f2[t]=f1+mission[schedule[i]][1]; else f2[t] = ((f2[t-1]>f1)?f2[t-1]:f1)+mission[schedule[i]][1]; totaltime += f2[t]; //如果该作业处理完之后,总时间已经超过最优时间,就直接回溯。 if(totaltime<bestFinishtime){ swap(schedule,t,i); //把选择出的原来在i位置上的任务序号调到当前执行的位置t BackTrack(t+1); swap(schedule,t,i);//进行回溯,还原,执行该层的下一个任务。 } f1 -= mission[schedule[i]][0]; totaltime -= f2[t]; } } public static void main(String[] args){ BestSchedule2 bs = new BestSchedule2(); bs.BackTrack(0); System.out.println("最佳调度方案为:"); for(int i=0;i<bs.n;i++) System.out.print(bs.bestSchedule[i]+" "); System.out.println(); System.out.println("其完成时间为"+bs.bestFinishtime); } }
相关文章推荐
- java连接mysql的JDBC
- JAVA -- 关键字 abstract、static、final、native、synchronized
- JAVA -- 关键字 abstract、static、final、native、synchronized
- JAVA -- 关键字 abstract、static、final、native、synchronized
- 实验三 Java敏捷开发与XP实践
- Java实验三
- Java 实现一个链表
- 16、Spring中Bean的作用域
- java socket通信实例
- java 日志 自定义过滤
- JAVA使用类装载器装载配置文件
- java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
- java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
- struts升级
- 新版本eclipse无法安装FatJar插件的问题
- jdk自带常用命令行工具使用
- java+js实现展示本地文件夹下的所有图片demo
- 使用Java实现串口通信
- Java设计模式--单例模式
- JavaMail发送简单邮件