线性规划VB求解

ぃ、小莉子 提交于 2019-12-09 23:02:24

线性规划VB求解

Rem 定义动态数组
Dim a() As Single, c() As Single, b() As Single, cb() As Single
Dim aa() As Single, cba() As Single, xcb() As Integer, xb() As Integer
Dim m As Integer, n As Integer, l As Integer, k As Integer, cc As Integer, cm As Integer, ka As Integer
Dim qq As Single, tt As Single, z As Single

Private Sub Command1_Click()

Show
n = Val(InputBox("请输入线性规划典范型方程变量的个数 N=?", "输入数据", 0))
m = Val(InputBox("请输入线性规划典范型方程约束条件的个数 M=?", "输入数据", 0))

Rem 给数组分配空间
ReDim a(0 To m + 1, 0 To n + 2)
ReDim aa(1 To m + 1, 1 To n + 2)
ReDim c(n)
ReDim b(m)
ReDim cb(m)
ReDim cba(n)
ReDim xcb(n)
ReDim xb(m)


Rem 对线性规划约束方程增广矩阵A()进行归零计算
For i = 0 To m + 1
    For j = 0 To n + 2
      a(i, j) = 0
    Next j
Next i

Rem 输入线性规划约束方程系数矩阵A()
For i = 1 To m
  For j = 1 To n
    a(i, j) = Val(InputBox("请输入典范型方程约束条件矩阵的系数 a(" & Str(i) & "," & Str(j) & "):", "输入数据", 0))
  Next j
Next i

Rem 输入线性规划约束方程右端常数B()
For i = 1 To m
  b(i) = Val(InputBox("请输入典范型方程约束条件右端的常数 b(" & Str(i) & "):", "输入数据", 0))
Next i

Rem 把右端常数写入增广矩阵A()中
For i = 1 To m
  a(i, n + 1) = b(i)
Next i

Rem 输入线性规划目标函数的系数C()
For i = 1 To n
  c(i) = Val(InputBox("请输入典范型方程目标函数的系数 c(" & Str(i) & "):", "输入数据", 0))
Next i

Rem 把目标函数的系数写入增广矩阵A()中
For i = 1 To n
  a(0, i) = c(i)
Next i

Rem 输入线性规划单纯形初始表中基变量在目标函数中的系数CB()
For i = 1 To m
  cb(i) = Val(InputBox("请输入线性规划单纯形初始表中基变量在目标函数中的系数CB(" & Str(i) & "):", "输入数据", 0))
Next i

Rem 把基变量目标函数的系数写入增广矩阵A()中
For i = 1 To m
  a(i, 0) = cb(i)
Next i

Rem 记录基变量下标值
For i = 1 To m
   xb(i) = Val(InputBox("请输入典范型方程第" & Str(i) & "行,基变量的下标:", "输入数据", 0))
Next i

Rem 检验数的累积数归零并计算检验数
For i = 1 To n
  cba(i) = 0
Next i
For i = 1 To n
  For j = 1 To m
    cba(i) = cba(i) + a(j, 0) * a(j, i)
  Next j
  a(m + 1, i) = a(0, i) - cba(i)
Next i

Rem 计算目标函数值
z = 0
For i = 1 To m
  z = z + a(i, 0) * a(i, n + 1)
Next i
a(m + 1, n + 1) = z

Rem 打印增广矩阵A()
For i = 0 To m + 1
  For j = 0 To n + 2
    Print a(i, j);
  Next j
  Print
Next i
Print


Rem 判断所有检验数是否都小于等于零
cc = 0
For i = 1 To n
   If a(m + 1, i) <= 0 Then
      cc = cc + 1
   End If
Next i

Rem 统计检验数为零的个数
cm = 0
For i = 1 To n
  If a(m + 1, i) = 0 Then
     cm = cm + 1
  End If
Next i

Print "cc="; cc, "cm="; cm


Rem 判断此单纯形表是否为最优单纯形表
Do While cc < n
   
   Rem 统计检验数最大值并确定进基列
   qq = 0.00001
   l = 0
   For i = 1 To n
     If a(m + 1, i) > qq Then
        qq = a(m + 1, i)
        l = i
     End If
   Next i
   Print
   Print "l="; l,

   Rem 统计进基列上A(i,j)小于等于零的个数
   ka = 0
   For i = 1 To m
     If a(i, l) <= 0 Then
        ka = ka + 1
     End If
   Next i
   
   Rem 若各进基列上A(i,j)全都小于等于零,则本线性规划有无界解
   If ka = m Then
      Print "本线性规划有无界解!"
      Print
      Exit Do
   End If
   
   Rem  计算比值θ并按最小比值准则确定出基行
   For i = 1 To m
      If a(i, l) > 0 Then
         a(i, n + 2) = a(i, n + 1) / a(i, l)
      End If
   Next i
   
   tt = 10000
   k = 0
   For i = 1 To m
     If a(i, l) > 0 And a(i, n + 2) < tt Then
        tt = a(i, n + 2)
        k = i
     End If
   Next i
   
   Print "k="; k
   Print
      
     
   Rem 进行初等行变换时,对临时数组归零计算
   For i = 1 To m + 1
     For j = 1 To n + 2
         aa(i, j) = 0
     Next j
   Next i
   
   Rem 确定枢轴元素,进行初等行变换
   oo = a(k, l)
   For i = 1 To n + 1
      aa(k, i) = a(k, i) / oo
   Next i
   
      
   For i = 1 To m
      If i <> k Then
        For j = 1 To n + 1
          aa(i, j) = a(i, j) + a(k, j) * (-a(i, l))
       
        Next j
      End If
          
   Next i
     
   Rem 把临时数组AA()的数据写到增广矩阵A()中去
   For i = 1 To m + 1
     For j = 1 To n + 2
        a(i, j) = aa(i, j)
     Next j
   Next i
      
   a(k, 0) = a(0, l)
   xb(k) = l
             
   Rem 检验数的累积数归零并计算检验数
   For i = 1 To n
     cba(i) = 0
   Next i
   For i = 1 To n
     For j = 1 To m
       cba(i) = cba(i) + a(j, 0) * a(j, i)
     Next j
     a(m + 1, i) = a(0, i) - cba(i)
   Next i

   Rem 计算目标函数值
   z = 0
   For i = 1 To m
      z = z + a(i, 0) * a(i, n + 1)
   Next i
   a(m + 1, n + 1) = z
   
   Rem 判断所有检验数是否都小于等于零
   cc = 0
   For i = 1 To n
     If a(m + 1, i) <= 0 Then
       cc = cc + 1
     End If
   Next i
    
   Rem 统计检验数为零的个数
   cm = 0
   For i = 1 To n
     If a(m + 1, i) = 0 Then
        cm = cm + 1
     End If
   Next i
  
    Rem 打印增广矩阵A()
For i = 0 To m + 1
   For j = 0 To n + 2
    
     Print a(i, j);
   
   Next j
   Print
Next i
Print


Loop

Rem 判断此单纯形表是否为最优单纯形表
If cc = n Then
  
  Rem 判断本线性规划有唯一最优解或者有多重最优解
  If cm = m Then
      Print "本线性规划有唯一最优解!"
      Print "线性规划的最优解为:"
  ElseIf cm > m Then
      Print "本线性规划有多重最优解!"
      Print "线性规划的最优值为:"
  End If
End If
  
Rem 打印线性规划的解和目标函数值
For i = 1 To m
   
  Print "X(" & Str(xb(i)) & ")="; a(i, n + 1),
   
Next i
Print "其它变量为零。"
Print "Z="; a(m + 1, n + 1)
Print
  
Rem 打印增广矩阵A()
For i = 0 To m + 1
   For j = 0 To n + 2
    
     Print a(i, j);
   
   Next j
   Print
Next i


End Sub
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!