回溯法经典例题(四):java解批处理作业调度_批处理作业调度(回溯法)java-程序员宅基地

技术标签: 算法  java  回溯法  数据结构  

批处理作业调度

问题描述

每一个作业Ji都有两项任务分别在2台机器上完成。每个作业必须先有机器1处理,然后再由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理时间。则所有作业在机器2上完成处理时间和f=F2i,称为该作业调度的完成时间和。此时要找出最小的完成时间和
给出一个例子:
在这里插入图片描述

算法分析

根据问题描述可知,需要计算出每个作业在机器二完成的时间,计算例子如下(以下以作业调度为1.2.3为例)
在这里插入图片描述
由上图可知
作业1在机器2完成处理时间是3
作业2在机器2完成处理时间是6(要算上前面作业1在机器2处理时占用的时间)
作业2在机器2完成处理时间是10
因此完成时间和是19

从例子中可以看出需要变量m[][](各个作业在机器一机器二的处理时间),f1(机器一的处理时间),f2[i](第i个作业在机器二的处理时间),f(完成时间和),通过比较f1和f2[i-1],取其大加上该作业在机器二的处理时间成为f2[i]

定义解空间

各个作业的不同排列就是该题的解空间
例题的解空间为{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}

确定解空间结构

由例题可知,该解空间结构为排列数

剪枝函数

因为要找出最小的,所以在不可能出现最优解的时候即可进行剪枝,所以只需f<bestf即可

代码实现

package FlowShopProblem;
import java.util.Scanner;
public class FlowShop {
    
	//以下涉及到数组的变量,第一个元素即第0个都是不会用到的,所以数组元素个数都需+1
	
	int n;//作业个数
	int f;//当前作业完成时间总和
	int bestf;//当前最优完成时间和

	int[] x;//当前作业调度
	int[] bestx;//最优作业调度
	
	int[][] m;//各个作业需要的时间
	int f1;//机器一处理的时间
	int[] f2;//机器二处理的时间
	
	public FlowShop(int n,int[][] m){
    //完成数据的初始化
		this.n=n;
		this.m=m;
		f1=0;
		f=0;
		bestf=10000;//给定初始值
		bestx=new int[n+1];
		x=new int[n+1];
		//初始化,x[i]为原始排序
		for(int i=1;i<=n;i++){
    
			x[i]=i;
		}
		f2=new int[n+1];
	}
	
//在Java中交换数组的两个元素下标位置不能直接进行交换
//要通过引用来交换,直接交换没有指向同个对象(数组)
	private void swap(int[] x,int i, int j) {
    
		int temp=x[i];
		x[i]=x[j];
		x[j]=temp;
	}
	
	public void backtrack(int t) {
    
		if(t>n) {
    //此处不需要再次判别f<bestf,因为在进行backtrack(t+1)前就已经判别了
			for(int i=1;i<=n;i++) {
    
				bestx[i]=x[i];
			}
			bestf=f;
		}
		else {
    
			for(int j=t;j<=n;j++) {
    
				f1+=m[x[j]][1];
		        f2[t]=((f2[t-1]>f1)? f2[t-1]:f1)+m[x[j]][2];//特别注意在当t=1时,f2[t-1]需赋值为0,这也是为什么不从第一个元素记录实际数据
		        f+=f2[t];
		        if(f<bestf) {
    
		        	swap(x,t,j);
		        	backtrack(t+1);
		        	swap(x,t,j);
		        }
		        f1-=m[x[j]][1];
		        f-=f2[t];
			}
		}
	}
	public static void main(String[] args) {
    
		System.out.println("请输入作业个数:");
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int[][] m= new int[n+1][3];//m的下标从1开始,因此第一行的0和每一行第一列的0无用
		System.out.println("请输入作业在机器一和机器二的处理时间\n(第一行全输入0,每一行第一列输入0)");
		for(int i=0;i<m.length;i++)
			for(int j=0;j<3;j++)
				m[i][j]=sc.nextInt();
		FlowShop f=new FlowShop(n,m);
		f.backtrack(1);
		System.out.println("最优批处理作业调度顺序为:");
		for(int i=1;i<=n;i++)
			System.out.print(f.bestx[i]+" ");
		System.out.println();
		System.out.println("最优调度所需的最短时间为:\n"+f.bestf);
	}

}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sc2333/article/details/106329082

智能推荐

【最详细|附源码】Visual C++(VC)6.0最新安装教程_visual c++安装教程-程序员宅基地

文章浏览阅读1.4w次,点赞14次,收藏78次。软件:Visual C++版本:6.0语言:简体中文大小:34.26M安装环境:Win11/Win10/Win8/Win7硬件要求:[email protected] 内存@4G(或更高)下载通道①百度网盘丨下载链接:提取码:dg2n[更多软件]:点击进入管家「软件目录」!_visual c++安装教程

新路由3 高恪魔改固件+底包_新路由3高恪5.0nat1-程序员宅基地

文章浏览阅读2.7w次,点赞2次,收藏8次。新路由3 newifi3 d2 高恪魔改固件,请在breed中先刷入底包,然后启动路由器进入底包系统后,再在底包系统里面网页web升级固件,选择魔改进行升级,切记必须这样操作。压缩包包含了底包和固件解压密码 123下载地址:https://u13909188.pipipan.com/fs/13909188-384246318..._新路由3高恪5.0nat1

戳破“砖家”假面:唯快不破的时代,为什么这件事一定要慢慢做?-程序员宅基地

文章浏览阅读298次。导读:我们生活在一个嘈杂、混乱的世界中。生活中,我们有很多“权威”和“专家”,他们标榜自己是内行人,宣称自己掌握着该领域的真理,而我们需要做的只有两个字——接受。但事实上..._唯快不破的人为什么定

初始化时checkbox选中问题-程序员宅基地

文章浏览阅读746次。首先我们大家在写页面的时候可能回经常遇到checkbox、radio等一些使选中或者是不选中的问题。这是我在项目当中做的时候发现的一个小知识点,把它赶紧记录下来。以便以后复习与巩固。 现把代码写出来再解释: function operateCheckOrRadio() { var sForm = document.getElementById("sform"); var sStatus = d..._flutter checkbox用变量初始化无法设置为选中状态

UE5——问题——MediaPlayer的使用播放视频注意点_ue mediaplayer-程序员宅基地

文章浏览阅读1.1k次。UE5——问题——MediaPlayer的使用播放视频注意点_ue mediaplayer

毕设仿真分享 单片机非接触式红外感应体温计-程序员宅基地

文章浏览阅读311次,点赞9次,收藏7次。非接触式电子体温计主要利用红外测温原理,一切温度高于绝对零度(-273.35℃)的物体,由于分子热运动,物体会不停地向外辐射能量。物体辐射能量的大小与它的表面温度有十分密切的关系。因此,通过测量物体辐射的能量,就能够测量出物体的温度。本用户手册中的非接触式电子体温计就是利用这种测量方法,实现测量人体体温的功能。

随便推点

程序员的自我评价_程序员自我评价-程序员宅基地

文章浏览阅读4.4k次,点赞2次,收藏2次。篇一:程序员简历自我评价程序员简历自我评价本人勤奋踏实,工作认真负责,自学能力强;性格开朗,容易与人相处,注重团队协作精神,且能承受较大压力。注重专业基础学习和实践能力的培养,在校期间不仅做过多个课程设计暑假期间也去过单位实践过,对java编程和网站开发具有浓厚的兴趣。篇二:优秀的程序员自我鉴定优秀的程序员自我鉴定以下一篇是一名优秀并且有工作经验的程序员的自我鉴定范文:大家好,我叫xxx。我性格开朗,乐于与人交往,诚实,正直,有教强的上进心,较强的学习能力,在学校团学会的工作使我组织_程序员自我评价

vue的vue-resource和axios介绍_vue-resuorce-程序员宅基地

文章浏览阅读1.2k次,点赞26次,收藏14次。vue的vue-resource和axios介绍_vue-resuorce

MySQL笔记复习(实例 全)_在 goods_name 列上加普通索引-程序员宅基地

文章浏览阅读907次。mysql复习一:复习前的准备1:确认你已安装wamp2:确认你已安装ecshop,并且ecshop的数据库名为shop二 基础知识:1.数据库的连接mysql -u -p -h-u 用户名-p 密码-h host主机2:库级知识2.1 显示数据库: show databases;2.2 选择数据库: use dbname;2.3 创建数据库_在 goods_name 列上加普通索引

敏捷软件开发宣言-程序员宅基地

文章浏览阅读507次。敏捷软件开发宣言 摘要:我们正在通过亲身实践以及帮助他人实践,揭示更好的软件开发方法。通过这项工作,我们认为: 个体和交互 胜过 过程和工具 可以工作的软件 胜过 面面俱到的文档 客户合作 胜过 合同谈判 响应变化 胜过 遵循计划虽然右项也具有价值,但我们认为左项具有更大的价值。Kent Beck James Grenning Robert C._敏捷软件开发宣言

Android实现通用的ActivityGroup(效果类似Android微博客户端主界面)-程序员宅基地

文章浏览阅读93次。转自http://www.cnblogs.com/answer1991/archive/2012/05/08/2489844.html ActivityGroup在实际的开发中是十分常见的,在我使用过的Android应用中,十个应用里面有九个应用的主界面都是使用ActivityGroup的。说起ActivityGroup,在国内好像直接使用它开发的并不多,基本都是使用Ta..._android 类似于微博tab,动态添加tab,并实现拖拽排序,编辑等

git:一、GIT介绍+安装+全局配置+基础操作_请确保本地完成了 git 的全局配置-程序员宅基地

文章浏览阅读490次。仅供学习使用。执行命令git init,发现文件夹出现.git目录即说明创建本地仓库成功。创建的文件名为空,拓展名是bashrc,所以要开启文件的拓展名选项并检查该文件的格式是否为Bash RC源文件。工作区的文件创建或修改后通过git add提交到暂存区,暂存区的文件通过git commit提交到仓库。创建一个测试用的文件夹,进入后右键打开Git Bash,设置用户信息。ATT:红色的是工作区的文件,绿色的是暂存区的文件。GIT的流程分为三大块:工作区、暂存区、仓库。_请确保本地完成了 git 的全局配置