⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yuyan.txt

📁 此程序能过求解单纯形法
💻 TXT
字号:
DECLARE   SUB   a2   (m!,   n!,   a!(),   kk())     
    
  DECLARE   SUB   a1   (m,   n,   t,   s,   a(),   kk())     
    
  CLS     
    
  LOCATE   5,   20:   PRINT   "单纯形法"     
    
  LOCATE   6,   20:   PRINT   "========"     
    
  LOCATE   7,   10:   PRINT   "输入数学模型"     
    
  LOCATE   8,   10:   INPUT   "目标函数求最大值(输入1)或最小值(输入-1)     ",   b     
    
  LOCATE   9,   10:   INPUT   "有几个决策变量?     ",   n1     
    
  LOCATE   10,   10:   INPUT   "约束条件中含<=号的条件有几个?     ",   m1     
    
  LOCATE   11,   10:   INPUT   "约束条件中含>=号的条件有几个?     ",   m2     
    
  LOCATE   12,   10:   INPUT   "约束条件中含=号的条件有几个?     ",   m3     
    
  m   =   m1   +   m2   +   m3     
    
  n   =   n1   +   m1   +   m2     
    
  DIM   a(m,   n),   kk(m)     
    
  FOR   i   =   1   TO   6:   LOCATE   6   +   i,   10:   PRINT   SPACE$(50):   NEXT     
    
  LOCATE   7,   10:   PRINT   "输入目标函数系数:"     
    
  FOR   j   =   1   TO   n1     
    
          LOCATE   8,   10:   PRINT   SPACE$(50)     
    
          LOCATE   8,   10:   PRINT   "X";   j;   "的系数是   ";   :   INPUT   a(0,   j)     
    
  NEXT     
    
  FOR   i   =   1   TO   m1     
    
          LOCATE   7,   10:   PRINT   "输入第";   i;   "个含<=号的约束条件的系数:"     
    
  FOR   j   =   1   TO   n1     
    
          LOCATE   8,   10:   PRINT   SPACE$(50)     
    
          LOCATE   8,   10:   PRINT   "X";   j;   "的系数是   ";   :   INPUT   a(i,   j)     
    
  NEXT   j     
    
  LOCATE   8,   10:   PRINT   SPACE$(50)     
    
  LOCATE   8,   10:   INPUT   "常数项是",   a(i,   0)     
    
  a(i,   n1   +   i)   =   1     
    
  NEXT   i     
    
  FOR   i   =   1   TO   m2     
    
          LOCATE   7,   10:   PRINT   "输入第";   i;   "个含>=号的约束条件的系数:"     
    
  FOR   j   =   1   TO   n1     
    
          LOCATE   8,   10:   PRINT   SPACE$(50)     
    
          LOCATE   8,   10:   PRINT   "X";   j;   "的系数是   ";   :   INPUT   a(m1   +   i,   j)     
    
          a(m1   +   i,   j)   =   -1   *   a(m1   +   i,   j)     
    
  NEXT   j     
    
  LOCATE   8,   10:   PRINT   SPACE$(50)     
    
  LOCATE   8,   10:   INPUT   "常数项是",   a(m1   +   i,   0)     
    
  a(m1   +   i,   0)   =   -1   *   a(m1   +   i,   0)     
    
  a(m1   +   i,   n1   +   m1   +   i)   =   1     
    
  NEXT   i     
    
  FOR   i   =   1   TO   m3     
    
          LOCATE   7,   10:   PRINT   "输入第";   i;   "个含=号的约束条件的系数:"     
    
  FOR   j   =   1   TO   n1     
    
          LOCATE   8,   10:   PRINT   SPACE$(50)     
    
          LOCATE   8,   10:   PRINT   "X";   j;   "的系数是   ";   :   INPUT   a(m1   +   m2   +   i,   j)     
    
  NEXT   j     
    
  LOCATE   8,   10:   PRINT   SPACE$(50)     
    
  LOCATE   8,   10:   INPUT   "常数项是",   a(m1   +   m2   +   i,   0)     
    
  NEXT   i  



LOCATE   7,   10:   PRINT   SPACE$(50)     
    
  LOCATE   8,   10:   PRINT   SPACE$(50)     
    
  LOCATE   8,   10:   INPUT   "要打印单纯形表吗?(要请输入:   1)";   dy     
    
  REM   打印线性规划问题的标准型     
    
  LOCATE   7,   5:   PRINT   SPACE$(70)     
    
  LOCATE   7,   5:   PRINT   "线性规划问题的标准型为:"     
    
  IF   b   =   1   THEN     
    
          LOCATE   8,   5:   PRINT   "求   Max   S=";     
    
      ELSE     
    
          LOCATE   8,   5:   PRINT   "求   Min   S=";     
    
  END   IF     
    
  IF   a(0,   1)   <>   0   THEN   PRINT   a(0,   1);   "x1";     
    
  FOR   j   =   2   TO   n     
    
  SELECT   CASE   a(0,   j)     
    
        CASE   IS   <   0     
    
            PRINT   a(0,   j);   "x";   j;     
    
        CASE   IS   >   0     
    
            PRINT   "+";   a(0,   j);   "x";   j;     
    
  END   SELECT     
    
  NEXT   j:   PRINT   "                                                                             "     
    
  LOCATE   9,   5:   PRINT   "s.t."     
    
  FOR   i   =   1   TO   m     
    
          LOCATE   8   +   i,   9:     
    
          IF   a(i,   1)   <>   0   THEN   PRINT   a(i,   1);   "x1";     
    
          FOR   j   =   2   TO   n     
    
            SELECT   CASE   a(i,   j)     
    
                CASE   IS   <   0     
    
                      PRINT   a(i,   j);   "x";   j;     
    
                CASE   IS   >   0     
    
                      PRINT   "+";   a(i,   j);   "x";   j;     
    
            END   SELECT     
    
          NEXT   j:   PRINT   "=";   a(i,   0);   "                                                 "     
    
  NEXT   i     
    
  FOR   j   =   1   TO   n1     
    
          a(0,   j)   =   a(0,   j)   *   b     
    
  NEXT     
    
  FOR   i   =   1   TO   m1   +   m2     
    
          kk(i)   =   n1   +   i     
    
  NEXT     
    
  IF   dy   =   1   THEN     
    
        CALL   a2(m,   n,   a(),   kk())     
    
  END   IF     
    
  REM   求基础解     
    
  FOR   i   =   m1   +   m2   +   1   TO   m     
    
        g   =   0     
    
        FOR   j   =   1   TO   n     
    
                IF   a(i,   j)   <>   0   THEN     
    
                      g   =   1:   t   =   i:   s   =   j:   CALL   a1(m,   n,   t,   s,   a(),   kk())     
    
                EXIT   FOR     
    
                END   IF     
    
        NEXT   j     
    
        IF   g   =   0   THEN     
    
              IF   INT(a(i,   0)   *   10000   +   .5)   /   10000   =   0   THEN     
    
                    FOR   i1   =   i   TO   m   -   1     
    
                            kk(i1)   =   kk(i1   +   1)     
    
                            FOR   j   =   0   TO   n     
    
                                  a(i1,   j)   =   a(i1   +   1,   j)     
    
                            NEXT   j     
    
                    NEXT     
    
                    m   =   m   -   1:   i   =   i   -   1     
    
                ELSE     
    
                    PRINT   "无基础解"     
    
                    END     
    
              END   IF     
    
        END   IF     
    
        IF   dy   =   1   THEN     
    
              CALL   a2(m,   n,   a(),   kk())     
    
        END   IF     
    
        IF   i   >=   m   THEN     
    
              EXIT   FOR     
    
        END   IF     
    
  NEXT     
    

REM   求可行解     
    
  DO     
    
      g   =   0     
    
      FOR   i   =   1   TO   m     
    
          IF   a(i,   0)   <   0   THEN     
    
                g   =   1     
    
                t   =   i     
    
                xx   =   999999     
    
                FOR   j   =   1   TO   n     
    
                      IF   INT(a(i,   j)   *   100000   +   .5)   /   100000   <   0   THEN     
    
                            IF   a(0,   j)   /   a(i,   j)   <   xx   THEN     
    
                                s   =   j     
    
                                xx   =   a(0,   j)   /   a(i,   j)     
    
                            END   IF     
    
                      END   IF     
    
                NEXT     
    
                IF   xx   =   999999   THEN     
    
                      PRINT   "线性规划问题无可行解"     
    
                      END     
    
                    ELSE     
    
                      CALL   a1(m,   n,   t,   s,   a(),   kk())     
    
                      EXIT   FOR     
    
                END   IF     
    
          END   IF     
    
      NEXT   i     
    
      IF   g   =   0   THEN     
    
            EXIT   DO     
    
      END   IF     
    
      IF   dy   =   1   THEN     
    
            CALL   a2(m,   n,   a(),   kk())     
    
      END   IF     
    
  LOOP     
    
  REM   求最优解     
    
  DO     
    
      g   =   0     
    
      FOR   j   =   1   TO   n     
    
          IF   a(0,   j)   >   0   THEN     
    
                g   =   1     
    
                s   =   j     
    
                xx   =   999999     
    
                FOR   i   =   1   TO   m     
    
                      IF   INT(a(i,   j)   *   100000   +   .5)   /   100000   >   0   THEN     
    
                            IF   a(i,   0)   /   a(i,   j)   <   xx   THEN     
    
                                t   =   i     
    
                                xx   =   a(i,   0)   /   a(i,   j)     
    
                            END   IF     
    
                      END   IF     
    
                NEXT     
    
                IF   xx   =   999999   THEN     
    
                      PRINT   "线性规划问题无最优解"     
    
                      END     
    
                    ELSE     
    
                      CALL   a1(m,   n,   t,   s,   a(),   kk())     
    
                      EXIT   FOR     
    
                END   IF     
    
          END   IF     
    
      NEXT   j     
    
      IF   g   =   0   THEN     
    
            EXIT   DO     
    
      END   IF     
    
  IF   dy   =   1   THEN     
    
        CALL   a2(m,   n,   a(),   kk())     
    
  END   IF     
    
  LOOP     
    
  va:   REM   打印最优解     
    
  PRINT   "线性规划问题的最优解:"     
    
  FOR   j   =   1   TO   n     
    
          g   =   0     
    
          FOR   i   =   1   TO   m     
    
                IF   j   =   kk(i)   THEN     
    
                      g   =   1:   EXIT   FOR     
    
                END   IF     
    
          NEXT   i     
    
          IF   g   =   0   THEN     
    
                PRINT   "x(";   j;   ")=";   0     
    
              ELSE     
    
                PRINT   "x(";   j;   ")=";   a(i,   0)     
    
          END   IF     
    
  NEXT   j     
    
  PRINT   "相应的";     
    
  IF   b   =   -1   THEN     
    
          PRINT   "Min   S=";   INT(a(0,   0)   *   100   +   .5)   /   100     
    
        ELSE     
    
          PRINT   "Max   S=";   -1   *   INT(a(0,   0)   *   100   +   .5)   /   100     
    
  END   IF     
    
  vb:   REM   求别的基础最优解     
    
  PRINT   "当j=";     
    
  FOR   j   =   1   TO   n     
    
          IF   INT(a(0,   j)   *   100   +   .5)   /   100   =   0   THEN     
    
                g   =   0     
    
                FOR   i   =   1   TO   m     
    
                    IF   j   =   kk(i)   THEN     
    
                          g   =   1:   EXIT   FOR     
    
                    END   IF     
    
                NEXT   i     
    
                IF   g   =   0   THEN     
    
                      PRINT   j;     
    
                END   IF     
    
          END   IF     
    
  NEXT   j     
    
  PRINT   "时还有别的基础最优解."     
    
  PRINT   "要求别的基础最优解吗?(Y/N)";   :   INPUT   yn$     
    
  IF   yn$   =   "Y"   OR   yn$   =   "y"   THEN     
    
        INPUT   "请输入j=";   j     
    
                s   =   j     
    
                xx   =   999999     
    
                FOR   i   =   1   TO   m     
    
                IF   INT(a(i,   j)   *   100000   +   .5)   /   100000   >   0   THEN     
    
                      IF   a(i,   0)   /   a(i,   j)   <   xx   THEN     
    
                            t   =   i     
    
                            xx   =   a(i,   0)   /   a(i,   j)     
    
                      END   IF     
    
                END   IF     
    
        NEXT     
   
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -