单纯形法求解线性规划问题python代码

单纯形法求解线性规划问题python代码

输入格式代码中可见

#simplex
#
#单纯形法求解一般形式的线性规划
#  x1+x2<5
# 3x1+x2<8
# x1,x2>=0
# max(2x1+x2)
#初始单纯形表
#      x1   x2   x3   x4    
#x3   1     1     1     0      5
#x4   3     1     0     1      8
#     -2     -1    0     0      0
 
import pdb


#打印当前的单纯形表
def printJZ(rect_raw):
    for each in rect_raw:
        print(each)
#判断目标行是否全为非负,若为非负,终止迭代。找到最优列,提取出来,通过计算比率(若全为负无解)找到最优行,进行归一化,使同列数据为0,放入新的数组中,进行递归迭代
def simple_method(begin_Matrix):
    flag = 0
    tmp_value = 0
    count = 0
    column = 0
    for value in begin_Matrix[len(begin_Matrix)-1][:-1]:
        if value < 0:
            flag = 1
            if max(abs(value),tmp_value) == abs(value):
                column = count
                tmp_value = abs(value)
        count = count + 1
    # 输出结果状态以及最优解
    if flag == 0:
        print('输出结果状态:')
        printJZ(begin_Matrix)
        print('最优解:',begin_Matrix[len(begin_Matrix)-1][len(begin_Matrix[len(begin_Matrix)-1])-1])
    else:
        #经过主元列确定主元行
        flag = 0
        tmp_value = 10000
        row = 0
        count = 0
        for value in begin_Matrix:
            if value[column] > 0:
                flag = 1
                if value[len(value)-1]/value[column] == min(value[len(value)-1]/value[column],tmp_value):
                    tmp_value = value[len(value)-1]/value[column]
                    row = count
            count = count + 1
        if flag == 0:
            print('算法无界终止!')
        else:
            #经过找出的主元行和列对矩阵做变换
            new_Matrix = []
            for i in range(0,len(begin_Matrix)):
                new_Matrix.append([])
                for j in range(0,len(begin_Matrix[i])):
                    if i == row:
                        new_Matrix[i].append(begin_Matrix[i][j]/begin_Matrix[row][column])
                    else:
                        if begin_Matrix[i][column] > 0:
                            new_Matrix[i].append(begin_Matrix[i][j]-begin_Matrix[row][j]/begin_Matrix[row][column]*begin_Matrix[i][column])
                        else:
                            new_Matrix[i].append(begin_Matrix[i][j] - begin_Matrix[row][j] / begin_Matrix[row][column] * begin_Matrix[i][column])
            simple_method(new_Matrix)




 #单纯形法求解
def simplex(imputMatrix):
    print('输入矩阵:')
    printJZ(imputMatrix)
    ###############################
    #初始化设置参数部分
    begin_Matrix =[]
    for i in range(0,len(imputMatrix)):
        begin_Matrix.append(imputMatrix[i][:-1])
        for j in range(0,len(imputMatrix)-1):
            if j==i:
                begin_Matrix[i].append(1)
            elif i == len(imputMatrix) -1:
                begin_Matrix[i].append(0)
            else:
                begin_Matrix[i].append(0)
        begin_Matrix[i].append(imputMatrix[i][len(imputMatrix[i])-1])
    #################################
    print('构造初始单纯形表:')
    printJZ(begin_Matrix)
    #################################
    simple_method(begin_Matrix)

if __name__=='__main__':
    

    #输入对象:满足线性规划的标准形式
    #举例  求   max   z=3x+5y
    #约束条件1:         x+ y<=4
    #约束条件2:         x+3y<=6
    #非负约束:          x>=0,y>=0
    #输入约束:满足可行区域存在的约束(不用再代码中考虑)
    #输入格式: 1,1,4@1,3,6@-3,-5,0
    #原始约束数组
    print('请按格式输入约束条件和所求目标信息')
    Glist=input().split('@')
    rect_raw=[]
    for item in Glist:
        row=item.split(',')
        g=[int(i) for i in row]
        rect_raw.append(g)
    simplex(rect_raw)

你可能感兴趣的:(单纯形法求解线性规划问题python代码)