出A(i,j)数组的值进行计算.如在123456排列中, 一76— 万方数据第一工序第五工段的时问数据是35(血D前表格所示),即A(1,5)=35。
而在125436排列中,第一工序第---r”段的数据应该也是35,而此时j等于3。
那么我们怎样用这个3,把数据35调出来呢7幸好VisualBasic给了我们一个截取字符串函数Mid(),让我们得以完成这项工作。
如A(1,Val(Mid(125436,j,1))),它的意思是把字符串“125436”中第j个字符取一个出来作为数组A(1,j)的另一个下标,如果是取第3个字符,则应该是5,即A(1,Val(Mid(125436,3,1)))=A(1,5)=35。
这样我们就完成了排列后的数据归位。
在使用这个程序的时候,应当根据实际情况输入数据A(i,j)。
如果是八个工段五道工序,则应当输入5*8—40个数据。
相应的MN的值改成MN=12345678。
在对话框中输入m、n、和MN。
最后要说明的是:(1)本程序还在第二个列表框中,列出对应于最短工期的所有排列。
以便于在最短工期的前提下,找到一个适合具体情况的施工顺序。
(2)由于每个列表框只能容纳32736个数据,当m=9的时候数据问达到362880个,故在计算按钮下安放了十二个列表框(见界面)。
(3)第十四列表框中列出的最长施工工期及排列顺序,仅作对照。
(4)此程序可计算的范围是,工段数不能超过九,而工序的道数不受限制。
不过,若计算机的容量足够的话,应用十六进制的数,则工段数的计算范围可以增加到十五。
就一般情况而言,九个工段已经足够。
如果再增加工段,计算机的计算时间恐怕不会仅以小时来计算了。
(5)使用这个程序,必须在VisualBasic的系统环境下进行。
源程序清单如下: Dim Min#,n%,m%,MV&,GQ(1T0362880)As Double Private Sub Command 1--Click() Dim MN&,MC&,MB%,MX%,MY%,MZ%,A(1T09,1T09)As Integer,B(0T09。
0T09)AsInteger A(1,1)=25:A(1,2)=20:A(1,3)=15:A(1,4)一30:A(1,5)=35:A(1,6)一44: A(2,1)=12:A(2,2)=15:A(2,3)=11:A(2,4)一8:A(2,5)=6:A(2,6)=4: A(3,1)=18:A(3,2)一25:A(3.3)=24:A(3,4)=10:A(3,5)=24:A(3,6)一16: m—InputBox(“请输入施工段数m”,“输人数据”,,2000,4000) n—InputBox(“请输入施工工序数n”,“输入数据”,,2000,4000) MN=InputBox(“请按1234……的顺序输入一个m位数。
(m是施工段数)”,“输入数据”,,2000,4000) MV=1 For j=1 To m MV=MV。
j Next j For k=1 To MV For i=1 To n For j=1 To m B(i,j)=IIf(B(i--1,j)>B(i,j一1),B(i—l,j),B(i,j~1))+A(i,Val(Mid(MN,j,1))) Next j Next i GQ(k)=B(i一1,j一1)&MN If k<=32736 Then Listl.AddItem(GQ(k))’一个列表框中只能容纳32736行数字。
Elselfk<=65472 Then List2.Addhem(GQ(k)) Elselfk<=98208 Then List3.Addhem(GQ(k)) Elselfk<=1 30944 Then List4.Addhem(GQ(k)) Elselfk<=1 63680 Then List5.Addhem(GQ(k)) Elselfk<=196416 Then List6.Addhem(GQ(k)) Elselfk<=229152 Then Li