simplex ----单纯形法(python 代码含注释)

包括两部分:代码 和课本原理(线性和非线性规划)

目标函数是:min

1,python 代码

这里直接附上代码:

#!/usr/bin/python
# coding:utf-8 
# 19-3-20 下午3:12
# @File    : Simplex.py
import numpy as np
# import os
data= [] #全局变量用来存储矩阵

def pivot():
    global data

    # data= np.array(data)
    t = np.array(data[0][:-1]) #将第一行数据拿出来(第一行是 min 目标函数)
    jump = t.argmin() #找到相对成本为负值的,relative cost coefficients
    data = np.array(data)
    m = []
    print data.shape
    countd = False
    for i in range(data.shape[0]): #找到基元
        if i == 0:
            m.append(10000.0) #这个里表示无限大
        else:
            if data[i][jump] <= 0:
                m.append(10000.0)
            else:
                print data[i][-1]/data[i][jump]
                m.append(data[i][-1]/data[i][jump])
    if countd == False:
        print "no solution"
        return
    print m
    based = m.index(min([x for x in m if x!=0]))
    print m
    print based, m[based]
    for g in range(data.shape[0]): #将jump列,based 外,S都变成0,高斯消元法
        print data.shape[0]
        c = data[g][jump] / data[based][jump]
        if g != based:
            for j in range(data.shape[1]):
                if j == jump:
                    print j== jump
                    data[g][j] = 0.0
                else:
                    data[g][j] = data[g][j] - c*data[based][j]
                    print data[g][j]
    print data
    # return d


def solve():
    count = 0 # 使无解不无限循环
    flag = True
    global data
    # d= data
    while flag:#判断还能不能再优化
        if min(list(data[0][:-1])) >= 0:
            flag = False
        else:
            # d = np.array(d)
            pivot()
        if count > 1000:
            print "solve the question failed "
            break
        count = count + 1
    print ("solution is %f" %data[0][-1])


def main():
    d = raw_input('please input object function, form is :  1 ,3, 4, 0 :')
    formdata = map(float, d.split(','))
    num = input('please input number of limit inequation :')
    for i in range(num):
        pridata = raw_input('please input %d  function, form is :  1 ,3, 4, 0 :' %i)
        adddata = map(float, pridata.split(','))
        formdata = np.vstack((formdata, adddata))
    # print  formdata
    global data
    data = formdata
    # print data[2][-1]
    # print data[2][1]
    # print data[2][-1]/data[2][1]
    print data
    solve()



if __name__ == '__main__':
    main()

2.原理截图

基元变化原理

基元变换

最优原理(如何判断到最优值)

对应到矩阵上,目标函数中基础解下面都被消去(基础解是单位矩阵那部分),变成了z0

猜你喜欢

转载自blog.csdn.net/qq_42105426/article/details/89445735