zoukankan      html  css  js  c++  java
  • 线性规划VB求解

    线性规划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
  • 相关阅读:
    优秀的云架构师需要学什么技能
    dkh人力资源大数据解决方案整体架构
    大数据hadoop与spark的区别
    hadoop技术入门学习之发行版选择
    大数据开发基础知识需要掌握哪些
    智慧人社政务云平台建设方案架构案例介绍
    [项目机会]citrix 虚拟桌面对于java等高CPU占用率如何解决
    [办公自动化]无法使用江南天安usbkey 无法使用视频网站
    [学习笔记]从0到1
    [办公自动化]目录修改以及插入分页符后行间距自动变宽
  • 原文地址:https://www.cnblogs.com/yellowhh/p/12013915.html
Copyright © 2011-2022 走看看