多机调度问题

 

一、问题分析

1、问题描述

多机调度问题是生产管理与控制的一个基本问题。按照加工设备数量和加工作业的流云方式,一般可分为单机调度、并行机调度、Flowshop调度、可重入式调度和Jobshop调度会多种类型。作业调度中的许多问题,不仅具有随机性、约束复杂、规模大及多目标冲突等点,而且许多都属于NP完全问题,即使在单机情形也是如此。因此,如何寻求有效可行的度求解方案,一直是生产管理与控制研究的热点和难点。多机调度问题是个NP完全问题,到目前为止没有有效的算法(求得最优解的有效的算法),但是利用贪心算法可以近似求出最优解,采用最长处理时间作业优先的贪心选择策略,可以设计出较好的解。在n<m时,我们大可以为每个作业分配一台机器,而在n>m时,我们选择将所有的作用按处理时间从大到小排序,按照这个顺序给每个作业分配最先空闲的机器。对于每一个任务i,m个机器都可以选择执行或不执行,对于每一种情况进行递归回溯,在这个过程中更新最优解,剪枝策略:默认完成全部任务的时间为最长时间即best=INF,当执行当前任务需要的时间小于best时进行回溯,否则不进行递归出口,当回溯到第n个任务时结束,更新最优解

2、提出问题

设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工处理。作业i所需时间为Ti. 约定:任何作业可以在任何一台机器上加工处理,但未完工前不允许中断处理,任何作业不能拆分成更小的子作业。要求给出一种作业执行次序,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。

3、问题要求

随机生成n个作业相关信息,并计算由m台机器处理的最短时间。

二、算法思想

1、设计思路

(1)搜索从开始节点(根节点)出发,以深度优先搜索搜索整个解空间。

(2)每搜索完一条路径则记录下T和best序列,开始结点就成为一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处向纵深方向移至一个新结点后并成为一个新的活结点,也成为当前扩展结点。

(3)如果在当前的扩展结点处不能再向纵深方向扩展,则当前扩展结点就成为死结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点;直至找到一个解或全部解。

  1. 问题的解决方案

贪心法求解多机调度问题的贪心策略是最长处理时间作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。按照最长处理时间作业优先的贪心策略,当m≥n时,只要将机器i的[0,ti)时间区间分配给作业i即可;当m<n时,首先将n个作业依其所需的处理时间从大到小排序,然后依此顺序将作业分配给空闲的处理机。

回溯法可称为通用的解题法。回溯是一个带有系统性又带有跳跃性的搜索算法,用它可以系统地搜索-一个问题的所有解或任意解。对于用回溯法求解的问题,首先要将问题进行适当的转化,得出状态空间树。这棵树的每条完整路径都代表了一种解的可能。通过深度优先搜索这棵树,枚举每种可能的解的情况;从而得出结果。但是,回溯法中通过构造约束函数,可以大大提升程序效率,因为在深度优先搜索的过程中,不断的将每个解(并不一定是完整的,事实上这也就是构造约束函数的意义所在)与约束函数进行对照从而删除一些不可能的解,这样就不必继续把解的剩余部分列出从而节省部分时间。

最终我们解决此问题用的是回溯法,回溯法有如下好处:

  1. 它在包含问题的所有解的空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间的任--结点时,总是先判断该结点是否肯定不包含问题的解。如果不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。

    2.回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都要被搜索遍才结束。而回溯法在用来求问题的任意解时,只要搜索到问题的一一个解就可以结束。这种以深度优先的方式系统地搜索问题的解算法适用于解一-些组合数较大的问题。
    3.回溯法对解空间做深度优化搜索,因此,在一般情况下用递归法实现回溯法。


三、算法设计

1.设计方案

从n个作业中找出有最小完成时间和的作业调度,所以批处理作业调度问题的解空间是一棵排列树。按照回溯法搜索排列树的算法框架,设开始时t=[1,2, ... , n]是所给的n个作业的完成时间,则相应的排列树由t[1:n]的所有排列构成。

数组len[]用于存储一组空间解,comp()函数用于计算一个完整调度的完成时间,search()函数用来做搜索,best记录相应的当前最佳作业调度完成时间。

当dep>n时,算法搜索至叶子结点,得到一个新的作业调度方案。此时算法适时更新当前最优值和相应的当前最佳调度。

当dep<n时,若当前扩展结点位于排列树的第(n-1)层,此时算法选择下一个要安排的作业进行搜索且向第(n-2)层回溯,以深度优先方式递归的对相应的子树进行搜索,对不满足上界约束的结点,则剪去相应的子树向第(n-2)层回溯。

2.算法分析

其实回溯法的本质就是将所有的运行路线都安排一遍;而且安排的时候使得在逻辑上构成一个树状结构;再通过相应的特征量或者函数来修剪这颗“树”;可以快速排除一些明显得不到最优解的分配路径;使得更加快速的得到最优解。
因为有n个任务需要分配,而且每一个任务的分配都可以选择m个机器中的任意一个;故所有可行解在逻辑上构成的“树”状结构有n层,每一个结点有m个分支;因此我们需要记录下每一个支路累计的时间,在每次分配完时,选出其中一个最小的累计时间作为局部最优解;再使用递归遍历所有的情形,最终得到整体最优解,即完成全部任务的最短时间。

  1. 核心思想

回溯法是从初始状态出发,在隐式图中以深度优先的方式搜索问题的解。当发现不满足求解条件时就回溯,尝试其他路径,即“能进则进,进不了则换,换不了则退”的基本搜索方法。

3.运行代码

#include<stdio.h>

int n=9,k=4,best=1000000;

int len[99];

int t[99]={5,10,3,5,12,23,67,1,4,};

int comp(){

int tmp=0;

for(int i=0; i<k; i++)

if(len[i]>tmp)

tmp=len[i];

return tmp;

}

void search(int dep,int *len,int *t){

if(dep==n) {

int tmp=comp();

if(tmp<best)

best=tmp;

return;

}

for(int i=0; i<k; i++) {

len[i]+=t[dep];

if(len[i]<best)

search(dep+1,len,t);

len[i]-=t[dep];

}

}

int main(){

int i;

for (i=0; i<k; i++)

len[i]=0;

search(0,len,t);

printf("最短时间为:%d\n",best);

return 0;

}

 

  1. 运行结果

 

 

2.算法思路

 

心得体会:在整理实验报告的过程中,我们对我们的选题进行了深度的分析,并找出适合的解决方案。每个人对多机调度的算法都存在着一定的理解,这也就是很多同学的算法实现不同的原因。很有可能是自己理解的不够透彻,我们认为我们的实验设计还不够完善,直接原因就是我们自己对c语言的掌握还不够深,做这个实验的过程中有时还会觉得我们自己的想法与实现的算法存在着很大差距。同时,通过这个实验在很大程度上还增进我们的合作能力,并且对于算法程序设计回溯法有了深刻的了解。

 

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值