一、实验内容及要求
 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);
}
} 结果截图:


使用回溯法解批处理作业调度问题<算法分析>的更多相关文章

  1. 回溯法解n皇后问题

    #include<bits/stdc++.h> using namespace std; int n,sum; int c[100]; void search(int cur){ if(c ...

  2. 回溯法最优装载问题(java)

    1.问题描述:      有一批共有 n 个集装箱要装上两艘载重量分别为 c1 和 c2 的轮船,其中集装箱 i 的重量为 w[i], 且重量之和小于(c1 + c2).装载问题要求确定是否存在一个合 ...

  3. 回溯法 | 旅行商问题(TSP问题)

    学习链接: 回溯法解旅行商问题(TSP).贪心算法:旅行商问题(TSP) 今天早上做了无数个梦,然后被紧紧地吸附在床上.挣扎一番后爬起来,已经是9点了.然后我开始研究旅行商问题. 在一个无向图中找到一 ...

  4. Java算法——回溯法

    回溯法一种选优搜索法,又称试探法.利用试探性的方法,在包含问题所有解的解空间树中,将可能的结果搜索一遍,从而获得满足条件的解.搜索过程采用深度遍历策略,并随时判定结点是否满足条件要求,满足要求就继续向 ...

  5. python 回溯法 子集树模板 系列 —— 13、最佳作业调度问题

    问题 给定 n 个作业,每一个作业都有两项子任务需要分别在两台机器上完成.每一个作业必须先由机器1 处理,然后由机器2处理. 试设计一个算法找出完成这n个任务的最佳调度,使其机器2完成各作业时间之和达 ...

  6. Leetcode之回溯法专题-37. 解数独(Sudoku Solver)

    Leetcode之回溯法专题-37. 解数独(Sudoku Solver) 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1 ...

  7. 回溯法——最大团问题(Maximum Clique Problem, MCP)

    概述: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题.最大团问题又称为最大独立集问题(Maximum Independent ...

  8. 回溯法——n后问题

    问题描述: 在n*n的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行 ...

  9. python常用算法(7)——动态规划,回溯法

    引言:从斐波那契数列看动态规划 斐波那契数列:Fn = Fn-1 + Fn-2    ( n = 1,2     fib(1) = fib(2) = 1) 练习:使用递归和非递归的方法来求解斐波那契数 ...

随机推荐

  1. 找规律 UVALive 6506 Padovan Sequence

    题目传送门 /* 找规律:看看前10项就能看出规律,打个表就行了.被lld坑了一次:( */ #include <cstdio> #include <algorithm> #i ...

  2. Application,Service,Activity 三者的Context的应用场景

    Application 的 context 不是万能的,所以也不能随便乱用,对于有些地方则必须使用 Activity 的 Context, 对于Application,Service,Activity ...

  3. WinForm 里面关闭窗体的两个方法的区别 Form.coles()与Application,Exit()

  4. Java多线程——线程的优先级和生命周期

    Java多线程——线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...

  5. P1478 陶陶摘苹果(升级版)

    题目描述 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力 ...

  6. 坑爹的鲁大师,VMware Workstation 报错(AsyncSocket error)一例解决

    今天准备把电脑上安装的VMware Play换成VMware Workstation,毕竟 Workstation 的快照功能还是很有必要的. 结果,VMware Workstation 安装成功后, ...

  7. Toast解析

    课程Demo public class MainActivity extends AppCompatActivity { private Button bt1; private Button bt2; ...

  8. spring 整合struts

    1.例子:未被spring整合 struts.xml 的配置文件 <constant name="struts.enable.DynamicMethodInvocation" ...

  9. Node.js——body方式提交数据

    引入核心模块 http,利用其 api(http.createServer) 返回一个 http.server 实例,这个实例是继承于net.Server,net.Server 也是通过net.cre ...

  10. System.Web.Optimization找不到引用怎么办

    新建Bootstap for MVC5出现的问题, 通过打开VS 工具->NUGET程序包管理器->控制台 输入以下命令进行完成,一切完成 Install-Package Microsof ...