提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


目录

前言

一、单纯形法理论基础

二、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实现相关推荐

  1. 线性规划单纯形法python实现与代码详细解读

    线性规划单纯形法python实现与代码详细解读 1 单纯形法(Simplex method) 2 编程思路 3 python实现原理解读 4 python代码 5 后记 1 单纯形法(Simplex ...

  2. 线性与非线性规划——单纯形法python实现

    线性与非线性规划--单纯形法python实现 单纯形法原理及python实现,时间:2022/1/11   本文不对单纯形方法进行讲解,若有需要请参照<最优化理论与算法第二版>(陈宝林著) ...

  3. 线性规划单纯形法python实现

    用python实现线性规划中的单纯形法 例题如下(已是标准形式): maxz=1500x1+1000x2max z=1500x_1+1000x_2maxz=1500x1​+1000x2​ {3x1+2 ...

  4. 单纯形法python程序_Python-linprog最小化误差单纯形法

    我在用scipy.optimize.linprog使用单纯形法计算最小化的库.我有两种情况下出错: "值错误:单纯形法的第1阶段未能找到可行的解决方案.伪目标函数的计算结果为3.1e-12, ...

  5. 数据洞察和数据分析_利用数据洞察力提高客户保留率

    数据洞察和数据分析 首先,让我们知道客户保留率是多少? (First of all, let us know what customer retention is?) It represents th ...

  6. python解非线性规划问题讲析_python中线性规划中的单纯形法、scipy库与非线性规划求解问题...

    单纯形法.scipy库与非线性规划求解问题 单纯形法的基本定义 大M法求解线性规划的原理 excel求解 Python调用optimize包和scipy求解线性规划 Python编程实现单纯形法 对比 ...

  7. 运筹学 | 线性规划求解算法 | 单纯形法的python实现

    单纯形法是在线性规划可行域的顶点中搜索最优解的算法,可以被分为三个步骤: 找到顶点 搜索顶点 判断在某顶点处是否最优 如何找到可行域的顶点? 存在由线性等式和不等式构成的多面体 P={X∈Rn∣∑j= ...

  8. python 实现对偶单纯形法

    昨天熬了一个通宵,女朋友写运筹学作业有个对偶单纯形法的题,据说是算了一天,感觉题无解,但是想确定一下,就很烦躁.我开始搜了一下,但是网上的代码都用不了,所以咱就研究了一下单纯形法和对偶单纯形法,用py ...

  9. 对偶单纯形法的Python实现

    对偶单纯形法的Python实现 编写背景 程序 输出 说明 缺点 编写背景 对偶单纯形法的算法原理在各个版本的<运筹学>教材中已经被阐述得很详细了,但是手工计算不仅繁琐,而且容易出错.编写 ...

最新文章

  1. Apache支持多端口配置处理
  2. Struts result param详细设置
  3. linux管理员常用的命令分享
  4. Hangfire 任务调度
  5. Java高级工程师每日面试题精选,面试经历分享
  6. Spring MVC使用指示符重定向
  7. Oracle11g链接提示未“在本地计算机注册“OraOLEDB.Oracle”解决方法
  8. navicat mysql 还原_navicat如何给mysql还原数据库
  9. linux vim 粘贴 没有保持原来的格式,linux中的剪贴板用法,实现vim中原格式粘贴...
  10. 使用DotNetOpenAuth搭建OAuth2.0授权框架——Demo代码简单说明
  11. python进行中文文本聚类(切词以及Kmeans聚类)
  12. win8php7安装教程,8代处理器安装win7、win8.1教程
  13. 盘点,腾讯手机管家的那些你不知道的小功能。
  14. 20180511-面试感悟-要知其然还要知其所以然
  15. SAP ABAP ALV 布局 特定用户 及缺省设置控制
  16. RabbitMQ Management:Management API returned status code 500
  17. netty使用中的LEAK: ByteBuf.release() was not called before it‘s garbage-collected
  18. windows启动修复_如何使用Windows启动修复工具修复启动问题
  19. Docker网络管理
  20. 苹果将迎来2018年第四次新品发布季节,时间定为10月30日

热门文章

  1. 地质灾害监测预警系统构成,功能,监测设备介绍
  2. ActiveMQ 原理分析—消息发送篇
  3. 安卓应用开发 MyWeChat(一)
  4. 小晶粒zsm分子筛合成表征实验报告_一种小晶粒zsm-5分子筛的合成方法
  5. 尚医通项目笔记--包括每个接口对应页面的图片
  6. css定位属性详解(position属性)
  7. mysql 垂直投影_垂直css文字
  8. iOS 10 新特性 大汇总 及iOS 10 的一些小问题和 xcode 8 的新版本小问题
  9. 哈理工OJ 1186 青蛙过河 (DP问题)
  10. Android 获取控件滑动速度,速度跟踪器VelocityTracker;