包括两部分:代码 和课本原理(线性和非线性规划)
目标函数是: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