LP线性规划初识

认识LP

线性规划(Linear Programming) 特指目标函数和约束条件皆为线性的最优化问题.

  • 目标函数: 多个变量形成的函数

  • 约束条件: 由多个等式/不等式形成的约束条件

  • 线性规划: 在线性约束条件下,目标函数求极值的问题

  • 可行解: 满足线性约束条件下的解

  • 可行域: 所有可行解构成的集合

  • 最优解: 使目标函数取得极值的可行解

线性

个人觉得最好理解是用向量了. 就是元素满足 加法和数乘 的形式

  • f(a+b)=f(a)+f(b)

  • f(ca)=cf(a),c

当然要理解上面两个等式可能需要去理解向量空间, 线性变换这些内容,嗯, 反正我自己已经懂了, 有时间可以分享.

定义模型的步骤

前提一定是线性的哈

  • 确定决策变量
  • 确定线性目标函数, 求max 或 min
  • 确定线性约束条件
  • 写出数学模型

case1

球队运作

需求:

需要补充7名球员, 每名球员有攻击值和防守值, 希望7名球员的进攻值大于500, 防守值大于400, 且要尽可能省钱.

战力值 防守值 价格(万)
进攻型 90 60 1000
平衡性 80 80 800
防守型 40 95 500

求解:

定义决策变量: 假设补充进攻型,防守型,平衡性各a,b,c名, 总价格为y万元,即

(s.t 即 subject to "受制于")

min y=1000a+800b+500c

s.t.

90a+80b+40c>=50060a+80b+95c>=400a+b+c=7a,b,c>=0

case2

采购方案

需求:

作为采购经理,有2000元经费, 需采购单价为50元的桌子若干和单价20元的椅子若干.

  • 桌椅总数尽可能多
  • 椅子数量不少于桌子, 且不多于桌子的1.5倍

求解:

定义决策变量: 购买x1张桌子, x2把椅子, 总数为y.

max y=x1+x2

s.t.

50x1+20x2<=20001.5x1>=x2x1<=x2x1,x2>=0

几何求解

  • 约束条件的交集构成可行域

  • 最优解即平行移动目标函数, 使其在可行域上达到截距最大

  • 而最优解, 就是再交集域的顶点, 而无需在内部考虑.(不用严格用什么向量,几何, 什么定比分店,证明,肯定是边界的顶点上嘛)

证明最优解在边界顶点

假设平面三角形域顶点分别为x1, x2, x3, 最优解x0在三角形内, 过顶点x1,和x0的直线与底边 x2-x3交于点x4.

通过中学学的定点分比, 对x0作分解

x0=

LP的标准形式

min cTxs.t. Ax<=bx>=0

  • x, c, 表列向量, cT是行向量, cTx表示线性组合

  • Ax=b 表示线性齐次方程组, A表示系数拒绝, x表列向量

  • if 目标函数是求max, 则 - max 即转为了求min

  • if 约束条件有 >= , 则 - (>=) 即转为了 <=

将case2 转为标准型

min y=x1+x2

s.t.

50x1+20x2<=20001.5x1+x2<=0x1x2<=0x1,x2>=0

将case2转为松弛型

  • 松弛型: 用等式约束来等价表述不等式约束

  • 松弛变量度量了等式约束与原不等式约束直接的松弛或差别

  • 其实就是为了求解方便呗

miny=x1x2

s.t.

50x1+20x2+a1=20001.5x1+x2+a2=0x1x2+a3=0x1,x2,a1,a2,a3>=0a1,a2,a3

(附) 证明最优解在边界顶点

假设平面三角形域顶点分别为x1, x2, x3, 最优解x0在三角形内, 过顶点x1,和x0的直线与底边 x2-x3交于点x4.

通过中学学的定比分点, 对x0作分解

x0=λ1x1+(1λ1)x4,λ1=||x0x1||/||x0x4||

x4=λ2x2+(1λ2)x3,λ2=c())

即:

x0=λ1x1+(1λ1)λ2x2+(1λ1)(1λ2)x3

其中 λ1+(1λ1)λ2+(1λ1)(1λ2)=1

假设 ctx1>=ctx2>=ctx3,:ctx0>=ctx1>=ctx2>=ctx3

即:

ctx0=x0=λ1ctx1+(1λ1)λ2ctx2+(1λ1)(1λ2)ctx3

>=ctx0=x0=λ1ctx1+(1λ1)λ2ctx1+(1λ1)(1λ2)ctx1

=ctx1

即说明最优解并不是 x0, 而是顶点x1, 不在内部哦.

posted @   致于数据科学家的小陈  阅读(836)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示

目录导航