文章目录
前言
你知道算法中的双机调度问题吗?当你学作为一名刚学c语言并且自学算法课程的学者时,你打算如何编程来解决双击调度问题呢?
一、问题来源
中国大学MOOC中的北京大学算法课程
1.网址https://www.icourse163.org/learn/PKU-1002525003?tid=1450408483#/learn/content?type=detail&id=1214976908&cid=1219230238&replay=true
二、计算程序
代码如下:
#include<stdio.h>
int main()
{
int a=0,c=1;//a用来控制次数的进行 c使情况随机改变
int time=0,timeF=0,min=0,timeA=0,timeB=0;//设置变量记录调度的时间,并记录一种情况中需要最大的时间(即总完成时间)
int s1=1,s2=2,s3=3,s4=6,s5=7,s6=10;//设置多个s变量代表各个任务,数值代表时间。
for(;a<=100000000;)//运行一亿次(可能不止,因为goto的跳转)为了使所有情况都计算到(“蛮力”算法)
{
timeA=s1+s2+s3;//timA和timeB的组成项固定**
timeB=s4+s5+s6;
if(timeA>timeB)time=timeA;
else time=timeB; //记录完成时间
if(c%3==0){s1=s1+s4,s4=s1-s4,s1=s1-s4;}//使用替换法替换s之间的值,产生多种情况(因为timA和timeB的组成项固定)
else if(c%4==0){s2=s2+s5,s5=s2-s5,s2=s2-s5;}//希望每一次变化无规律且不至于太大,所以我使用求余4,5,6,7。
else if(c%5==0){s3=s3+s6,s6=s3-s6,s3=s3-s6;}
else if(c%6==0){s4=s4+s5,s5=s4-s5,s4=s4-s5;}
else if(c%7==0){s5=s5+s6,s6=s5-s6,s5=s5-s6;}
if(time<timeF||a==0)timeF=time;//a==0使第一次timeF=time,使timeF不为零(初始化)
a++,c++;//使a变化计数进行次数,使c变化以至于s(1,2,3,4,5,6)值变化,以至于time(A,B)情况变化,以至于分配情况变化
}
min=timeF;//可能多余的一步,就是形式上表示一下,经过计算后我们得到了最小的任务完成时间。
printf("%d %d %d %d %d %d\n",s1,s2,s3,s4,s5,s6);//查看搭配情况(实际不一定正确,因为s各个数是一直在变)
printf("%d",min);//输出最小任务完成时间
return 0;
2.输出结果
6 3 10 1 2 7(仅代表最后的情况,正如程序注释所说,这里就是不正确的)
15
根据求平均数,我们可以知道答案是正确的(14.5与15非常接近)。(若想检查情况,可用if语句来输出为正确答案15时的搭配)
总结
这种随机改变加以大量计算以得搭配出所有情况的方法或许是一个路径,至少对于初学者的我是。本文对初学者编程提供了一个idea,或许它并不完善,但会是一个好的尝试。