您的位置:首页 > 其它

独立任务最优调度问题

2015-11-17 22:28 441 查看
#include "iostream"
#include "algorithm"
#include "fstream"
using namespace std;

bool ***p;
int *a;
int *b;

//返回数组a[1,n]中的最大值
int maxV(int a[], int n)
{
int mx = a[1];
for(int i=2; i<=n; i++)
if(a[i] > mx)
mx = a[i];
return mx;
}

int max(int a, int b)
{
return a > b ? a : b;
}

/*
p(i, j, k)表示前k个任务在a处理机不超过时间i,在b处理机不超过时间j内完成
p(i, j, k) = p(i-ak, j, k-1) || p(i, j-bk, k-1)  前提是i>=ak, j>=bk
p(i, j, 0) = 1
最短处理时间为 min{max{i, j}}
*/

//n为任务个数,mn为完成n个任务最长时间
int task(int n, int mn)
{
for(int i=0; i<=mn; i++)
for(int j=0; j<=mn; j++)
{
p[i][j][0] = true;
for(int k=1; k<=n; k++)
p[i][j][k] = false;
}
for(int k=1; k<=n; k++)
for(i=0; i<=mn; i++)
for(int j=0; j<=mn; j++)
{
if(i>=a[k])
p[i][j][k] = p[i-a[k]][j][k-1];
if(j>=b[k])
p[i][j][k] = (p[i][j][k] || p[i][j-b[k]][k-1]);
}
int opt = mn;
int temp;
for(i=0; i<=mn; i++)
for(int j=0; j<=mn; j++)
if(p[i][j]
)
{
temp = max(i, j);
if(temp < opt)
opt = temp;
}
return opt;
}

int main()
{
ifstream fin("task.txt");
int n;
fin >> n;
cout << "作业个数为:" << n;
a = new int[n+1];
b = new int[n+1];
cout << "\n各作业在机器a上的处理时间为:\n";
for(int i=1; i<=n; i++)
{
fin >> a[i];
cout << a[i] << " ";
}
cout << "\n各作业在机器b上的处理时间为:\n";
for(int j=1; j<=n; j++)
{
fin >> b[j];
cout << b[j] << " ";
}
int max1 = maxV(a, n);
int max2 = maxV(b, n);
int mx = max(max1, max2);  //单个作业完成任务所需时间最大值
int mn = mx * n;  //所有任务完成时间上限

//数组p申请空间
p = new bool**[mn+1];
for(i=0; i<=mn; i++)
p[i] = new bool*[mn+1];
for(i=0; i<=mn; i++)
for(j=0; j<=mn; j++)
p[i][j] = new bool[n+1];

cout <<"\n最短处理时间为:" << task(n, mn) << endl;

//释放空间
delete []a;
delete []b;
for(i=0; i<=mn; i++)
for(j=0; j<=n; j++)
delete []p[i][j];
for(i=0; i<=mn; i++)
delete []p[i];
delete []p;
fin.close();
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: