关闭

独立任务最优调度问题

214人阅读 评论(0) 收藏 举报
分类:
#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][n])
            {
                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;
} 

这里写图片描述

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:325280次
    • 积分:10825
    • 等级:
    • 排名:第1692名
    • 原创:786篇
    • 转载:45篇
    • 译文:4篇
    • 评论:119条
    最新评论