最佳调度问题
【问题描述】
       假设有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 }

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

 

作者:你的雷哥

本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。