使用回溯法解批处理作业调度问题<算法分析>
一、实验内容及要求
1.要求用回溯法原理求解问题;
2.要求手工输入t1[10]及t2[10],t1[i]是任务i在机器1上的执行时间,t2[i]是任务i在机器2上的执行时间;
3.求出最优批处理作业调度总时间及作业安排顺序。
二、实验步骤
1、手工输入任务执行时间数组;
2、输出作业总时间和作业的安排顺序。
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<worknum;i++)
bestSchedule[i] = schedule[i];
return;
}
for(int i=t;i<worknum;i++){ //下面执行的是第t次的任务,全部遍历剩下的可能性。
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<bestFinishtime){
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<worknum;i++){
T1[i]=in_t1.nextInt();} System.out.println("请输入各任务在机器2上的执行时间:"); //循环输入T2数组
for(int i=0;i<worknum;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<worknum;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<worknum;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<worknum;i++){
jieguo[i]=bs.bestSchedule[i]+1;
System.out.print("任务"+jieguo[i]+"\n");}
System.out.println("作业完成的总时间是"+bs.bestFinishtime);
}
} 结果截图:


使用回溯法解批处理作业调度问题<算法分析>的更多相关文章
- 回溯法解n皇后问题
#include<bits/stdc++.h> using namespace std; int n,sum; int c[100]; void search(int cur){ if(c ...
- 回溯法最优装载问题(java)
1.问题描述: 有一批共有 n 个集装箱要装上两艘载重量分别为 c1 和 c2 的轮船,其中集装箱 i 的重量为 w[i], 且重量之和小于(c1 + c2).装载问题要求确定是否存在一个合 ...
- 回溯法 | 旅行商问题(TSP问题)
学习链接: 回溯法解旅行商问题(TSP).贪心算法:旅行商问题(TSP) 今天早上做了无数个梦,然后被紧紧地吸附在床上.挣扎一番后爬起来,已经是9点了.然后我开始研究旅行商问题. 在一个无向图中找到一 ...
- Java算法——回溯法
回溯法一种选优搜索法,又称试探法.利用试探性的方法,在包含问题所有解的解空间树中,将可能的结果搜索一遍,从而获得满足条件的解.搜索过程采用深度遍历策略,并随时判定结点是否满足条件要求,满足要求就继续向 ...
- python 回溯法 子集树模板 系列 —— 13、最佳作业调度问题
问题 给定 n 个作业,每一个作业都有两项子任务需要分别在两台机器上完成.每一个作业必须先由机器1 处理,然后由机器2处理. 试设计一个算法找出完成这n个任务的最佳调度,使其机器2完成各作业时间之和达 ...
- Leetcode之回溯法专题-37. 解数独(Sudoku Solver)
Leetcode之回溯法专题-37. 解数独(Sudoku Solver) 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1 ...
- 回溯法——最大团问题(Maximum Clique Problem, MCP)
概述: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题.最大团问题又称为最大独立集问题(Maximum Independent ...
- 回溯法——n后问题
问题描述: 在n*n的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行 ...
- python常用算法(7)——动态规划,回溯法
引言:从斐波那契数列看动态规划 斐波那契数列:Fn = Fn-1 + Fn-2 ( n = 1,2 fib(1) = fib(2) = 1) 练习:使用递归和非递归的方法来求解斐波那契数 ...
随机推荐
- bitset优化背包问题
https://blog.csdn.net/HowardEmily/article/details/77340566 留坑待填
- FileStream和BinaryReader,BinaryWriter,StreamReader,StreamWriter的区别
FileStream对于在文件系统上读取和写入文件非常有用,FileStream缓存输入和输出,以获得更好的性能.FileStream对象表示在磁盘或网络路径上指向文件的流.这个类提供了在文件中读写字 ...
- Dock
搭建本地 Registry - 每天5分钟玩转 Docker 容器技术(20) 小结: dock 版本号 分为 3位,比如1.1.2 就分为1, 1.1,1.1,2 这个几个版本 这种 tag 方案使 ...
- 191 Number of 1 Bits 位1的个数
编写一个函数,输入是一个无符号整数,返回的是它所有 位1 的个数(也被称为汉明重量).例如,32位整数 '11' 的二进制表示为 00000000000000000000000000001011,所以 ...
- [转]Php MySql Class
本文转自:http://www.cnblogs.com/noevil/archive/2010/11/06/1870864.html <?php /** * 数据库操作类 * * @aut ...
- SharePoint2013升级SP1后,运行配置向导报错:未注册sharepoint服务
SharePoint Server 2013 升级SP1后,需要重新运行配置向导,但是运行过程中报错:未注册sharepoint服务. 日志详细错误信息: 已引发类型为 Microsoft.Share ...
- Windows远程桌面连接复制文件失败或非常慢
环境搭建过程中经常会遇到需要将文件从本机传到云服务器或者企业内部服务器上的场景,此时如果文件过大的话要传个半天或者直接告诉你复制失败,让人好生无奈 ~ ~. windows环境下,可以将本地磁盘映 ...
- UnixTime的时间戳的转换
public static string XConvertDateTime(double unixTime) { System.DateTime time = System.DateTime.MinV ...
- hihocoder offer收割编程练习赛10 C 区间价值
思路: 令v[l, r](0<= l <= r < n)表示区间[l,r]的价值,则长度为n的区间的价值最少为0,最多为n*(n-1)/2.整体对价值二分,求能满足sum{v[l, ...
- Xamarin.Forms跨平台开发入门-第二部分:深入解析
英文原文: https://developer.xamarin.com/guides/xamarin-forms/getting-started/hello-xamarin-forms/deepdiv ...