【线性规划】python单纯形法求解线性规划

python单纯形法求解线性规划

文章仅作为笔记使用,敬请指正。

#输入单纯型表矩阵和目标函数系数
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

你可能感兴趣的:(python)