单纯形法Python实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
一、单纯形法理论基础
二、Python代码实现
1.循环求解
2.最优性检验
3.结果输出
4.完整代码
前言
本文代码参考《运筹学教程》(第四版)中的第一章第四节中所介绍的单纯形法理论基础所实现,其中的各种符号表示与书中的符号对应。
其次,本文中只考虑模型有最优解的情况,不考虑模型无最优解或无限最优解。
一、单纯形法理论基础
单纯形法的理论可以在网上搜索到许多相关资料,在此不多赘述,直接进入正题。
二、Python代码实现
单纯形法的实现可以分为以为几个模块:循环、最优性检验、结果输出
1.循环求解
这里是单纯形法的主体部分,主要是分为以下几个步骤:求解检验数σ、确定换入基变量、确定换出基向量、对矩阵A进行高斯变换。以此循环。
代码如下:
def pivot(j,a,b):Cb=[c[i] for i in j] #更新Cb# 对sigma进行求解sigma = np.array([0]*a.shape[1]).astype(float) #求解sigma,用做后续的判定for i in range(a.shape[1]):temp = 0for k in range(a.shape[0]):temp += a[k, i] * Cb[k]sigma[i] = c[i] - temp# 得到换入变量,从sigam中最大值的索引为换入基变量vetorIn = np.argmax(sigma) # 这里的vetorIn是横着的索引# 得到换出基变量theta = []for i in range(len(b)):if a[i, vetorIn] == 0: #如果为0,则不能当作除数theta.append(10000000000)else:theta.append(b[i] / a[i, vetorIn])index = np.argmin(theta) # 确定换出基变量,这里的index时竖着的索引vetorOut = j[np.argmin(theta)] #这里得到的是换出基变量,但是后面一般都用其索引index#行变换,进行高斯变换temp=a[index, vetorIn]a[index, :] = a[index, :] / a[index, vetorIn] #对换出基向量进行变换-----矩阵Ab[index] = (b[index] /temp) #对换出基向量进行变换+-----举证bfor i in range(a.shape[0]): #对其他的行向量高斯变换if i != index:if a[i, vetorIn] != 0: #如果为换入基向量列中有0,则无需变换temp=a[i, vetorIn]a[i, :] = a[i, :] - a[i, vetorIn] * a[index, :]b[i] = b[i] - temp * b[index]# 基向量的替换j[index] = vetorIn # 基变量return j,a,b,sigma
2.最优性检验
若在σ列表中,有任意一个元素大于0,则不是最优;否则,已经找到最优解
def check(j,a,b,c,d):"""这里的主要的求解步骤:param j: 基向量的索引:param a: 约束中的矩阵:param b: 约束中的条件:param c: 目标函数中的c:param d: 初始化的表:return:返回基向量,a,b"""sigma = np.array([1, 1, 1, 1, 1]).astype(float)while (sigma>0).any():j, a, b, sigma=pivot(j,a,b)return j,a,b
3.结果输出
根据最后确定的基向量、矩阵a,矩阵b确定最终的结果
"解的输出"
def output(j,a,b):result=[0]*len(b)for i in range(len(b)):result[j[i]]=b[i]return result
4.完整代码
实例:左边为原问题,右边为标准形式
import numpy as np# 表格的初始化
#输入一个初始的表
d=np.array([[2,1,0,0,0,0],[0,5,1,0,0,15],[6,2,0,1,0,24],[1,1,0,0,1,5]]).astype(float)
# 初始的参数表进行分离
c=d[0,:-1]
a=d[1:,:-1]
b=d[1:,-1]
#确定基向量
j=[2,3,4] #基向量#进行循环
def pivot(j,a,b):Cb=[c[i] for i in j] #更新Cb# 对sigma进行求解sigma = np.array([0]*a.shape[1]).astype(float) #求解sigma,用做后续的判定for i in range(a.shape[1]):temp = 0for k in range(a.shape[0]):temp += a[k, i] * Cb[k]sigma[i] = c[i] - temp# 得到换入变量,从sigam中最大值的索引为换入基变量vetorIn = np.argmax(sigma) # 这里的vetorIn是横着的索引# 得到换出基变量theta = []for i in range(len(b)):if a[i, vetorIn] == 0: #如果为0,则不能当作除数theta.append(10000000000)else:theta.append(b[i] / a[i, vetorIn])index = np.argmin(theta) # 确定换出基变量,这里的index时竖着的索引vetorOut = j[np.argmin(theta)] #这里得到的是换出基变量,但是后面一般都用其索引index#行变换,进行高斯变换temp=a[index, vetorIn]a[index, :] = a[index, :] / a[index, vetorIn] #对换出基向量进行变换-----矩阵Ab[index] = (b[index] /temp) #对换出基向量进行变换+-----举证bfor i in range(a.shape[0]): #对其他的行向量高斯变换if i != index:if a[i, vetorIn] != 0: #如果为换入基向量列中有0,则无需变换temp=a[i, vetorIn]a[i, :] = a[i, :] - a[i, vetorIn] * a[index, :]b[i] = b[i] - temp * b[index]# 基向量的替换j[index] = vetorIn # 基变量return j,a,b,sigma"最优性检验"
def check(j,a,b,c,d):"""这里的主要的求解步骤:param j: 基向量的索引:param a: 约束中的矩阵:param b: 约束中的条件:param c: 目标函数中的c:param d: 初始化的表:return:返回基向量,a,b"""sigma = np.array([1, 1, 1, 1, 1]).astype(float)while (sigma>0).any():j, a, b, sigma=pivot(j,a,b)return j,a,b
"解的输出"
def output(j,a,b):result=[0]*len(b)for i in range(len(b)):result[j[i]]=b[i]return resultif __name__ == '__main__':J,A,B=check(j,a,b,c,d)Result=output(J,A,B)for i in range(len(Result)):print('x',str(i+1),'为',Result[i])
单纯形法Python实现相关推荐
- 线性规划单纯形法python实现与代码详细解读
线性规划单纯形法python实现与代码详细解读 1 单纯形法(Simplex method) 2 编程思路 3 python实现原理解读 4 python代码 5 后记 1 单纯形法(Simplex ...
- 线性与非线性规划——单纯形法python实现
线性与非线性规划--单纯形法python实现 单纯形法原理及python实现,时间:2022/1/11 本文不对单纯形方法进行讲解,若有需要请参照<最优化理论与算法第二版>(陈宝林著) ...
- 线性规划单纯形法python实现
用python实现线性规划中的单纯形法 例题如下(已是标准形式): maxz=1500x1+1000x2max z=1500x_1+1000x_2maxz=1500x1+1000x2 {3x1+2 ...
- 单纯形法python程序_Python-linprog最小化误差单纯形法
我在用scipy.optimize.linprog使用单纯形法计算最小化的库.我有两种情况下出错: "值错误:单纯形法的第1阶段未能找到可行的解决方案.伪目标函数的计算结果为3.1e-12, ...
- 数据洞察和数据分析_利用数据洞察力提高客户保留率
数据洞察和数据分析 首先,让我们知道客户保留率是多少? (First of all, let us know what customer retention is?) It represents th ...
- python解非线性规划问题讲析_python中线性规划中的单纯形法、scipy库与非线性规划求解问题...
单纯形法.scipy库与非线性规划求解问题 单纯形法的基本定义 大M法求解线性规划的原理 excel求解 Python调用optimize包和scipy求解线性规划 Python编程实现单纯形法 对比 ...
- 运筹学 | 线性规划求解算法 | 单纯形法的python实现
单纯形法是在线性规划可行域的顶点中搜索最优解的算法,可以被分为三个步骤: 找到顶点 搜索顶点 判断在某顶点处是否最优 如何找到可行域的顶点? 存在由线性等式和不等式构成的多面体 P={X∈Rn∣∑j= ...
- python 实现对偶单纯形法
昨天熬了一个通宵,女朋友写运筹学作业有个对偶单纯形法的题,据说是算了一天,感觉题无解,但是想确定一下,就很烦躁.我开始搜了一下,但是网上的代码都用不了,所以咱就研究了一下单纯形法和对偶单纯形法,用py ...
- 对偶单纯形法的Python实现
对偶单纯形法的Python实现 编写背景 程序 输出 说明 缺点 编写背景 对偶单纯形法的算法原理在各个版本的<运筹学>教材中已经被阐述得很详细了,但是手工计算不仅繁琐,而且容易出错.编写 ...
最新文章
- Apache支持多端口配置处理
- Struts result param详细设置
- linux管理员常用的命令分享
- Hangfire 任务调度
- Java高级工程师每日面试题精选,面试经历分享
- Spring MVC使用指示符重定向
- Oracle11g链接提示未“在本地计算机注册“OraOLEDB.Oracle”解决方法
- navicat mysql 还原_navicat如何给mysql还原数据库
- linux vim 粘贴 没有保持原来的格式,linux中的剪贴板用法,实现vim中原格式粘贴...
- 使用DotNetOpenAuth搭建OAuth2.0授权框架——Demo代码简单说明
- python进行中文文本聚类(切词以及Kmeans聚类)
- win8php7安装教程,8代处理器安装win7、win8.1教程
- 盘点,腾讯手机管家的那些你不知道的小功能。
- 20180511-面试感悟-要知其然还要知其所以然
- SAP ABAP ALV 布局 特定用户 及缺省设置控制
- RabbitMQ Management:Management API returned status code 500
- netty使用中的LEAK: ByteBuf.release() was not called before it‘s garbage-collected
- windows启动修复_如何使用Windows启动修复工具修复启动问题
- Docker网络管理
- 苹果将迎来2018年第四次新品发布季节,时间定为10月30日