python最优化算法实战---线性规划之单纯形法

6 篇文章 1 订阅
订阅专栏

1.线性规划的标准型

在线性规划求解的方法中,模型的标准形式需要满足一下几个条件:

(1)目标函数求最大值

(2)约束条件为等式约束

(3)约束条件右边的常数项大于或等于0

(4)所有变量大于或等于0

对于非标准形式的模型,约束方程可以通过引入松弛变量使不等式约束转换为等式约束,如下所示,将一个非标准形式的模型转化为标准形式的模型。

2.单纯形法 

2.1单纯形法的原理

线性规划模型中目标函数和约束方程都是凸函数,从凸优化的角度来讲,线性规划的最优解在可行域的顶点上,单纯形法的本质就是通过矩阵的线性变化来遍历这些顶点以计算最优解。

1.什么是凸集合?

假设有一个集合s,如果该集合中的任意两个顶点以及连接这两个顶点的线段都属于s集合,则集合s被称为凸集。如下图所示,图左边为非凸集,右边为凸集。

2.什么是凸函数?

定义在凸集上的函数被称为凸函数。(这就是为什么目标函数和约束方程都是凸函数的原因)

2.2单纯形法的求解过程 

2.2.1 规范型

要用单纯型法求解线性规划数学模型,还需要把模型转换为规范型,而规范型需要满足以下条件。

(1)数学模型已是标准型

(2)约束方程组系数矩阵中含有至少一个单位子矩阵,对应的变量成为基变量,基的作用是得到初始基本可行解

(3)目标函数中不含基变量

2.2.2 单纯形法的具体计算过程

1.确定基本初始可行解

利用规范型的数学模型,整理出目标函数和约束方程的形式。(我们以最初的模型为例子)

 此时顶点的位置是原点,初始的单纯型表如下所示。

2.判断当前点X是否是最优解

对于最大化问题,若当前目标函数中非基变量的系数小于等于0时,则所得的解为最优解。而在当前的例子中,非基变量的系数分别为70和30,意味着在可行域内随着非基变量x1和x2的增大,目标函数就会继续增大,因此当前的解不是最优解。故判断当前所得的解是否为最优解时,只需判断目标函数中非基变量的系数是否小于等于0。

3.基变量出基与非基变量入基

变量的出基与入基,在几何图像上表现为顶点的变化。入基的规则为选择使目标函数z变化最快的非基变量入基,即选择系数最大且为正数的非基变量入基,故在本例中选择x1入基。出基的规则则需要引入一个新的量θ,θ=b/ai(ai为非基变量系数,ai的选择的是刚刚入基的非基变量的系数),选择最小的θ出基。

如上表所示,选择基变量x5出基。

第一次迭代,经过x1入基与x5出基的运算后,得到的结果如下所示。

令非基变量的值为0,则得到第一次迭代的解,如下所示

判断该解是否为最优解(重复第二个步骤,直到是最优解为止),显然由于非基变量x2的系数大于0,故当前位置还不是最优解,再次重复步骤3。

1.非基变量如何入基?

我们以上述例子示范,第一次迭代时,当判断x1入基,x5出基时,找到表中x1和x5对应的列,将x5替换为x1,然后将这一纵列的值转换为(0,0,1),具体过程如下图所示。

2.如何更新目标函数? 

当我们完成非基变量的入基后,可以得到跌倒后的约束条件,同样以上述例子来讲解,具体过程如下图所示。

实际上,我们同样可以使用矩阵的初等变化来得到相对于的目标函数。

同样的方法,可以看出x2入基,列出出基计算表。

可以看出x4对应的θ最小,所以选择x4出基。

第二次迭代,x2入基,x4出基,得到的结果如下表所示。

 得到当前的可行解为

判断该解是否为最优解,由于非基变量在目标函数中的系数均小于0,所以该解即为当前模型的最优解。

单纯法的搜索路径如下图所示。

 3.单纯型法代码

import pandas as pd
import numpy as np

"""
系数矩阵的形式:
       b  x1  x2  x3  x4  x5
obj    0  70  30   0   0   0
x3   540   3   9   1   0   0
x4   450   5   5   0   1   0
x5   720   9   3   0   0   1

①第一行是目标函数的系数,第2~4行是约束条件的系数
②第一列是约束方程的常数项
③对于目标函数的更新我们同样采用矩阵的变换,所以obj对应的第一列表示的是目标函数的相反数
"""

"""
运行如下代码后得到的结果如下所示

最终的最优单纯性法是:
        b  x1   x2  x3   x4        x5
obj -5700   0  0.0   0 -2.0 -6.666667
x3    180   0  0.0   1 -2.4  1.000000
x2     15   0  1.0   0  0.3 -0.166667
x1     75   1  0.0   0 -0.1  0.166667
目标函数的值: 5700
最优决策变量是:
x1 = 75
x2 = 15
"""

matrix = pd.DataFrame(
    data=np.array([
        [0,70,30,0,0,0],
        [540,3,9,1,0,0],
        [450,5,5,0,1,0],
        [720,9,3,0,0,1]
    ]),
    index=['obj','x3','x4','x5'],
    columns=['b','x1','x2','x3','x4','x5']
)

# 判断检验数是否大于0
c = matrix.iloc[0, 1:]
while c.max() > 0:
    c = matrix.iloc[0, 1:]
    # 选择入基的变量
    in_x = c.idxmax() # 该函数运行的结果是x1,即入基变量
    in_x_v = c[in_x]  # 得到入基变量的系数

    # 选择出基变量,即要计算θ的值,并比较大小
    b = matrix.iloc[1:,0]
    # 选择入基变量对应的列
    in_x_a = matrix.iloc[1:][in_x]
    # 得到出基变量
    out_x = (b/in_x_a).idxmin()

    # 完成入基和出基的操作,即对矩阵做初等行变化
    matrix.loc[out_x,:] = matrix.loc[out_x,:] / matrix.loc[out_x][in_x]
    for idx in matrix.index:
        if idx != out_x:
            matrix.loc[idx, :] = matrix.loc[idx, :] - matrix.loc[out_x, :]*matrix.loc[idx,in_x]

    # 索引变换
    index = matrix.index.tolist() # 得到所以行索引的值
    i = index.index(out_x) # 得到出基变量的下标
    index[i] = in_x
    matrix.index = index

# 输出结果
print("最终的最优单纯性法是:")
print(matrix)
print("目标函数的值:",- matrix.iloc[0,0])

# 列的数量减去行的数量得到非基变量的数量,且非基变量一定是下标在前的变量
# 比如非基变量的个数为2,则非基变量一定是x1,x2
print("最优决策变量是:")
x_count = (matrix.shape[1] - 1) - (matrix.shape[0] - 1)
X = matrix.iloc[0, 1:].index.tolist()[:x_count]
for xi in X:
    print(xi,"=",matrix.loc[xi,'b'])

以上即是对单纯形法的简单概述,内容参考书目《python最优化算法实战》,笔者认为这一部分书中的计算存在问题,如有错误还请批评指正。

运筹学 | 线性规划求解算法 | 单纯形法python实现
qq_42070741的博客
01-05 2493
单纯形法是在线性规划可行域的顶点中搜索最优解的算法,可以被分为三个步骤: 找到顶点 搜索顶点 判断在某顶点处是否最优 如何找到可行域的顶点? 存在由线性等式和不等式构成的多面体 P={X∈Rn∣∑j=1nPjxj=b,X≥0}P = \{X \in R^n | \sum_{j=1}^n P_jx_j = \boldsymbol b, X\geq \boldsymbol 0 \}P={X∈Rn∣∑j=1n​Pj​xj​=b,X≥0} ,若X是一个基本解且满足所有约束条件,则称X是一个基本可行解. 线性
python线性规划问题讲析_python线性规划中的单纯形法、scipy库与非线性规划求解问题...
weixin_33140481的博客
01-14 480
单纯形法的基本定义单纯形法的基本定义:一般线性规划问题中当线性方程组的变量数大于方程个数,这时会有不定数量的解,而单纯形法是求解线性规划问题的通用方法。 具体步骤是,从线性方程组找出一个个的单纯形,每一个单纯形可以求得一组解,然后再判断该解使目标函数值是增大还是变小了,决定下一步选择的单纯形。通过优化迭代,直到目标函数实现最大或最小值。 换而言之,单纯形法就是秉承“保证每一次迭代比前一次更优”的基...
单纯形法讲解及Python代码实现
qq_41133375的博客
04-20 1万+
单纯形法讲解及Python代码实现一、了解单纯形法1.单纯形法的原理2.方法步骤二、例题讲解三、使用Python代码求单纯形法求解线性规划最优解和最大值 一、了解单纯形法 1.单纯形法的原理 单纯形法是一种迭代算法,其基本原理及主要步骤是:首先设法找到一个(初始)基可行解,然后再根据最优性理论判断这个基可行解是否最优解。若是最优解,则输出结果,计算停止;若不是最优解,则设法由当前的基可行内解产生一...
用大M法的excel求解、python编程求解和python包分别求解线性规划中的单纯形法
mango
04-18 1960
实验目录一、单纯形法和拉格朗日乘子法介绍二、线性规划中的单纯形法、大M法的excel求解、python编程求解和python包求解;1. 大M法的excel求解2.“规划求解”包做3.python编程求解4.python包scipy求解5.前4种的结果对比与总结 一、单纯形法和拉格朗日乘子法介绍 单纯形法 它是一种解线性规划多变量模型的常用方法,是通过一种数学的迭代过程,逐步求得最优解的方...
Python求解最优化问题
2401_83470102的博客
04-30 386
例如,我们想要求解函数f(x)=x^2 在x大于等于1,小于等于5 的范围内的最小值。在优化器对象中,我们可以使用 fun 参数来设置目标函数,使用 constraints 参数来设置约束条件。最后,我们可以从优化器的结果中获取最优解和最优值。在scipy中,最优解可以通过resutx 获取,最优值可以通过 result.fun 获取。不等式约束可以通过将约束函数的输出小于等于零或大于等于零来表示,例如 h(x)= 0。如果我们的问题是约束优化问题,我们需要定义约束条件。
基于python实现的单纯形方法(线性规划
最新发布
qq_41506164的博客
05-19 213
自己尝试看课本单纯形法步骤实现的,目前有些不是很完善的地方,比如当我把x1范围限制在2-4之间,求解出来的x1结果不符合约束要求。
python、java】纯手写单纯形表求解线性规划【附源码】
mazha12143的博客
01-16 1408
单纯形法实现代码Python版Java版,完整代码提供。
Python求解线性规划问题
热门推荐
简说Python的博客
03-12 2万+
线性规划简介及数学模型表示线性规划简介一个典型的线性规划问题线性规划模型的三要素线性规划模型的数学表示图解法和单纯形法图解法单纯形法使用python求解...
Python学习之单纯形法1.0
不服输的小乌龟
09-07 487
Python学习之单纯形法1.0
python语言编写单纯形法
m0_48602434的博客
01-31 505
代码适用于解唯一最优解、多重解的简单线性规划问题。
Python求解线性规划问题-两阶段法实现的单纯形法
05-09
Python求解线性规划问题_两阶段法实现的单纯形法,包括.py和.ipynb两种格式,用Jupyter Notebook打开.ipynb或者用Python软件打开.py都可成功运行,压缩包中包括测试数据,代码可输出唯一解,无穷多解,无界解,无解...
simplex-algorithm-单纯形法
09-09
simplex-algorithm 运筹学 单纯形法 使用Python实现 simplex-algorithm 运筹学 单纯形法 使用Python实现
python 寻找优化使成本函数最小的最优解的方法
09-20
主要介绍了python 寻找优化使成本函数最小的最优解的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
单纯形法源代码
10-13
单纯形法具体步骤是,从线性方程组找出一个个的单纯形,每一个单纯形可以求得一组解,然后再判断该解使目标函数值是增大还是变小了,决定下一步选择的单纯形。通过优化迭代,直到目标函数实现最大或最小值。
优化-线性规划单纯形法-大M法和两阶段法程序实现.rar
06-14
线性规划单纯形法-大M法和两阶段法程序实现(MATLAB)。程序有详细的注释。通俗易懂。 程序共有三个函数:main函数、twophase.m函数、MySimplex_method.m函数。 其中twophase.m函数是利用两阶段单纯形法。MySimplex...
优化算法python实现篇(1)——进退法
12-21
优化算法python实现篇(1)——进退法算法简介算法适用问题python实现示例运行结果 算法简介 进退法的用途是为一维极值优化问题寻找到一个包含极值的单峰区间,即从一点出发,试图搜索到使函数呈现“高-低-高”的...
线性规划-单纯形法-窗体实现(python)
03-27
python窗体实现线性规划中的单纯形法,其中包含一个主要实现单纯形算法的LPtable.py和实现tkinter窗体输入的test1.py。使用时直接在后者中点运行即可。
Python蓝鲸优化算法woa-master.zip
10-30
Python蓝鲸优化算法
美赛python学习d5--线性规划
qq_51059141的博客
01-15 1096
线性规划 线性规划的目的 确定多变量线性函数在变量满足线性约束条件下的最优值 线性规划模型需要确定的三个要素 决策变量 目标函数:决策者希望对其优化的指标,是决策变量的线性函数 约束条件:决策变量取值的限制范围 线性规划的一般模型 ...
python单纯形法
09-06
Python单纯形法是一种用于求解线性规划问题的方法。它通过迭代计算来找到线性规划问题的最优解和最大值。单纯形法的步骤可以分为以下几个部分: 1. 首先,需要了解单纯形法的原理和方法步骤。可以参考引用中提供的讲解和代码实现来学习单纯形法的基本原理和方法步骤。 2. 其次,根据具体的线性规划问题,使用Python编写代码来实现单纯形法。可以参考引用中提供的Python代码来编写自己的代码。代码中包括了定义线性回归系数模型、定义基变量函数、求解线性规划问题的主要函数等。 3. 最后,运行编写的Python代码,输入线性规划问题的相关数据,即可求解出线性规划问题的最优解和最大值。可以根据需要进行输出和打印结果。 总之,Python单纯形法是一种常用的求解线性规划问题的方法,可以通过编写Python代码来实现,并得到相应的结果。可以根据引用和引用中提供的内容来学习和应用单纯形法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [单纯形法讲解及Python代码实现](https://blog.csdn.net/qq_41133375/article/details/105620784)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 用C语言实现一个简单的管理系统 8413
  • 深入辨析c语言中运算符的优先级问题 6305
  • python最优化算法实战---线性规划之单纯形法 4581
  • python最优化算法实战---线性规划之内点法 4365
  • 关于springSecurity配置不生效的问题 2583

分类专栏

  • 数据流
  • 开发工具 6篇
  • 考研 4篇
  • C/C++ 10篇
  • ssm 6篇
  • web 7篇
  • 算法和数据结构 18篇
  • java 4篇
  • java并发编程的艺术 1篇
  • MySQL 6篇

最新评论

  • 动态规划(1)------ 背包动规

    tbywt: 写的相当到位,看懂了

  • python最优化算法实战---线性规划之内点法

    浅﹋色调 はんご: 你的代码有部分问题,我修改之后精度有很大提升

  • python最优化算法实战---线性规划之内点法

    Ash_001: 想问下楼主求偏导和下面牛顿法迭代这两块代码可以结合吗?我他们移到一个代码里出现了好多错误....

  • python最优化算法实战---线性规划之内点法

    Uoyaij_: 那这样的话误差会很大呀,局限性太强了。如果一个需求需要计算最大,虽然求解速度快但用内点法反而不稳定。

  • 动态规划(1)------ 背包动规

    爱吃卷心菜的搞笑男: 看完我又感觉自己行了

最新文章

  • 深度学习编译器入门篇
  • 关于u盘分区的删除
  • python最优化算法实战---线性规划之内点法
2023年1篇
2022年3篇
2021年15篇
2020年36篇
2019年5篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码南联网站搭建吉祥百姓网标王推广盐田百度网站优化坂田百度关键词包年推广沙井网站优化排名大芬网站定制双龙网络推广同乐建站荷坳百度标王大浪如何制作网站双龙网站优化推广同乐网站建设设计塘坑品牌网站设计永湖网站seo优化西乡百度竞价包年推广坪山百度网站优化龙岗网站建设宝安网站定制广州网站推广工具坪地设计公司网站大鹏百度竞价包年推广光明网站推广系统同乐百度关键词包年推广龙岗营销网站松岗阿里店铺运营大运高端网站设计大芬网站推广方案大芬网站制作南山企业网站建设爱联模板推广歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化