算法分析与设计-独立任务最优调度问题实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计实验报告题目:独立任务最优调度问题
年月日
一、实验题目
独立任务最优调度问题
二、实验目的
问题描述:用2 台处理机A和B处理n个作业。设第i个作业交给机器A 处理时需要时间a i,若由机器B来处理,则需要时间b i。由于各作业的特点和机
器的性能关系,很可能对于某些i,有a i=>b i,而对于某些 j,j≠i,有a j
既不能将一个作业分开由 2 台机器处理,也没有一台机器能同时处理2 个作业。设计一个动态规划算法,使得这2台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停工的总时间)。研究一个实例:(a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2);(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)。
三、实验内容
算法设计:对于给定的两台处理机A和B处理n个作业,找出一个最优调度方案使两台机器处理完这n个作业的时间最短。
数据输入:由文件input.txt提供输入数据。文件的第一行是一个正整数n,表示要处理n个作业。在接下来的2行中,每行n个正整数,分别表示处理机A和B处理第个作业需要的处理时间。
结果输出:将计算出的最短处理时间输出到文件output.txt。
输入文件示例输出文件示例
input.txt output.txt
6 15
2 5 7 10 5 2
3 8
4 11 3 4
四、实验原理
首先要注意每个作业仅需要处理一次就行,不需要被机器A和B各处理一遍
采用动态规划;定义t[i][j]为:表示完成i个作业且机器A花费j时间的条件下机器B所花费时间的最小值,那么t[i][j] = min{t[i-1][j] + b[i], t[i-1][j-a[i]]}。
假设前i-1件已经被处理了,那么第 i 件作业由谁来处理可以分两种情况:
1)由机器A处理i,则机器B的时间为 t[i-1][j-a[i]];
2)由机器B处理i,则机器B的时间为 t[i-1][j]+b[i];
3)特殊情况,如果j < a[i],则不可能由机器A来完成,此时t[i][j] = t[i-1][j]+b[i];
最终t[i][j] 选择1)和2)中较小的一个,即t[i][j] = min{t[i-
1][j]+b[i], t[i-1][j-a[i]]}。
五、实验步骤
1)实验环境:Microsoft Visual Studio 2010
2)编写代码,在程序文件夹下建立input.txt,output.txt,输入题目,不断调试运行。
3)实验代码
#include
#define N 100
int main()
{
int i,j,n;
int sum=0;
int a[N]={0},b[N]={0},t[N][N]={0};
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d",&n);
for(i=0;i scanf("%d",&a[i]); sum+=a[i]; } for(j=0;j scanf("%d",&b[j]); } for(i=1;i<=n;i++) { for(j=0;j<=sum;j++) {