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

📄 单纯形法的qb程序.txt

📁 说明: 1.本程序为复合形法 !* 2.程序功能是求解约束最优化问题
💻 TXT
字号:
:单纯形法的QB程序!!!!1

作者:bily
专家分:0
会员信息
发短消息
	
发表时间:2004-3-26 19:28:00

 楼主  
请把它变成C/C++!!!
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

   IF xx = 999999 THEN

      PRINT "线性规划问题在这个方向无基础最优解"

      GOTO vb

     ELSE

      CALL a1(m, n, t, s, a(), kk())

      IF dy = 1 THEN

        CALL a2(m, n, a(), kk())

      END IF

   END IF

   GOTO va

END IF

END

  

SUB a1 (m, n, t, s, a(), kk())

kk(t) = s

ll = a(t, s)

FOR j1 = 0 TO n: a(t, j1) = a(t, j1) / ll: NEXT j1

FOR i1 = 0 TO m

  IF i1 <> t THEN

    x = a(i1, s)

    FOR j1 = 0 TO n

      a(i1, j1) = a(i1, j1) - a(t, j1) * x

    NEXT

  END IF

NEXT

END SUB

  

SUB a2 (m, n, a(), kk())   

PRINT  

PRINT "-------------------------------------------------------------------------------------------------"

FOR j1 = 1 TO n

    PRINT TAB(11 + j1 * 8); "x"; j1;

NEXT j1: PRINT

PRINT "-------------------------------------------------------------------------------------------------"

FOR i1 = 0 TO m

   IF i1 = 0 THEN

      PRINT TAB(3); "S";

    ELSE

      PRINT TAB(3); "x"; kk(i1);

   END IF

   FOR j1 = 0 TO n

     PRINT TAB(11 + j1 * 8); INT(a(i1, j1) * 100 + .5) / 100;

   NEXT j1

   PRINT

NEXT i1   

PRINT "-------------------------------------------------------------------------------------------------"

PRINT  

END SUB 

⌨️ 快捷键说明

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