一、实验内容及要求
 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. 数据结构 - 静态顺序线性表的实行(C语言)

    数据结构 - 静态顺序线性表的实行(C语言) 1 获取元素操作 对于线性表的顺序存储结构来说,如果我们要实现GetElem操作,即将线性表L中的第i个位置元素值返回,其实是非常简单的. 只要i的数值在 ...

  2. Poj 3264 Balanced Lineup RMQ模板

    题目链接: Poj 3264 Balanced Lineup 题目描述: 给出一个n个数的序列,有q个查询,每次查询区间[l, r]内的最大值与最小值的绝对值. 解题思路: 很模板的RMQ模板题,在这 ...

  3. C# DataTable的详细用法[转]

    原文链接 1.新建表   private DataTable vsDt =new DataTable(); 2.清空表中内容(表中的列还在)  vsDt.Clear(); 3.清空表中的列   vsD ...

  4. mac下 netbeans 8.02中文版设置代码自动补齐 + eclipse自动补齐

    netbeans自带的自动补齐快捷键是commad+\ 我想要的是在输入的时候,有自动提示,找了半天也没找到怎么搞. 因为我是用的mac系统 后来参考其他的设置,找到了设置的方法,把这个方法记录一下. ...

  5. Polynomial Division 数学题

    https://www.hackerrank.com/contests/101hack45/challenges/polynomial-division 询问一个多项式能否整除一个一次函数.a * x ...

  6. B. Hongcow Solves A Puzzle

    http://codeforces.com/contest/745/problem/B 题目要求的是,给定一个图形,要求里面判断是否有矩形,且仅有一个 就是 XXX.... XXX...X 是不行的, ...

  7. Codeforces Beta Round #96 (Div. 2) (A-E)

    写份DIV2的完整题解 A 判断下HQ9有没有出现过 #include <iostream> #include<cstdio> #include<cstring> ...

  8. hibernate与struts2整合中出现问题以及一级缓存查询数据在业务层问题

    直接上问题: org.hibernate.HibernateException: HHH000142: Javassist Enhancement failed: cn.xxx.pojo.Custom ...

  9. 前端css3样式前缀自动补全工具--autoprefixer

    最近在学习一份来自git的动画框架源码,看懂70%的核心代码后,打算自己动手实践一版,然鹅,所有框架搭起来以后,在动画这块却出了问题: 想设计一个slideInLeft的动画,必然想到了要从偏移-10 ...

  10. com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "FileSize"

    请求阿里云的OSS接口图片信息,返回json格式的数据,通过ObjectMapper将json转为Image对象时候报错转换失败 将json转对象的代码: String jsonStr = " ...