Excel和Python求解线性规划问题

一、线性规划的基本思想

为求解决策变量,需要将目标函数、约束条件表达为决策变量的函数式,若约束条件和目标函数都是线性的,即表示約束条件的数学式子都是线性等式或线性不等式,表示问题最优化指标的目标函数都昌线性函数,则该问题就是线性规划的问题。

例:已知 { x ≤ 0 x + 2 y ≥ 0 x − 2 y + 4 ≥ 0 \left\{\begin{aligned} x\leq 0 \\ x+2y \geq 0 \\ x-2y+4 \geq 0 \end{aligned} \right. x0x+2y0x2y+40 (线性约束条件), 求: x + y x+y x+y (线性目标函数)的最值。

解:令 x + y = t x+y=t x+y=t,则点 ( x , y ) (x,y) (x,y) 在 “三角形阴影” 和 "直线 y = − x + t y=-x+t y=x+t " 上,即 “阴影” 与 "直线 y = − x + t y=-x+t y=x+t" 有交点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GBNTcO3W-1617260435983)(E:%5Cdasan2%5C%E5%AE%9E%E9%AA%8C%E4%BD%9C%E4%B8%9A%5C%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%5C%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92%5C1617192808601.png)]

直线的截距为 t t t,易知直线过点A时得最大值 t m a x t_{max} tmax,直线过点B时得最小值 t m i n t_{min} tmin

所以 { x = 0 y = 2 \left\{\begin{aligned} x=0 \\ y=2 \end{aligned} \right. {x=0y=2 时, x + y x+y x+y 有最大值2, { x = − 2 y = 1 \left\{\begin{aligned} x=-2 \\ y=1 \end{aligned} \right. {x=2y=1 时, x + y x+y x+y 有最小值-1。

二、Excel求解线性规划

问题描述:
M a x Z = 60 x 1 + 20 x 2 + 40 x 3 + 30 x 4 s . t . { 4 x 1 + 2 x 2 + x 3 + 2 x 4 ≤ 600 ( 木 材 约 束 ) 6 x 1 + 2 x 2 + x 3 + 2 x 4 ≤ 1000 ( 玻 璃 约 束 ) 2 x 1 + 2 x 2 + 3 x 3 + 2 x 4 ≤ 400 ( 劳 动 时 间 约 束 ) x 1 ≤ 100 ( 家 具 1 需 求 量 约 束 ) x 2 ≤ 200 ( 家 具 2 需 求 量 约 束 ) x 3 ≤ 50 ( 家 具 3 需 求 量 约 束 ) x 4 ≤ 100 ( 家 具 4 需 求 量 约 束 ) x 1 , x 2 , x 3 , x 4 ≥ 0 ( 非 负 约 束 ) MaxZ = 60x_1 + 20x_2 + 40x_3 + 30x_4 \\ s.t.\left\{\begin{aligned} 4x_1 + 2x_2 + x_3 + 2x_4 \leq 600 \qquad (木材约束) \\ 6x_1 + 2x_2 + x_3 + 2x_4 \leq 1000 \qquad (玻璃约束) \\ 2x_1 + 2x_2 + 3x_3 + 2x_4 \leq 400 \qquad (劳动时间约束) \\ x_1 \leq 100 \qquad (家具1需求量约束) \\ x_2 \leq 200 \qquad (家具2需求量约束) \\ x_3 \leq 50 \qquad (家具3需求量约束) \\ x_4 \leq 100 \qquad (家具4需求量约束) \\ x_1,x_2,x_3,x_4 \geq 0 \qquad (非负约束) \end{aligned} \right. MaxZ=60x1+20x2+40x3+30x4s.t.4x1+2x2+x3+2x4600()6x1+2x2+x3+2x41000()2x1+2x2+3x3+2x4400()x1100(1)x2200(2)x350(3)x4100(4)x1,x2,x3,x40()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8zYzOa5W-1617260435992)(E:%5Cdasan2%5C%E5%AE%9E%E9%AA%8C%E4%BD%9C%E4%B8%9A%5C%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%5C%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92%5C1617205456268.png)]

劳动力约束:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0HL8w20Q-1617260435999)(E:%5Cdasan2%5C%E5%AE%9E%E9%AA%8C%E4%BD%9C%E4%B8%9A%5C%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%5C%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92%5C1617205480760.png)]

木材约束,玻璃约束,目标实际值添加方法一样

规划求解:

① 选择规划求解:

在这里插入图片描述

② 设置目标和可变单元格

在这里插入图片描述

③ 添加劳动力、木材、玻璃约束

在这里插入图片描述

④ 添加决策变量得约束

在这里插入图片描述

⑤ 求解方法选择:单纯线性规划

在这里插入图片描述

单纯形法的基本思路

单纯形法的基本思想是:先找出一个基本可行解,对它进行鉴别,看是否是最优解;若不是,则按照一定法则转换到另一改进的基本可行解,再鉴别;若仍不是,则再转换,按此重复进行。因基本可行解的个数有限,故经有限次转换必能得出问题的最优解。如果问题无最优解也可用此法判别。 根据单纯形法的原理,在线性规划问题中,决策变量(控制变量)x1,x2,…x n的值称为一个解,满足所有的约束条件的解称为可行解。使目标函数达到最大值(或最小值)的可行解称为最优解。这样,一个最优解能在整个由约束条件所确定的可行区域内使目标函数达到最大值(或最小值)。求解线性规划问题的目的就是要找出最优解。

单纯形法的解题步骤

  • 把线性规划问题的约束方程组表达成典范型方程组,典范型方程组要实现变量转换(所有变量为非负)、目标转换(统一为求极大值,若求极小值可乘以(-1))、约束转换(由不等式转化为等式)。然后,找出基本可行解作为初始基可行解。列出初始单纯形表。
  • 若基本可行解不存在,即约束条件有矛盾,则问题无解。
  • 若基本可行解存在,从初始基可行解作为起点,根据最优性条件和可行性条件,引入非基变量取代某一基变量,找出目标函数值更优的另一基本可行解。
  • 按步骤3进行迭代,直到对应检验数满足最优性条件(这时目标函数值不能再改善),即得到问题的最优解。
  • 若迭代过程中发现问题的目标函数值无界,则终止迭代。

⑥ 选择报告类型

在这里插入图片描述

最终求解的值

在这里插入图片描述

三、Python 编程实现【scipy库】

① 数据的约束向量

4  2  1  2  600
6  2  1  2  1000
2  2  3  2  400
1  0  0  0  100
0  1  0  0  200
0  0  1  0  50
0  0  0  1  100

② 导入所需库

from scipy import optimize
import numpy as np

③ 添加约束向量

c = np.array([60,20,40,30])
A_ub = np.array([[4,2,1,2],[6,2,1,2],[2,2,3,2],[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]])
B_ub = np.array([600,1000,400,100,200,50,100])

④ 求解

res =optimize.linprog(-c,A_ub,B_ub)
print(res)
  • 参数c:表示目标函数中的系数,一个一维的数组
  • 参数A_ub:该参数为可选参数,若线性规划问题中的约束条件含有不等式则使用该参数,A_ub是一个二维的矩阵(数组),它的每一行都代表一个不等式的系数
  • 参数b_ub:该参数为可选参数,对应上面的系数矩阵,是一个一维的列向量

在这里插入图片描述

由此可见,excel 和 python编程求解线性规划问题,所得的最优解结果一致

四、参考🔗

<think>好的,我现在需要准备一个关于使用Python求解线性规划的案例讲解。用户之前询问了LingoExcel联动的案例,现在转向Python,可能希望了解如何用Python替代或补充之前的工具。首先,我需要确定用户的需:他们可能想要一个具体的例子,展示Python在解决非线性规划问题上的应用,包括代码示例步骤说明。 首先,我应该回顾非线性规划的基本概念,确保用户理解什么是非线性规划。然后,选择Python中常用的库,比如SciPy的minimize函数,或者更专业的库如Pyomo、GEKKO。考虑到用户可能更倾向于使用广泛应用的库,SciPy可能更合适,因为它不需要额外安装复杂的求解器,而PyomoGEKKO可能需要更多的配置。 接下来,我需要设计一个具体的案例。生产计划优化、投资组合优化或者工程优化问题都是不错的选择。生产计划优化可能之前的Lingo案例呼应,但为了展示非线性,可能需要加入非线性约束或目标函数。例如,利润最大化问题,其中成本或收益函数是非线性的。 案例设计方面,假设一个公司生产两种产品,受到资源约束,但单位利润随着产量增加而递减,这样目标函数就变成非线性的。例如,利润函数可能是二次函数,这样最大化利润就变成了一个非线性问题。 然后,分步骤讲解如何用Python建模求解这个问题。步骤包括问题定义、导入库、定义目标函数约束、设置初始猜测、调用求解器、结果分析。需要确保代码正确,并且解释清楚每个部分的作用。 需要注意的地方包括:正确设置约束的格式,使用适当的求解(比如SLSQP),处理不等式约束,以及解释返回的结果对象中的各个属性,如是否成功、最优解值、迭代次数等。 可能用户会遇到的常见问题包括:初始猜测的选择影响求解结果,约束条件的正确形式,以及如何处理不等式等式约束。在解释时需要提到这些点,帮助用户避免错误。 另外,可能需要对比PythonLingo在处理非线性规划时的优缺点,比如灵活性、易用性、求解速度等,但用户可能更关注如何用Python实现,所以这部分可以作为补充,而不是重点。 最后,确保案例的可复现性,用户能够复制代码并运行,得到预期的结果。需要检查代码中的变量名是否正确,缩进是否合适,特别是Python对缩进敏感,避免因为格式问题导致用户运行出错。 总结来说,步骤应该是: 1. 介绍非线性规划问题。 2. 选择合适的Python库(SciPy)。 3. 构建具体的非线性规划案例。 4. 分步编写代码并解释。 5. 分析结果注意事项。 6. 可能的扩展进一步学习资源。 在写作过程中,需要保持语言简洁,结构清晰,代码注释充分,并确保数学公式用LaTeX正确表示,符合用户之前的系统级指令要。同时,注意使用中文,避免专业术语过于晦涩,必要时进行解释。</think>### Python求解线性规划案例详解 非线性规划(Nonlinear Programming, NLP)是指目标函数或约束条件中至少有一个为非线性表达式的最优化问题Python凭借丰富的科学计算库(如SciPy、Pyomo等)可高效解决此类问题。以下通过一个**产品利润最大化**案例说明具体操作流程: --- #### **案例背景** 某工厂生产两种产品(P1、P2),受原料市场需限制。**单位利润随产量增加非线性递减**(规模不经济),需确定最优产量使总利润最大。 已知条件: - **原料约束**:总原料消耗 ≤ 100吨 $$2x_1 + 3x_2 \leq 100$$ - **市场需**: $$x_1 \leq 40, \quad x_2 \leq 30$$ - **利润函数**(非线性): $$\text{总利润} = 50x_1 - 0.5x_1^2 + 70x_2 - x_2^2$$ --- #### **步骤1:导入SciPy库** SciPy的`minimize`函数支持多种非线性优化算(如SLSQP、COBYLA)。 ```python from scipy.optimize import minimize import numpy as np ``` --- #### **步骤2:定义目标函数** 将最大化问题转化为最小化问题(乘以-1): ```python def objective(x): x1, x2 = x profit = 50*x1 - 0.5*x1**2 + 70*x2 - x2**2 return -profit # 最大化问题转为最小化 ``` --- #### **步骤3:设置约束条件** 使用字典定义不等式变量边界: ```python # 不等式约束(格式:g(x) >= 0) constraints = [ {'type': 'ineq', 'fun': lambda x: 100 - (2*x[0] + 3*x[1])}, # 原料约束 {'type': 'ineq', 'fun': lambda x: 40 - x[0]}, # P1市场需 {'type': 'ineq', 'fun': lambda x: 30 - x[1]} # P2市场需 ] # 变量非负约束(通过bounds实现) bounds = [(0, None), (0, None)] # x1≥0, x2≥0 ``` --- #### **步骤4:求解结果分析** 选择SLSQP算,设置初始猜测值: ```python initial_guess = [0, 0] # 初始猜测值(可调整) result = minimize(objective, initial_guess, method='SLSQP', bounds=bounds, constraints=constraints) # 输出结果 print("最优解:") print(f"P1产量 = {result.x[0]:.2f}, P2产量 = {result.x[1]:.2f}") print(f"最大利润 = {-result.fun:.2f}") # 注意取反还原利润值 print("求解状态:", result.message) ``` --- #### **步骤5:运行结果示例** ``` 最优解: P1产量 = 15.00, P2产量 = 23.33 最大利润 = 2025.83 求解状态: Optimization terminated successfully ``` --- #### **关键点解析** 1. **算选择**: - `SLSQP`(Sequential Least Squares Programming)适合带约束的非线性问题。 - 其他选项:`COBYLA`(无需梯度)、`trust-constr`(高精度复杂问题)。 2. **约束定义技巧**: - 不等式需转换为标准形式 $$g(x) \geq 0$$。 - 等式约束使用 `{'type': 'eq', 'fun': ...}`。 3. **初始值影响**: - 不同初始猜测可能导致不同局部最优解,复杂问题需多次尝试。 --- #### **扩展应用** 1. **工程优化**:机械设计参数优化(如最小化材料成本)。 2. **金融建模**:投资组合风险-收益非线性平衡。 3. **能源调度**:考虑发电效率曲线的电力分配。 --- #### **对比LingoPython** | 工具 | 优点 | 局限性 | |------------|-----------------------------|---------------------| | Lingo | 语简洁,内置专业求解器 | 商业软件,扩展性有限 | | Python | 开源免费,可集成机器学习/深度学习库 | 复杂模型需手动调参 | --- #### **注意事项** - **梯度提供**:若目标函数复杂,可提供梯度(`jac`参数)加速收敛。 - **结果验证**:检查`result.success`确保求解成功,避免误用失败结果。 - **性能优化**:变量较多时,考虑使用符号计算库(如SymPy)自动生成梯度。 通过上述案例,Python展示了处理非线性规划问题的灵活性实用性。开发者可通过替换目标函数约束条件,快速适配不同业务场景。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值