《生产系统仿真应用教程PlantSimulation》周金平Johnson算法代码写错了的源代码:
is
i,j,m,n,y : integer;
do
y := Jobs.ydim;
m := 1; n := y;
for i:=1 to y loop
if Jobs[7,i]<=Jobs[8,i] then -- ÄÉÈëP×é
Jobs[6,i] := m;
m:=m+1;
else -- ÄÉÈëQ×é
Jobs[6,i] := n;
n:=n-1;
end;
next;
Jobs.sort(6,"up");
for i:=1 to y-1 loop
for j:=i+1 to y loop
if Jobs[7,i]<=Jobs[8,i] then -- P×é
if Jobs[7,i]>Jobs[7,j] then -- µÝÔöÅÅÁÐ
m:=Jobs[6,i]; -- ½»»»Êý¾ÝλÖÃ
Jobs[6,i]:=Jobs[6,j];
Jobs[6,j]:=m;
Jobs.sort(6,"up");
end;
else -- Q×é
if Jobs[8,i]
今晚刚编写好的正确的,能跑的代码,直接替换上述的代码(在Johnson方法里面)就行。
var i,j,m,n,y,tmp : integer
y := Jobs.ydim
m := 1
n := y
for i:=1 to y loop
if Jobs[7,i]<=Jobs[8,i] then -- 纳入P组
Jobs[6,i] := m
m:=m+1
else -- 纳入Q组
Jobs[6,i] := n
n:=n-1
end
next
m:=m-1
n:=n+1
print "m=",m --标记前m个数字在P组
print "n=",n --标记前n个数字在Q组
Jobs.sort(6,"up")
for i:=1 to m loop -- P组
for j:=1 to m-i
if Jobs[7,j]>Jobs[7,j+1] then -- 递增排列
tmp:=Jobs[6,j]; -- 排序
Jobs[6,j]:=Jobs[6,j+1]
Jobs[6,j+1]:=tmp
Jobs.sort(6,"up")
end
next
next
for i:=n to y loop --Q组
for j:=n to y-(i-n+1)
if Jobs[8,j]
为什么说有问题,事出有因:
上作业:
Johnson算法:
1)列出n个作业在两台机床上的作业时间;
2)根据作业时间将n个作业分成P和Q两组。分组原则是:P组的作业在第二台机器上的加工时间比在第一台机器上加工时间长;其余作业为Q组;
3)将P组作业按他们在第一台机器上加工时间递增顺序排列,将Q组作业按他们在第二台机器上加工时间递减的顺序排列。
4)将P组作业顺序和Q组作业顺序连接在一起,构成的就是生产周期最短的最优作业顺序。
得到笔算的结果是
J4 J2 J3 J5 J1 总时长26
下面是我写的部分代码跑出来的结果:
再看看把数据放入随书代码
跑出来的结果,很明显,相同的数据随书源码跑出来的却是30,很明显错了:
先别急,你可能会好奇为什么周老师随书的数据例程的数据跑出来的答案确实是对的呢?好吧,其实是因为他的上述源代码有逻辑错误,后面的冒泡排序的时候有问题-----估计是因为他写书的时候时间紧任务大,只手写验证了他的这个例子(而他这个错误的代码偏偏能够跑出来这个特殊例子的结论!),而做作业的我刚好用另外一个例子发现他的这个错误,重新写的代码。
至于具体的错误是什么,感兴趣的话,跟着代码笔算一次就知道了,我看他的不能用,就自己写的,如果想研究就F11调试F10步进F12变量跟踪看吧。
验证我的代码正确性的方法:就是用周金平老师书上的例子跑一边,发现我写的代码的结果和书上的一样,56.
PS:
想表达一句话,什么《数据结构》代码可视化的,简直在PlantSimulation一览无遗!看着Table进行矩阵的步进,完全明白各种排序算法可视化的原因,树和图论算法导入CAD图然后看着摆好的全局变量放在图上步进算法,可视化程度简直静美得令人发指,大赞!!!
先不吐槽这个Simtalk2.0和Simtalk1.0不兼容问题让初学者看着教程打代码都不能直接运行,各种不兼容的各种难受问题,我只想说,新语法的确方便好看很多。
附上我学习PlantSimulation的笔记
好吧,其实我还有很多文件,但是不方便放上去笔记本,需要的自己找相关的线上资源,微信资源,随书教程以及QQ群文件吧。