最佳调度问题_分支限界法

Posted henuliulei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最佳调度问题_分支限界法相关的知识,希望对你有一定的参考价值。

最佳调度问题
【问题描述】
       假设有n个任务由k个可并行工作的机器完成。完成任务i需要的时间为ti。试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早。
【编程任务】
       对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1~n。编程计算完成这n个任务的最佳调度。
【输入样例】
7  3
2  14  4  16  6  5  3
【输出样例】
  17

即此问题为七个任务,三台机器。

首先列个七乘三的二维数组了解算法思路:

技术分享图片

 

我们知道回溯法其实是穷举法加剪枝函数,我们的函数用到递归,层层返回。一共七层,每层的除去叶子节点都有三个孩子

每搜索到叶子节点就更新一次maxnum值(小于maxnum则更新)(初值为一个较大的数),是用一次搜索结束后三个机器中花费时间最长的机器的所用时间作为此次分配的所用时间,。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,k;
 4 int x[100];//机器
 5 int x1[100];//作业
 6 int maxnum=1000000;
 7 
 8 void task(int level)
 9 {
10     if(level>n){
11      int temp=0;
12      for(int i=1;i<=k;i++){
13         if(x[i]>temp){
14             temp=x[i];
15         }
16      }
17      if(temp<maxnum){
18         maxnum=temp;
19      }
20     }
21     else{
22         for(int i=1;i<=k;i++){
23             x[i]+=x1[level];
24             task(level+1);
25             x[i]-=x1[level];
26         }
27     }
28 }
29 int main()
30 {
31     cin >> n;
32     cin >> k;
33     for(int i=1;i<=n;i++){
34         cin >>x1[i];
35     }
36     task(1);
37     cout << maxnum;
38     return 0;
39 }

技术分享图片

 

以上是关于最佳调度问题_分支限界法的主要内容,如果未能解决你的问题,请参考以下文章

回溯法与分支限界

回溯法与分支限界

算法与程序设计:分支限界法

回溯法与分支限界

回溯法与分支限界

布线问题(分支限界法)