规划模型的概念
如何来分配有限资源,从而达到人们期望目标的优化分配数学模型,它在数学建模中处于中心地位。
这类问题一般可以归结为数学规划模型,规划模型的应用极为广泛,其作用已为越来越多的人所重视
规划模型是数学建模竞赛中最常见的一类数学模型
规划模型的数学描述
将一个优化问题用数学式子来描述,即求函数
u=f(x)x=(x1,x2,…,xn)
u=f(x)\qquad x=(x_{1},x_{2},\dots,x_{n})
u=f(x)x=(x1,x2,…,xn)
xxx是一个向量
在约束条件
hi(x)=0,i=1,2,3,…,m
h_{i}(x)=0,i=1,2,3,\dots,m
hi(x)=0,i=1,2,3,…,m
m个等式和
gj(x)≤0(gj(x)≥0),j=1,2,…,p
g_{j}(x)\le 0(g_{j}(x)\ge 0),j=1,2,\dots ,p
gj(x)≤0(gj(x)≥0),j=1,2,…,p
p个不等式
u=f(x)u=f(x)u=f(x)这个函数,在一组等式和一组不等式的约束下,来取最大值或最小值
x→决策变量f(x)→目标函数x∈可行域
\begin{array}{}
x \to 决策变量 \\
f(x) \to 目标函数 \\
x \in 可行域
\end{array}
x→决策变量f(x)→目标函数x∈可行域
整理一下
一个规划问题的数学模型可表示为min(ormax)u=f(x)x∈Ωs.t.hi(x)=0,i=1,2,3,…,m.gj(x)≤0(gj(x)≥0),j=1,2,…,p.
\begin{array}{}
一个规划问题的数学模型可表示为 \\
min(or\quad max)u=f(x)\quad x\in \Omega \\
s.t.\quad h_{i}(x)=0,i=1,2,3,\dots,m. \\
g_{j}(x)\le 0(g_{j}(x)\ge 0),j=1,2,\dots ,p.
\end{array}
一个规划问题的数学模型可表示为min(ormax)u=f(x)x∈Ωs.t.hi(x)=0,i=1,2,3,…,m.gj(x)≤0(gj(x)≥0),j=1,2,…,p.
- u=f(x)u=f(x)u=f(x)是目标函数
- xxx是决策变量
- h(x)和g(x)h(x)和g(x)h(x)和g(x)分别为等式约束和不等式约束,统称为约束条件
- s.t.就是subject to,受约束于的意思
规划模型的分类
- 根据是否存在约束条件
- 有约束问题
- 无约束问题
- 根据决策变量的性质
- 静态问题
- 动态问题
- 根据目标函数和约束条件表达式的性质
- 线性规划
- 非线性规划
- 二次规划
- 多目标规划
- 根据决策变量的允许值
- 整数规划(0-1)
- 实数规划
建立规划模型的一般步骤
- 确定决策变量
- 确定目标函数的表达式
- 寻找约束条件
线性规划模型
线性规划模型的一般形式
若在如下的模型中,f(x),hi(x),gi(x),i=1,2,…,m,j=1,2,…,pf(x),h_{i}(x),g_{i}(x),i=1,2,\dots,m,j=1,2,\dots,pf(x),hi(x),gi(x),i=1,2,…,m,j=1,2,…,p,均为线性函数,则称该模型为线性规划模型
max(或min)z=c1x1+c2x2+⋯+cnxns.t.{a11x1+a12x2+⋯+a1nxn(≤=≥)b1a21x1+a22x2+⋯+a2nxn(≤=≥)b2…am1x1+am2x2+⋯+amnxn(≤=≥)bmxj≥0(j=1,2,…,n)
\begin{array}{}
max(或min)z=c_{1}x_{1}+c_{2}x_{2}+\dots+c_{n}x_{n} \\
s.t.\quad \left\{\begin{matrix}
a_{11}x_{1}+a_{12}x_{2}+\dots+a_{1n}x_{n}(\le=\ge)b_{1} \\
a_{21}x_{1}+a_{22}x_{2}+\dots+a_{2n}x_{n}(\le=\ge)b_{2} \\
\dots \\
a_{m1}x_{1}+a_{m2}x_{2}+\dots+a_{mn}x_{n}(\le=\ge)b_{m}
\end{matrix}\right. \\
x_{j}\ge 0(j=1,2,\dots,n)
\end{array}
max(或min)z=c1x1+c2x2+⋯+cnxns.t.⎩⎨⎧a11x1+a12x2+⋯+a1nxn(≤=≥)b1a21x1+a22x2+⋯+a2nxn(≤=≥)b2…am1x1+am2x2+⋯+amnxn(≤=≥)bmxj≥0(j=1,2,…,n)
- 把目标函数写成线性表达式
- xjx_{j}xj是决策变量
- 约束条件里不管是等式还是不等式,都是线性函数
- 如同线代里的线性方程组
- 如果xjx_{j}xj不是实数取值,是整数取值,又称为整数线性规划
建立线性规划模型的通常步骤
- 确定决策变量:
是模型要确定的未知变量,最重要的参数,是决策者解决实际问题的控制变量 - 确定目标函数:
目标函数决定线性规划问题的优化方向,是重要的组成部分。
实际问题的目标可表示为决策变量的一个线性函数,并根据实际问题的优化方向求其最大化或最小化 - 确定约束方程:
通过约束方程来描述和反映一系列客观描述条件或环境的限制,这些限制通过一系列线性等式或不等式方程组来描述 - 变量取值限制:
一般情况下,决策变量取正值(或负值)。因此,模型中应有变量的非负约束即xj≤0x_{j}\le 0xj≤0。
任务分配问题
![![[Pasted image 20240807081425.png]]](https://i-blog.csdnimg.cn/direct/4e594aa2086e4769a02adceddd4bf8b5.png)
![![[Pasted image 20240807081455.png]]](https://i-blog.csdnimg.cn/direct/d9b16a2fbf384344931d1c49f037c79c.png)
- 决策变量,设甲车床,生产工件1x1x_{1}x1件,生产工件2x2x_{2}x2件,生产工件3x3x_{3}x3件,乙车床,生产工件1x4x_{4}x4件,生产工件2x5x_{5}x5件,生产工件3x6x_{6}x6件
- 目标函数是希望加工费用最低
min z=13x1+9x2+10x3+11x4+12x5+8x6 min\ z=13x_{1}+9x_{2}+10x_{3}+11x_{4}+12x_{5}+8x_{6} min z=13x1+9x2+10x3+11x4+12x5+8x6 - 约束条件:台时的限制和加工工件数量的限制
0.4x1+1.1x2+1.0x3≤8000.5x4+1.2x5+1.3x6≤900x1+x4=400x2+x5=600x3+x6=500x1,x2,x3,x4,x5,x6≥0 \begin{array}{} 0.4x_{1}+1.1x_{2}+1.0x_{3}\le 800 \\ 0.5x_{4}+1.2x_{5}+1.3x_{6}\le 900 \\ x_{1}+x_{4}=400 \\ x_{2}+x_{5}=600 \\ x_{3}+x_{6}=500 \\ x_{1},x_{2},x_{3},x_{4},x_{5},x_{6}\ge 0 \end{array} 0.4x1+1.1x2+1.0x3≤8000.5x4+1.2x5+1.3x6≤900x1+x4=400x2+x5=600x3+x6=500x1,x2,x3,x4,x5,x6≥0
解
设在甲车床上加工工件1、2、3的数量分别为x1,x2,x3x_{1},x_{2},x_{3}x1,x2,x3,在乙车床上加工工件1、2、3的数量分别为x4,x5,x6x_{4},x_{5},x_{6}x4,x5,x6,可建立以下线性规划模型
min z=13x1+9x2+10x3+11x4+12x5+8x6s.t.{x1+x4=400x2+x5=600x3+x6=5000.4x1+1.1x2+1.0x3≤8000.5x4+1.2x5+1.3x6≤900xi≥0,i=1,2,…,6 \begin{array}{} min\ z=13x_{1}+9x_{2}+10x_{3}+11x_{4}+12x_{5}+8x_{6} \\ s.t. \left\{\begin{matrix} x_{1}+x_{4}=400 \\ x_{2}+x_{5}=600 \\ x_{3}+x_{6}=500 \\ 0.4x_{1}+1.1x_{2}+1.0x_{3}\le 800 \\ 0.5x_{4}+1.2x_{5}+1.3x_{6}\le 900 \\ x_{i}\ge 0,i=1,2,\dots ,6 \end{matrix}\right. \end{array} min z=13x1+9x2+10x3+11x4+12x5+8x6s.t.⎩⎨⎧x1+x4=400x2+x5=600x3+x6=5000.4x1+1.1x2+1.0x3≤8000.5x4+1.2x5+1.3x6≤900xi≥0,i=1,2,…,6
加工奶制品的生产计划
![![[Pasted image 20240807084035.png]]](https://i-blog.csdnimg.cn/direct/8b697617c0f845469d30ac97c9906804.png)
![![[Pasted image 20240807084341.png]]](https://i-blog.csdnimg.cn/direct/459432b536ba4ca0a312fc8cead43f9c.png)
- 决策变量,这50桶里面,多少桶生产A1A_{1}A1多少桶生产A2A_{2}A2
x1x_{1}x1桶生产A1A_{1}A1,x2x_{2}x2桶,生产A2A_{2}A2 - 目标函数:A1A_{1}A1获利24⋅3x124\cdot 3x_{1}24⋅3x1,A2A_{2}A2获利16⋅4x216\cdot 4x_{2}16⋅4x2
max z=72x1+64x2 max\ z=72x_{1}+64x_{2} max z=72x1+64x2 - 约束条件:
牛奶供应的限制,每天50桶
x1+x2≤50 x_{1}+x_{2}\le 50 x1+x2≤50
劳动时间的限制,每天480工时
12x1+8x2≤480 12x_{1}+8x_{2}\le 480 12x1+8x2≤480
A1A_{1}A1每天最多生产100公斤
3x1≤100 3x_{1}\le 100 3x1≤100
非负约束
x1,x2≥0 x_{1},x_{2}\ge 0 x1,x2≥0
线性规划模型的求解
简单线性规划模型的求解
对于一般只有两个决策变量的简单线性规划模型,可以通过图解法进行求解
l1:x1+x2=50l2:12x1+8x2=480l3:3x1=100l1:x1=0,l5:x2=0
\begin{array}{}
l_{1}: x_{1}+x_{2}=50 \\
l_{2}: 12x_{1}+8x_{2}=480 \\
l_{3}: 3x_{1}=100 \\
l_{1}: x_{1}=0,l_{5}:x_{2}=0
\end{array}
l1:x1+x2=50l2:12x1+8x2=480l3:3x1=100l1:x1=0,l5:x2=0
![![[Pasted image 20240807181054.png]]](https://i-blog.csdnimg.cn/direct/3b3cdb4abbd94361b7b5fe076d566cad.png)
在B(20,30)取得最优解
目标函数和约束条件是线性函数,可行域为直线段围成的凸多边形,目标函数的等值线为直线
最优解一定在凸多边形的某一个顶点取得
线性规划模型的软件求解
有许多求解数学规划模型的多种软件,如Matlab,Lingo,Excel,其中Lingo编程简单,易于操作,求解速度快,是求解规划模型的主要手段
Lingo编程入门
Lingo主要功能特色
- 既能解决线性规划问题,也有较强的求解非线性规划问题的能力
- 输入模型简练直观
- 运行速度快,计算能力强
- 内置建模语言,提供几十个内部函数,从而能以较少语句,较直观的方式描述较大规模的优化模型
- 将集合概念引入编程语言,很容易将实际问题转换为Lingo模型
- 能方便地与Excel、数据库等其他软件交换数据
需要注意的几个基本问题
- 尽量使用实数优化,减少整数约束和整数变量
- 尽量使用光滑优化,减少非光滑约束的个数
尽量少使用绝对值,符号函数,变量求最大最小值,四舍五入,取整函数 - 尽量使用线性模型,减少非线性约束和非线性变量的个数
- 合理设定变量上下界,尽可能给出变量初始值
- 模型中使用的参数数量级要适当(小于10310^{3}103)
需要注意的几个方面
- 正确阅读求解报告Solution Report
- 了解敏感性分析Range Report
- 集合的应用SETS
- 正确理解求解状态窗口Solver Status
- 学会设置基本的求解选项OPTIONS
- 掌握与外部文件的基本接口方法
Lingo编程中的重要细节
- 代码需要始终在英文半角状态下输入
- Lingo编程中,一般<<<等同于≤\le≤,>>>等同于≥\ge≥
- 除了程序头尾以及其他内置语句(model,end,sets,endsets,data,enddata)外,其他语句均需要以分号结尾
- 注释语句用!!!开始,分号结束
- Lingo默认状态下决策变量均为非负变量、
- Lingo在代码编译时,可以先按照集合段,目标段,约束段,逐段编译,完全编译通过后通过菜单"Lingo-Generate-Display model"来查看代码实现的模型
- Lingo代码错误最典型的是index错误,即变量下标的索引出错
Lingo求解
model:
min=13*x1+9*x2+10*x3+11*x4+12*x5+8*x6;
x1+x4=400;
x2+x5=600;
x3+x6=500;
0.4*x1+1.1*x2+x3<800;
0.5*x4+1.2*x6+1.3*x6<900;
end
![![[Pasted image 20240807203853.png]]](https://i-blog.csdnimg.cn/direct/b8e1ceffe59144afb278d47010781def.png)
目标函数值是14458.18
总共迭代次数2
加工奶制品求解
model:
max=72*x1+64*x2;
x1+x2<50;
12*x1+8*x2<480;
3*x1<100;
end
![![[Pasted image 20240807204631.png]]](https://i-blog.csdnimg.cn/direct/74a130de3e124a3d803d53a6ff566190.png)
最优解是z=3360,x1是20,x2是30
Row表示代码中的四个式子
- 1对应3360,表示max取到了3360
- 2对应0,表示50牛奶都被用来生产
- 3对应0,表示480个工时全部被用来生产
- 4对应40,表示100里面含有40的余量
原料无剩余,时间无剩余,加工能力剩余40
资源剩余为0的约束称为紧约束
Dual Price 影子价格
最优解下,资源增加1单位,效益的增量
- 48表示牛奶增加1单位,利润增长48
- 2表示工时增加1单位,利润增长2
- 0表示加工能力增长不影响利润
35元可以买到一桶牛奶,买吗?
35<48,所以应该买
可聘用临时工人,付出的工资最多是每小时几元?
应该<2
规划模型的Lingo多段式编程
- 集合段(SETS)
- 目标与约束段
- 数据段(DATA):对集合的属性输入必要的常数数据
格式
属性=常数列表
常数列表中的数据用逗号分开,也可以用空格分开
变量名=?,运行时赋初值 - 初始段(INIT):赋初值
- 计算段(CALC):预处理
![![[Pasted image 20240807205936.png]]](https://i-blog.csdnimg.cn/direct/ee1408d74f954e0d97e84b165d3bb4d1.png)
每个季度都有,需求量,正常生产400,加班生产450,库存费用20
DEM:需求量RP:正常生产的产量OP:加班生产的产量INV:库存量
\begin{array}{}
DEM:需求量 \\
RP:正常生产的产量 \\
OP:加班生产的产量 \\
INV:库存量
\end{array}
DEM:需求量RP:正常生产的产量OP:加班生产的产量INV:库存量
- 目标函数
min∑I=14[400RP(I)+450OP(I)+20INV(I)] min\sum_{I=1}^{4}[400RP(I)+450OP(I)+20INV(I)] minI=1∑4[400RP(I)+450OP(I)+20INV(I)] - 约束条件
- 能力限制
RP(I)≤40,I=1,2,3,4 RP(I)\le 40,\quad I=1,2,3,4 RP(I)≤40,I=1,2,3,4 - 产品数量平衡方程
INV(I)=INV(I−1)+RP(I)+OP(I)−DEM(I),I=1,2,3,4INV(0)=10 \begin{array}{} INV(I)=INV(I-1)+RP(I)+OP(I)-DEM(I),\quad I=1,2,3,4 \\ INV(0)=10 \end{array} INV(I)=INV(I−1)+RP(I)+OP(I)−DEM(I),I=1,2,3,4INV(0)=10
本季度的库存,等价于上个季度的库存+本季度正常生产+本季度的加班生产-本季度的需求 - 变量的非负约束
MODEL:
//集合段
SETS:
QUARTERS/1,2,3,4/:DEM,RP,OP,INV;
ENDSETS
//目标段
MIN=@SUM(QUARTERS:400*RP+450*OP+20*INV);
//约束段
@FOR(QUARTERS(I):RP(I)<40);
@FOR(QUARTERS(I)|I#GT#1:
INV(I)=INV(I-1)+RP(I)+OP(I)-DEM(I););
INV(1)=10+RP(1)+OP(1)-DEM(1);
//数据段
DATA:
DEM=40,60,75,25;
ENDDATA
END
I#GT#1,对I的取值进行限制,表示I大于1,I可以取2,3,4
![![[Pasted image 20240807213209.png]]](https://i-blog.csdnimg.cn/direct/33b968969c6249028cb5d99024d6da8b.png)
![![[Pasted image 20240807213218.png]]](https://i-blog.csdnimg.cn/direct/02f5f7107266498c803f94e037b5291a.png)
结果表示生产总费用最小为78450
整数规划和0-1规划
整数规划问题的基本描述
要求全部或部分决策变量为整数的规划
分类:
- 纯整数规划
- 0-1整数规划
- 混合整数规划
求解:
满足整数要求的条件下确定达到的总体最优目标的最佳组合。其解为离散解
整数规划的数学描述
min(ormax)u=f(x)x∈Ωs.t.hi(x)=0,i=1,2,3,…,m.gj(x)≤0(gj(x)≥0),j=1,2,…,p.其中决策变量x为整数,或者为0,1
\begin{array}{}
min(or\quad max)u=f(x)\quad x\in \Omega \\
s.t.\quad h_{i}(x)=0,i=1,2,3,\dots,m. \\
g_{j}(x)\le 0(g_{j}(x)\ge 0),j=1,2,\dots ,p. \\
其中决策变量x为整数,或者为0,1
\end{array}
min(ormax)u=f(x)x∈Ωs.t.hi(x)=0,i=1,2,3,…,m.gj(x)≤0(gj(x)≥0),j=1,2,…,p.其中决策变量x为整数,或者为0,1
在Lingo编程中,决策变量为整数一般用@gin(x)@gin(x)@gin(x)表示;而0-1决策变量用@bin(x)@bin(x)@bin(x)表示
建设计划问题
![![[Pasted image 20240807214412.png]]](https://i-blog.csdnimg.cn/direct/2a684772a5db4331b1a127e27eef5fdb.png)
![![[Pasted image 20240807214424.png]]](https://i-blog.csdnimg.cn/direct/88c603a6fb814e2d8247fdcbb4fa6577.png)
设A、B两种类型的基地各建设x1,x2x_{1},x_{2}x1,x2个
max z=20x1+10x2s.t.{2000x1+5000x2≤130005x1+4x2≤24x1≥0,x2≥0且为整数
\begin{array}{}
max\ z=20x_{1}+10x_{2} \\
s.t.
\left\{\begin{matrix}
2000x_{1}+5000x_{2}\le 13000 \\
5x_{1}+4x_{2}\le 24 \\
x_{1}\ge 0,x_{2} \ge 0且为整数
\end{matrix}\right.
\end{array}
max z=20x1+10x2s.t.⎩⎨⎧2000x1+5000x2≤130005x1+4x2≤24x1≥0,x2≥0且为整数
人员安排问题
![![[Pasted image 20240807215722.png]]](https://i-blog.csdnimg.cn/direct/8717629315764ddc87f4335b05a9d2e6.png)
![![[Pasted image 20240807215747.png]]](https://i-blog.csdnimg.cn/direct/0f972640cda24660902e620697f0a040.png)
因为每个服务员的工作时间会跨过4个时段
为使服务部门服务员总数最少
设前五个时段安排的服务员各为x1,x2,x3,x4,x5x_{1},x_{2},x_{3},x_{4},x_{5}x1,x2,x3,x4,x5
min z=x1+x2+x3+x4+x5s.t.{x1≥8x1+x2≥10x1+x2+x3≥7x1+x2+x3+x4≥6x2+x3+x4+x5≥9x3+x4+x5≥12x4+x5≥5x5≥2xj≥0,j=1,2,3,4,5且为整数
\begin{array}{}
min\ z=x_{1}+x_{2}+x_{3}+x_{4}+x_{5} \\ \\
s.t.
\left\{\begin{matrix}
x_{1}\ge 8 \\
x_{1}+x_{2}\ge 10 \\
x_{1}+x_{2}+x_{3}\ge 7 \\
x_{1}+x_{2}+x_{3}+x_{4}\ge 6 \\
x_{2}+x_{3}+x_{4}+x_{5}\ge 9 \\
x_{3}+x_{4}+x_{5}\ge 12 \\
x_{4}+x_{5}\ge 5 \\
x_{5}\ge 2 \\
x_{j}\ge 0,j=1,2,3,4,5且为整数
\end{matrix}\right.
\end{array}
min z=x1+x2+x3+x4+x5s.t.⎩⎨⎧x1≥8x1+x2≥10x1+x2+x3≥7x1+x2+x3+x4≥6x2+x3+x4+x5≥9x3+x4+x5≥12x4+x5≥5x5≥2xj≥0,j=1,2,3,4,5且为整数
混合泳接力队的选拔
![![[Pasted image 20240807220716.png]]](https://i-blog.csdnimg.cn/direct/4d1c91263f8d4979bf28afbe0da1fdd4.png)
![![[Pasted image 20240807220736.png]]](https://i-blog.csdnimg.cn/direct/2641ce98b81d4570a8951360f397e839.png)
总共有120种组合方式
设甲是否蝶泳为x11x_{11}x11,是否仰泳为x12x_{12}x12,是否蛙泳为x13x_{13}x13,是否自由泳为x14x_{14}x14
以此类推
xij={01
x_{ij}=\left\{\begin{matrix}
0 \\
1
\end{matrix}\right.
xij={01取1表示,第i个人。去游第j种泳姿,取0表示第i个人,不游第j种泳姿
总共有20个决策变量,最终取1的只有四个,其他的都取0
表格里的成绩用CijC_{ij}Cij来表示
混合泳接力总成绩
∑i=15∑j=14Cijxij
\sum_{i=1}^{5}\sum_{j=1}^{4}C_{ij}x_{ij}
i=1∑5j=1∑4Cijxij
对运动员的约束:每个运动员最多参加一个项目
x11+x12+x13+x14≤1x21+x22+x23+x24≤1x31+x32+x33+x34≤1x41+x42+x43+x44≤1x51+x52+x53+x54≤1
\begin{array}{}
x_{11}+x_{12}+x_{13}+x_{14}\le 1 \\
x_{21}+x_{22}+x_{23}+x_{24}\le 1 \\
x_{31}+x_{32}+x_{33}+x_{34}\le 1 \\
x_{41}+x_{42}+x_{43}+x_{44}\le 1 \\
x_{51}+x_{52}+x_{53}+x_{54}\le 1
\end{array}
x11+x12+x13+x14≤1x21+x22+x23+x24≤1x31+x32+x33+x34≤1x41+x42+x43+x44≤1x51+x52+x53+x54≤1
对泳姿的约束:每个项目必须有一个运动员参加
x11+x21+x31+x41+x51=1x12+x22+x32+x42+x52=1x13+x23+x33+x43+x53=1x14+x24+x34+x44+x54=1
\begin{array}{}
x_{11}+x_{21}+x_{31}+x_{41}+x_{51}= 1 \\
x_{12}+x_{22}+x_{32}+x_{42}+x_{52}= 1 \\
x_{13}+x_{23}+x_{33}+x_{43}+x_{53}= 1 \\
x_{14}+x_{24}+x_{34}+x_{44}+x_{54}= 1
\end{array}
x11+x21+x31+x41+x51=1x12+x22+x32+x42+x52=1x13+x23+x33+x43+x53=1x14+x24+x34+x44+x54=1

目标函数:
minz=∑i=15∑j=14Cijxij
min\quad z=\sum_{i=1}^{5}\sum_{j=1}^{4}C_{ij}x_{ij}
minz=i=1∑5j=1∑4Cijxij
约束条件:
每人最多入选泳姿之一
∑j=14xij≤1i=1,…,5
\sum_{j=1}^{4}x_{ij}\le 1\qquad i=1,\dots,5
j=1∑4xij≤1i=1,…,5
每种泳姿有且只有1人
∑i=15xij≤1j=1,…,4
\sum_{i=1}^{5}x_{ij}\le 1\qquad j=1,\dots,4
i=1∑5xij≤1j=1,…,4
xij={01
x_{ij}=\left\{\begin{matrix}
0 \\
1
\end{matrix}\right.
xij={01
Lingo求解
MODEL:
sets:
person/1..5/;
position/1..4/;
link(person,position):c,x;
endsets
data:
c=66.8,75.6,87,58.6,
57.2,66,66.4,53,
78,67.8,84.6,59.4,
70,74.2,69.6,57.2,
67.4,71,83.8,62.4;
enddata
min=@sum(link:c*x);
@for(person(i):@sum(position(j):x(i,j))<1);
@for(position(j):@sum(person(i):x(i,j))=1);
@for(link: @bin(x));
END
![![[Pasted image 20240807224244.png]]](https://i-blog.csdnimg.cn/direct/aadde03379b343c69996af5d9570f97b.png)
![![[Pasted image 20240807223718.png]]](https://i-blog.csdnimg.cn/direct/df403517a16347a3aeb682bb24a64f91.png)
Matlab求解线性规划问题及优化工具箱
有关求解线性规划问题的命令
主要Matlab命令
X=linprog(c,A,b,Aeq,beq)
X=linprog(c,A,b,Aeq,beq,vlb,vub)
X=linprog(c,A,b,Aeq,beq,vlb,vub,x0)
X=linprog(c,A,b,Aeq,beq,vlb,vub,x0,options)
[x,fval,exitflag,output]=linprog(...)
linprog基本函数
括号中的是输入项
用Matlab优化工具箱解线性规划
模型1
Min z=cXs.t. AX≤b
\begin{array}{}
Min\ z=cX \\
s.t.\ AX\le b
\end{array}
Min z=cXs.t. AX≤b
目标和约束都是矩阵形式
只有不等式约束
x=linprog(x,A,b)
x=linprog(x,A,b)
x=linprog(x,A,b)
- c是目标函数的系数
- A是约束不等式的系数矩阵
- b是约束不等式的右单项
- x是输出的最优解
模型2
Min z=cXs.t. {AX≤bAeq⋅X=beq \begin{array}{} Min\ z=cX \\ s.t.\ \left\{\begin{matrix} AX\le b \\ Aeq\cdot X=beq \end{matrix}\right. \end{array} Min z=cXs.t. {AX≤bAeq⋅X=beq
x=linprog(x,A,b,Aeq,beq) x=linprog(x,A,b,Aeq,beq) x=linprog(x,A,b,Aeq,beq)
模型3
Min z=cXs.t. {AX≤bAeq⋅X=beqVLB≤X≤VUB \begin{array}{} Min\ z=cX \\ s.t.\ \left\{\begin{matrix} AX\le b \\ Aeq\cdot X=beq \\ VLB\le X\le VUB \end{matrix}\right. \end{array} Min z=cXs.t. ⎩⎨⎧AX≤bAeq⋅X=beqVLB≤X≤VUB
X=linprog(c,A,b,Aeq,beq,vlb,vub)
X=linprog(c,A,b,Aeq,beq,vlb,vub,x0)
x0表示初始点
[x,fval]=linprog(...)
返回最优解x及x处的目标函数值fval
例子
max z=0.4x1+0.28x2+0.32x3+0.72x4+0.64x5+0.6x6s.t.{0.01x1+0.01x2+0.01x3+0.03x4+0.03x5+0.03x6≤8500.02x1+0.05x4≤7000.02x2+0.05x5≤1000.03x3+0.08x6≤900xj≥0j=1,2,…,6 \begin{array}{} max\ z=0.4x_{1}+0.28x_{2}+0.32x_{3}+0.72x_{4}+0.64x_{5}+0.6x_{6} \\ s.t. \left\{\begin{matrix} 0.01x_{1}+0.01x_{2}+0.01x_{3}+0.03x_{4}+0.03x_{5}+0.03x_{6}\le 850 \\ 0.02x_{1}+0.05x_{4}\le 700 \\ 0.02x_{2}+0.05x_{5}\le 100 \\ 0.03x_{3}+0.08x_{6}\le 900 \\ x_{j}\ge 0\quad j=1,2,\dots,6 \end{matrix}\right. \end{array} max z=0.4x1+0.28x2+0.32x3+0.72x4+0.64x5+0.6x6s.t.⎩⎨⎧0.01x1+0.01x2+0.01x3+0.03x4+0.03x5+0.03x6≤8500.02x1+0.05x4≤7000.02x2+0.05x5≤1000.03x3+0.08x6≤900xj≥0j=1,2,…,6
c=[-0.4 -0.28 -0.32 -0.72 -0.64 -0.6];
A=[0.01 0.01 0.01 0.03 0.03 0.03;
0.02 0 0 0.05 0 0;
0 0.02 0 0 0.05 0;
0 0 0.03 0 0 0.08];
b=[850;700;100;900];
Aeq=[];beq=[];
vlb=[0;0;0;0;0;0];vub=[];
[x,fval]=linprog(c,A,b,Aeq,beq,vlb,vub)
matlab只求解最小的情况,如果要求解最大,需要加一个负号,把整个目标函数转化为最小
任务分配问题
min z=(1391011128)Xs.t. (0.41.110000000.51.21.3)X≤(800900)(100100010010001001)X=(400600500),X=(x1x2x3x4x5x6)≥0 \begin{array}{} min\ z=\begin{pmatrix} 13&9&10&11&12&8 \end{pmatrix} X\\ s.t.\ \begin{pmatrix} 0.4 & 1.1 &1&0&0&0 \\ 0&0&0&0.5&1.2&1.3 \\ \end{pmatrix} X\le\begin{pmatrix} 800 \\ 900 \end{pmatrix} \\ \begin{pmatrix} 1&0&0&1&0&0 \\ 0&1&0&0&1&0 \\ 0&0&1&0&0&1 \end{pmatrix} X=\begin{pmatrix} 400 \\ 600 \\ 500 \end{pmatrix}, X=\begin{pmatrix} x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \\ x_{5} \\ x_{6} \end{pmatrix}\ge 0 \end{array} min z=(1391011128)Xs.t. (0.401.101000.501.201.3)X≤(800900)100010001100010001X=400600500,X=x1x2x3x4x5x6≥0
f=[13 9 10 11 12 8];
A=[0.4 1.1 1 0 0 0
0 1 0 0 1 0
0 0 1 0 0 1];
beq=[400 600 500];
vlb=zeros(6,1);
vub=[];
[x,fval]=linprog(f,A,b,Aeq,beq,vlb,vub)
zeros表示一个列向量,六行一列的0
用Matlab工具箱解整数或0-1规划
X=intlinprog(c,intcon,A,b,Aeq,beq)
X=intlinprog(c,intcon,A,b,Aeq,beq,vlb,vub)
X=intlinprog(c,intcon,A,b,Aeq,beq,vlb,vub,x0)
X=intlinprog(c,intcon,A,b,Aeq,beq,vlb,vub,x0,options)
[x,fval,exitflag,output]=intlinprog(...)
intcon,用来指定整数变量
Matlab优化工具箱简介
![![[Pasted image 20240808005724.png]]](https://i-blog.csdnimg.cn/direct/bee91b74f8cf45de8f7c6e0f4f311109.png)
输入
![![[Pasted image 20240808005814.png]]](https://i-blog.csdnimg.cn/direct/852c446b914648b4ab91c97810fd62bd.png)
输出
![![[Pasted image 20240808005924.png]]](https://i-blog.csdnimg.cn/direct/6e1363ab727f45b685140c2fb150a25d.png)
7633

被折叠的 条评论
为什么被折叠?



