数学规划模型|线性规划|整数规划
如何来分配有限资源,从而达到人们期望目标的优化分配数学模型,它在数学建模中处于中心地位。这类问题一般可以归结为数学规划模型,规划模型的应用极为广泛,其作用已为越来越多的人所重视规划模型是数学建模竞赛中最常见的一类数学模型将一个优化问题用数学式子来描述,即求函数u=f(x)x=(x1,x2,…,xn)u=f(x)\qquad x=(x_{1},x_{2},\dots,x_{n})u=f(x)x=(x
规划模型的概念
如何来分配有限资源,从而达到人们期望目标的优化分配数学模型,它在数学建模中处于中心地位。
这类问题一般可以归结为数学规划模型,规划模型的应用极为广泛,其作用已为越来越多的人所重视
规划模型是数学建模竞赛中最常见的一类数学模型
规划模型的数学描述
将一个优化问题用数学式子来描述,即求函数
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。
任务分配问题
- 决策变量,设甲车床,生产工件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
加工奶制品的生产计划
- 决策变量,这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
在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
目标函数值是14458.18
总共迭代次数2
加工奶制品求解
model:
max=72*x1+64*x2;
x1+x2<50;
12*x1+8*x2<480;
3*x1<100;
end
最优解是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):预处理
每个季度都有,需求量,正常生产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
结果表示生产总费用最小为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)表示
建设计划问题
设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且为整数
人员安排问题
因为每个服务员的工作时间会跨过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且为整数
混合泳接力队的选拔
总共有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
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) 100010001100010001 X= 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优化工具箱简介
输入
输出

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)