入新的施工段的时间应取前两个时问的较大值。
我们用了一个IIF函数来完成这个工作.下一个关键问题是,在用For Next循环语句时,每计算一次都要用到上面所说的某一个较大值,这些较大值共有3(三道工序)’6(六个施工段)=18‘个,我们用了一个B(i,j)数组。
其中i等于3,j等于6.这个数组事先并不赋值,只是在循环计算的时候,边计算、边赋值、边调用。
又由于为简化程序,我们在句子中用到了i~1和j—l的下标,于是我们在定义B(i,j)数组的下标下界时让i等于0,否则将会溢出.另一个二维数组A(i,j)就是工程的实际数据,是需要事先赋值的。
譬如,我们把前面数据表中的数据赋给A(i.j).在赋值时,注意要让i表示工序数,让j表示施工段数。
最后一个关键问题就是在计算的时候如何根据新的排列调出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 List7.Addhem(GQ(k)) Elselfk<=261888 Then List8.Addhem(GQ(k)) Elselfk<=294624 Then 一77— 万方数据 List9.Addhem(GQ(k)) EiseIfk<=327360 Then Listl0。
Addltem(GQ(k)) ElseIfIc<=360096 Then Listll:AddItem(GQ(k)) Elselfk<=392832 Then Listl2.Addltem(GQ(k)) End If Al MN=MN+9 MC=1 Forj=l To m MC=-MC。
Val(Mid(MN,j.1)) Next j lfMV<>MC Then Go To A Else End If MB=0 MX=0 For j=l T0 rn MB=MB+j MX=MX+Val(M.d(MN.j。
1)) Next j lfMB<>MX Then GoTo A Else End If MY=0 MZ一0 For j一1 To m MY—MY+j‘2 MZ=MZ+Val(Mid(MN.j,1))‘2 Next i IfMY<>MZ Then GoTo A EIse End If Next k Print Spc(6);”第m!个排列应是最大数,据此可以判断结果的正确性。
一 Print Spc(6)I”GQ(”;MV;”)=”;GQ(MV) End Sub Private Sub Command2wClick() Min=InputBox(”请输入初始比较数据,其值比列表框中最小一个稍大即可一,一输入数据一,,2000,4000) For k=l To MV Min=Ilf(Min<GQ(k),Min,GQ(k)) Next k For k=l To MV If Int(GQ(k)/10‘ITI)=Int(Min/10‘m)Then Listl3.AddItem(GQ(k)) Else E:nd If 一78—万方数据 Next k End Sub Private Sub Command3--Click() For k=1 To MV Max=11f(Max>GQ(k),Max,GQ(k)) Next k For k=1 To MV IfInt(GQ(k)/10‘m)=Int(Max/10‘m)Then Listl4.Add
上一篇:
过程控制工程虚拟实验系统的设计与开发
下一篇:
计算机网络毕业论文