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
- Next i
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 "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 "本线性规划有无界解!"
- 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
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
- Next i
- 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)
Rem 打印增广矩阵 A()
- For i = 0 To m + 1
- For j = 0 To n + 2
- Print a(i, j);
- Next j
- Next i
- End Sub
来源: http://www.bubuko.com/infodetail-3324687.html