算法导论-任务调度问题

问题描述:
在单处理器上具有期限和惩罚的单位时间任务调度问题(课本P239)
实验要求:
(1)实现这个问题的贪心算法
(2)将每个 wi 替换为max{m1,m2…mn}—wi,运行算法比较结果。

解题思路:
1.先将任务按照时间惩罚递减顺序进行排序,
2.然后用贪心的思想,尽量把惩罚重的任务先放入待完成队列中。
这里我是用了一个fla数组进行标记的,先试着把任务期限为d的任务放入fla数组的第d个位置上,若该位置为1,说明这个位置已经被使用了,那么往前面进行查找,看在完成期限之前,有没有空的位置可以放进去。

#include 
#include 
#include 
#include 
#include 
using namespace std;
#define n 6
typedef struct{
    int id;
    int d;
    int w;
}task;
bool cmpW(task t1,task t2){
    return t1.w>t2.w;
}
bool cmpD(task t1,task t2){
    return t1.dsrand((unsigned)time(NULL));
    for(int i=0;i1;
        t[i].d=rand()%n+1;
        t[i].w=rand()%30;
    }
}
void copy(task &t1,task &t2){
    t1.id=t2.id;
    t1.d=t2.d;
    t1.w=t2.w;
}
int greedy(task a[],task ta[],int &ans){
    int num=0,i,j;//当前已经完成的任务数量
    sort(ta,ta+n,cmpW);
    int fla[9999];
    memset(fla,0,sizeof(fla));
    for(i=0;ifor(j=ta[i].d;j>0;j--){
            if(fla[j]==0){
                fla[j]=1;
                break;
            }
        }
        if(j>0){
            copy(a[num++],ta[i]);
            ans-=ta[i].w;
        }
    }
    return num;
}
int main()
{
    task ta[n],a[n];
    printf("正在随机生成n(%d)组数据...\n",n);
    random_init(ta);
    printf("生成的数据为:\n");
    int ans=0,maxx=-1;
    for(int i=0;iprintf("ID:%d,期限:%d,惩罚:%d\n",ta[i].id,ta[i].d,ta[i].w);
        ans+=ta[i].w;
        if(ta[i].w>maxx)
            maxx=ta[i].w;
    }
    int k=greedy(a,ta,ans);
    printf("任务惩罚为:%d\n",ans);
    sort(a,a+k,cmpD);
    printf("将完成执行的任务按照时间递增顺序排列输出:\n");
    for(int i=0;iprintf("ID:%d,期限:%d,惩罚:%d\n",a[i].id,a[i].d,a[i].w);
    }

    //若将每个wi替换为max{m1,m2...mn}—wi,改变惩罚值再求一次
    ans=0;
    for(int i=0;iprintf("\n改变惩罚值后输出各任务数据\n");
    for(int i=0;iprintf("ID:%d,期限:%d,惩罚:%d\n",ta[i].id,ta[i].d,ta[i].w);
    }
    k=greedy(a,ta,ans);
    printf("改变惩罚值后的任务惩罚为:%d\n",ans);
    sort(a,a+k,cmpD);
    printf("将完成执行的任务按照时间递增顺序排列输出:\n");
    for(int i=0;iprintf("ID:%d,期限:%d,惩罚:%d\n",a[i].id,a[i].d,a[i].w);
    }
    return 0;
}

测试运行结果如下:

算法导论-任务调度问题_第1张图片

你可能感兴趣的:(编程综合)