📄 单纯形法的qb程序.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 + -