任务调度问题

来源:互联网 发布:淘宝组装电脑靠谱吗 编辑:程序博客网 时间:2024/05/21 10:33

在单处理器上具有期限和惩罚的单位时间任务调度问题,贪心算法求解。


#include <stdio.h>#define TASK_SUM 7#define MAX_DEADLINE 10#define MAX_WEIGHT 10int greedy_scheduling(int task_sum, int deadline[], int weight[], int sch_result[]);int test_task(int t, int task, int sch_result[], int deadline[], int sort_result[]);void main(){//initialization//int deadline[TASK_SUM];//int weight[TASK_SUM];int sch_result[TASK_SUM];int i,weight_sum;//test dataint deadline[7] = {4,2,4,3,1,4,6};int weight[7] = {70,60,50,40,30,20,10};printf("\n=========================================================\n");printf("We have %d tasks. The number of them are: \n",TASK_SUM);for(i=0; i<TASK_SUM; i++){printf("%3d ",i);}printf("\n---------------------------------------------------------\n");printf("Their deadlines are: \n");srand((int)time(0));for(i=0; i<TASK_SUM; i++){//deadline[i] = rand()%MAX_DEADLINE+1;printf("%3d ",deadline[i]);}printf("\n---------------------------------------------------------\n");printf("Their weight are: \n");for(i=0; i<TASK_SUM; i++){//weight[i] = rand()%MAX_WEIGHT+1;printf("%3d ",weight[i]);}printf("\n=========================================================\n");for(i=0; i<TASK_SUM; i++)sch_result[i] = TASK_SUM+10000;//a flag as unused//initialize finishedweight_sum = greedy_scheduling(TASK_SUM, deadline, weight, sch_result);printf("The max weight cost is %d .\n",weight_sum);printf("The scheduling result : \n");for(i=0; i<TASK_SUM; i++){printf("%3d ",sch_result[i]);}printf("\n=========================================================\n");int max_weight = 0;printf("\nIf replace the weight[i] with the max of weight \nsubtract weight[i], the new weight is :\n ");for(i=0; i<TASK_SUM; i++)if(weight[i] >= max_weight)max_weight = weight[i];for(i=0; i<TASK_SUM; i++){weight[i] = max_weight - weight[i];printf("%3d ",weight[i]);}weight_sum = greedy_scheduling(TASK_SUM, deadline, weight, sch_result);printf("The new max weight cost is %d .\n",weight_sum);printf("And the new scheduling result : \n");for(i=0; i<TASK_SUM; i++){printf("%3d ",sch_result[i]);}printf("\n=========================================================\n");return;}int greedy_scheduling(int task_sum, int deadline[], int weight[], int sch_result[]){int i,j;int temp_w,temp_d,temp_r;int time = 0;int sort_result[task_sum];int deadline_temp[task_sum];//for sortint weight_sum = 0;int weight_cost = 0;printf("\n---------------------------------------------------------\n");printf("\n--------------------processing---------------------------\n");for(i=0; i<task_sum; i++)sort_result[i] = i;//sort by weightfor(i=0; i<task_sum; i++)for(j=0; j<task_sum-i-1; j++){if(weight[j]<weight[j+1]){temp_w = weight[j];temp_d = deadline[j];temp_r = sort_result[j];weight[j] = weight[j+1];deadline[j] = deadline[j+1];sort_result[j] = sort_result[j+1];weight[j+1] = temp_w;deadline[j+1] = temp_d;sort_result[j+1] = temp_r;}}/*printf("\n\nafter sorting\n");for(i=0; i<task_sum; i++){printf("%3d ",sch_result[i]);}printf("\n\n\n");*/int t = task_sum-1;for(i=0; i < task_sum; i++){if(test_task(time, i, sch_result, deadline, sort_result)){sch_result[time] = sort_result[i];deadline_temp[time] = deadline[i];weight_cost += weight[i];time++;}else{sch_result[t] = sort_result[i];t--;}}printf("\n------------------------end------------------------------\n");printf("\n---------------------------------------------------------\n");//sort by deadlineprintf("\ntime = %d \n",time);for(i=0; i<time; i++)for(j=0; j<time-i-1; j++){if(deadline_temp[j] > deadline_temp[j+1]){temp_r = sch_result[j];temp_d = deadline_temp[j];sch_result[j] = sch_result[j+1];deadline_temp[j] = deadline_temp[j+1];sch_result[j+1] = temp_r;deadline_temp[j+1] = temp_d;}}for(i=0; i<task_sum; i++)weight_sum += weight[i];return (weight_sum - weight_cost);}int test_task(int t, int task, int sch_result[], int deadline[], int sort_result[]){int count;int i,j;sch_result[t] = sort_result[task];////printf("time = %d ,task = %d\n",t,task);for(i=0; i<t+1; i++){printf("%3d ", sch_result[i]);}printf("\n");for(i=0; i<t+1; i++){printf("%3d ", deadline[sch_result[i]]);}printf("\n");////for(i=0; i<t+1; i++){count = 0;for(j=0; j<t+1; j++){if(deadline[sch_result[j]] <= t)count++;}if(count > t)return 0;}return 1;}


0 0
原创粉丝点击