單純形法求解線性規劃問題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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章