简单的双机调度程序设计


前言

你知道算法中的双机调度问题吗?当你学作为一名刚学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,或许它并不完善,但会是一个好的尝试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰望—星空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值