【回溯与分支限界法】最优调度问题

简介: 【回溯与分支限界法】最优调度问题

 一、问题如下:

问题描述:

       假设有 n 个任务由 k 个可并行工作的机器来完成。完成任务 i 需要时间为ti ,设计完成这 n 个任务的最佳调度算法,使得完成全部任务的时间最早。

编程任务:

       对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1,2,…,n。编程计算完成这n个任务的最佳调度。

输入样例:

       (第一行为任务数n,第二行为可并行工作的机器数k,第三行为机器完成任务i所需的单位时间)

10

7

67 45 80 32 59 95 37 46 28 20

输出样例:(第一行是完成所有任务的最优化时间)

95

二、回溯剪枝关键步骤

剪枝关键步骤一/代码中第15行:

              if(y>MaxNum) return;        //大于最大时间上限,放弃此调度安排;

剪枝关键步骤二/代码第21段:

               if(time[x]+MachineTime[i]<=MaxNum)        仍然是放弃大于MaxNum的调度安排。

三、代码如下:

#include <iostream>
#include <algorithm>//max()函数头文件 
using namespace std;
#define N 1000
//求最优化问题,即最小调度 
int MaxNum=100000;
int n;//任务数 
int k;//机器数 
int time[N];//存放任务时间 
int MachineTime[N]={0};//存放机器的运行时间 
void DFS(int x,int y){//x为已放入机器的任务数,y为目前耗费的最大时间 
  if(y>MaxNum) return;//大于最大时间上限,放弃此调度安排;(剪枝关键步骤1)
  if(x==n){//n个任务皆放入机器执行完毕 
    if(y<MaxNum) MaxNum=y; //(更新需要的最大调度时间MaxNum)
    return; 
  } 
  for(int i=1;i<=k;i++){//对k台机器遍历 
    if(time[x]+MachineTime[i]<=MaxNum){//(剪枝关键步骤二)
      MachineTime[i]=MachineTime[i]+time[x];//把任务x放入机器i执行 
      DFS(x+1,max(y,MachineTime[i]));//递归调用
      MachineTime[i]=MachineTime[i]-time[x];//回溯
    }
  }
  return;
}
int main(){
  cin>>n>>k; 
  for(int i=0;i<n;i++){//输入任务时间 
    cin>>time[i];
  }
  DFS(0,0);//调用 
  cout<<MaxNum<<endl;//输出 
  return 0;
}

image.gif


目录
相关文章
|
5月前
|
Python
求解带有限重的三维装箱问题——启发式深度优先搜索算法
求解带有限重的三维装箱问题——启发式深度优先搜索算法
103 4
|
5月前
|
算法 测试技术
综合回溯,剪枝,暴搜
综合回溯,剪枝,暴搜
|
6月前
|
存储 算法 Java
【算法设计与分析】— —实现最优载的贪心算法
【算法设计与分析】— —实现最优载的贪心算法
|
6月前
|
人工智能 算法 Java
【算法设计与分析】— —单源最短路径的贪心算法
【算法设计与分析】— —单源最短路径的贪心算法
|
6月前
|
设计模式 算法 知识图谱
算法设计与分析(贪心法)
【1月更文挑战第1天】在分析问题是否具有最优子结构性质时,通常先设出问题的最优解,给出子问题的解一定是最优的结论。证明思路是:设原问题的最优解导出子问题的解不是最优的,然后在这个假设下可以构造出比原问题的最优解更好的解,从而导致矛盾。(一个问题能够分解成各个子问题来解决,通过各个子问题的最优解能递推到原问题的最优解,此时原问题的最优解一定包含各个子问题的最优解,这是能够采用贪心法来求解问题的关键)贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择获得,即通过一系列的逐步局部最优选择使得最终的选择方案是全局最优的。
122 1
|
6月前
|
算法 Java C++
非启发式算法——二分、三分搜索算法
非启发式算法——二分、三分搜索算法
219 0
|
机器学习/深度学习 传感器 人工智能
【优化指派】基于禁忌搜索算法求解指派优化问题(耗时最短)附Matlab代码
【优化指派】基于禁忌搜索算法求解指派优化问题(耗时最短)附Matlab代码
|
存储 算法
【贪心法】最优分解问题
【贪心法】最优分解问题
423 0
【贪心法】最优分解问题
|
算法
【算法设计与分析】动态规划法与分治法、贪心法的区别
【算法设计与分析】动态规划法与分治法、贪心法的区别
302 0