文章仅作为笔记使用,敬请指正。
#输入单纯型表矩阵和目标函数系数
import numpy as np
global m,n #这两个变量其他函数里也需要调用
string = input('''
输入初始单纯形表形如
例一:3 2 1 0 18;-1 4 0 1 8;-2 1 0 0 0
例二:2 1 0 1 0 0 8;-4 -2 3 0 1 0 14;1 -2 1 0 0 1 18;6 -3 1 0 0 0 0
例三:8 2 4 1 0 0 1;2 6 6 0 1 0 1;6 4 4 0 0 1 1;1 1 1 0 0 0 0
前m行表示m个约束的增广矩阵,最后一行表示检验数
输入:''')
a = [list(map(eval,row.split())) for row in string.split(';')]
matrix = np.array(a)
m,n = matrix.shape
n -= 1
m -= 1
#初始化数据
b=matrix[:,-1]
b=np.delete(b, -1)
x = np.delete(matrix, -1, axis=1)
c=x[-1,:]
cj=c
x = np.delete(x, -1, axis=0)
x = x.astype('float_')
c=c.astype('float_')
b=b.astype('float_')
#x=np.mat(x)
c=list(c)
b=list(b)
cb=[]
for i in range(len(c)):
if c[i]==0:
cb.append(0)
#bsc=range(len(x[0])-len(cb)+1,len(x[0])+1) #存当前基变量的序号
#主函数
flag=0
for i in range(len(c)):
flag=0
if c[i]>0: #存在检验数大于0
flag=1
x,c,b,cb=solve(x,c,b,cb)
print(x)
print(b)
print(c)
print(cb)
break;
if flag==0:
z=0
for i in range(len(b)):
z+=b[i]*cb[i]
#print(z)
def solve(x,c,b,cb):
inb = c.index(max(c)) #入基变量在矩阵中的列数
theta=list(b/x[:,inb])
out=theta.index(min(theta)) #出基变量在矩阵中的行数
#bsc[out]=inb+1 #更新当前基变量的序号
chu=float(x[out,inb])#要除的数
b[out]=b[out]/chu
x[out,:]=x[out,:]/chu
#更新入基变量的行
for i in range(len(b)):
if x[i,inb]>0 and i!=out:
temp=x[i,inb]
x[i,:]=x[i,:]-x[out,:]*temp
b[i]=b[i]-b[out]*temp
cb[out]=c[inb]
#更新 b
for i in range(len(x[0])):
for j in range(len(b)):
c[i]=c[i]-cb[j]*x[j,i]
return x,c,b,cb
参考文献:
https://blog.csdn.net/qq_47723068/article/details/109537450