利用修正单纯形法解线性规划问题一软件示意:二代码说明:Dim A(1 To 3, 1 To 6) As Double '矩阵ADim a1(1 To 3) As Double '矩阵A的第一列向量Dim a2(1 To 3) As Double '矩阵A的第二列向量Dim a3(1 To 3) As Double '矩阵A的第三列向量Dim a4(1 To 3) As Double '矩阵A的第四列向量Dim a5(1 To 3) As Double '矩阵A的第五列向量Dim a6(1 To 3) As Double '矩阵A的第六列向量Dim B_(1 To 3, 1 To 3) As Double '基矩阵B的逆矩阵Dim XB(1 To 3) As Double '基本可行解Dim b(1 To 3) As Double '右端向量bDim C(1 To 6) As Double '检验数Dim CB(1 To 3) As Double '基本可行解对应的检验数Dim π(1 To 3) As Double '单纯形乘子矢量Dim r(1 To 6) As Double '检验矢量rDim r_min As Double '检验矢量最小值Dim k_sign As Integer '检验矢量最小值对应的位置Dim Y(1 To 3, 0 To 6) As Double '矩阵yDim just_vector(1 To 3) As DoubleDim liji_min As Double '用于判断离基变量所用值Dim r_sign As Integer '用于记录离基变量对应的位置Dim main_yuan As Double '用于存放主元Dim Erk(1 To 3, 1 To 3) As DoubleDim Exchange_B(1 To 3, 1 To 3) '在矩阵Erk与矩阵B_进行乘法运算时,作为矩阵B_的替换矩阵Dim Exchange_XB(1 To 3) '在矩阵Erk与XB_进行乘法运算时,作为XB_的替换矩阵Dim iterative_time As Integer '定义迭代的次数Dim XB_optimization(1 To 6) As Double '最优解Private Sub Command1_Click()'窗口1For iterative_time = 1 To 1000 '开始了迭代循环Select Case k_signCase 1If (r_sign - 3) = 3 ThenCB(1) = C(2) '付值给基本可行解对应的检验数CB(2) = C(3)CB(3) = C(6)XB_optimization(1) = 0XB_optimization(2) = XB(1)XB_optimization(3) = XB(2)XB_optimization(4) = 0XB_optimization(5) = 0XB_optimization(6) = XB(3)End IfCase 2If (r_sign - 3) = 1 ThenCB(1) = C(2) '付值给基本可行解对应的检验数CB(2) = C(5)CB(3) = C(6)XB_optimization(1) = 0XB_optimization(2) = XB(1)XB_optimization(3) = 0XB_optimization(4) = 0XB_optimization(5) = XB(2)XB_optimization(6) = XB(3)End IfCase 3If (r_sign - 3) = 2 ThenCB(1) = C(2) '付值给基本可行解对应的检验数CB(2) = C(3)CB(3) = C(6)XB_optimization(1) = 0XB_optimization(2) = XB(1)XB_optimization(3) = XB(2)XB_optimization(4) = 0XB_optimization(5) = 0XB_optimization(6) = XB(3)End IfEnd SelectFor i = 1 To 3 '计算单纯形乘子矢量π(i) = CB(1) * B_(1, i) + CB(2) * B_(2, i) + CB(3) * B_(3, i) Next iFor j = 1 To 6 '计算检验矢量rr(j) = C(j) - (π(1) * A(1, j) + π(2) * A(2, j) + π(3) * A(3, j))Next jr_min = r(1) '预先给定一个值k_sign = 1For i = 1 To 6 '找出最小检验值If (r(i) < r_min) Thenr_min = r(i) '最小检验值k_sign = i '最小检验值所在位置,对应进基矢量位置End IfNext iIf r_min < 0 ThenFor i = 1 To 3 '对应进基矢量所得的y值Y(i, k_sign) = B_(i, 1) * A(1, k_sign) + B_(i, 2) * A(2, k_sign) + B_(i, 3) * A(3, k_sign)Next iFor i = 1 To 3 '确定离基变量If Y(i, k_sign) <> 0 Thenjust_vector(i) = Y(i, 0) / Y(i, k_sign)End IfNext iFor i = 1 To 3If (just_vector(i)) > 0 Thenliji_min = just_vector(i) '预先给定一个值Exit ForEnd IfNext ir_sign = 4For i = 1 To 3 '找出最小检验值If ((just_vector(i) <= liji_min) And (just_vector(i) > 0)) Thenliji_min = just_vector(i) '最小检验值r_sign = i + 3 '最小检验值所在位置,对应进基矢量位置 End IfNext imain_yuan = Y(r_sign - 3, k_sign)If main_yuan <> 0 ThenSelect Case (r_sign - 3) '计算矩阵ErkCase 1Erk(1, 1) = 1 / main_yuanErk(2, 1) = -Y(2, k_sign) / main_yuanErk(3, 1) = -Y(3, k_sign) / main_yuanFor i = 2 To 3For j = 1 To 3Erk(j, i) = A(j, i + 3)Next jNext iCase 2Erk(1, 2) = -Y(1, k_sign) / main_yuanErk(2, 2) = 1 / main_yuanErk(3, 2) = -Y(3, k_sign) / main_yuanFor j = 1 To 3Erk(j, 1) = A(j, 4)Next jFor j = 1 To 3Erk(j, 3) = A(j, 6)Next jCase 3Erk(1, 3) = -Y(1, k_sign) / main_yuanErk(2, 3) = -Y(2, k_sign) / main_yuanErk(3, 3) = 1 / main_yuanFor i = 1 To 2For j = 1 To 3Erk(j, i) = A(j, i + 4)Next jNext iEnd SelectEnd IfFor i = 1 To 3 '给矩阵Exchange_B(i, j)付值For j = 1 To 3Exchange_B(i, j) = B_(i, j)Next jNext iFor i = 1 To 3 '计算B的新可逆矩阵B_For j = 1 To 3B_(i, j) = Erk(i, 1) * Exchange_B(1, j) + Erk(i, 2) * Exchange_B(2, j) + Erk(i, 3) * Exchange_B(3, j)Next jNext iFor i = 1 To 3 '给Exchange_XB(i)付值Exchange_XB(i) = XB(i)Next iFor i = 1 To 3 '计算基本可行解XB(i) = Erk(i, 1) * Exchange_XB(1) + Erk(i, 2) * Exchange_XB(2) + Erk(i, 3) * Exchange_XB(3)Y(i, 0) = XB(i)Next iElseMsgBox ("优化完毕!")Exit ForEnd IfNext iterative_timeCommand2.Enabled = True '使能按钮Command3.Enabled = True '使能按钮Form1.Text1(1).Text = XB_optimization(1) '显示最优解x1Form1.Text1(2).Text = XB_optimization(2) '显示最优解x2Form1.Text1(3).Text = XB_optimization(3) '显示最优解x3Form1.Text1(4).Text = XB_optimization(4) '显示最优解x4Form1.Text1(5).Text = XB_optimization(5) '显示最优解x5Form1.Text1(6).Text = XB_optimization(6) '显示最优解x6Form1.Text1(0).Text = C(1) * XB_optimization(1) + C(2) * XB_optimization(2) + C(3) * XB_optimization(3) + C(4) * XB_optimization(4) + C(5) * XB_optimization(5) + C(6) * XB_optimization(6) '显示最优值ZForm1.Text1(7) = iterative_time - 1 '显示迭代次数End SubPrivate Sub Command2_Click()End '结束程序End SubPrivate Sub Command3_Click()Form1.Show '调用优化结果显示窗口End SubPrivate Sub Form_Load()Dim i, j As IntegerFor i = 1 To 3 '付值给系数矩阵AFor j = 1 To 6A(i, j) = Quotiety_A(j + 6 * (i - 1)).Text '付值给系数矩阵A Next jNext iFor i = 1 To 6 '将矩阵A列分块(a1,a2,a3,a4,a5,a6)For j = 1 To 3Select Case iCase 1a1(j) = A(j, i)Case 2a2(j) = A(j, i)Case 3a3(j) = A(j, i)Case 4a4(j) = A(j, i)Case 5a5(j) = A(j, i)Case 6a6(j) = A(j, i)End SelectNext jNext iFor i = 1 To 3 '付值给基矩阵B的逆矩阵B_For j = 1 To 3Select Case iCase 1B_(j, i) = a4(j)Case 2B_(j, i) = a5(j)Case 3B_(j, i) = a6(j)End SelectNext jNext iFor i = 1 To 6 '付值给检验数Select Case iCase 1C(1) = C_quotiety(0).TextCase 2C(2) = C_quotiety(1).TextCase 3C(3) = C_quotiety(2).TextCase 4C(4) = C_quotiety(3).TextCase 5C(5) = C_quotiety(4).TextCase 6C(6) = C_quotiety(5).TextEnd SelectNext ib(1) = b_quotiety(0).Text '付值给右端向量bb(2) = b_quotiety(1).Textb(3) = b_quotiety(2).TextFor i = 1 To 3 '计算初始基本可行解XB(i) = B_(i, 1) * b(1) + B_(i, 2) * b(2) + B_(i, 3) * b(3) Y(i, 0) = XB(i)Next iCB(1) = C(4) '付值给初始基本可行解对应的检验数CB(2) = C(5)CB(3) = C(6)End SubPrivate Sub Command1_Click()'窗口2Unload Form1 '关闭优化结果显示窗口End Sub。