规划模型的概念

如何来分配有限资源,从而达到人们期望目标的优化分配数学模型,它在数学建模中处于中心地位。
这类问题一般可以归结为数学规划模型,规划模型的应用极为广泛,其作用已为越来越多的人所重视
规划模型是数学建模竞赛中最常见的一类数学模型

规划模型的数学描述

将一个优化问题用数学式子来描述,即求函数
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,受约束于的意思
规划模型的分类
  1. 根据是否存在约束条件
    1. 有约束问题
    2. 无约束问题
  2. 根据决策变量的性质
    1. 静态问题
    2. 动态问题
  3. 根据目标函数和约束条件表达式的性质
    1. 线性规划
    2. 非线性规划
    3. 二次规划
    4. 多目标规划
  4. 根据决策变量的允许值
    1. 整数规划(0-1)
    2. 实数规划
建立规划模型的一般步骤
  1. 确定决策变量
  2. 确定目标函数的表达式
  3. 寻找约束条件

线性规划模型

线性规划模型的一般形式

若在如下的模型中,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(≤=≥)b2am1x1+am2x2++amnxn(≤=≥)bmxj0(j=1,2,,n)

  • 把目标函数写成线性表达式
  • xjx_{j}xj是决策变量
  • 约束条件里不管是等式还是不等式,都是线性函数
    • 如同线代里的线性方程组
  • 如果xjx_{j}xj不是实数取值,是整数取值,又称为整数线性规划
建立线性规划模型的通常步骤
  1. 确定决策变量:
    是模型要确定的未知变量,最重要的参数,是决策者解决实际问题的控制变量
  2. 确定目标函数:
    目标函数决定线性规划问题的优化方向,是重要的组成部分。
    实际问题的目标可表示为决策变量的一个线性函数,并根据实际问题的优化方向求其最大化或最小化
  3. 确定约束方程:
    通过约束方程来描述和反映一系列客观描述条件或环境的限制,这些限制通过一系列线性等式或不等式方程组来描述
  4. 变量取值限制:
    一般情况下,决策变量取正值(或负值)。因此,模型中应有变量的非负约束即xj≤0x_{j}\le 0xj0
任务分配问题

![[Pasted image 20240807081425.png]]

![[Pasted image 20240807081455.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.0x38000.5x4+1.2x5+1.3x6900x1+x4=400x2+x5=600x3+x6=500x1,x2,x3,x4,x5,x60

    设在甲车床上加工工件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.0x38000.5x4+1.2x5+1.3x6900xi0,i=1,2,,6
加工奶制品的生产计划

![[Pasted image 20240807084035.png]]

![[Pasted image 20240807084341.png]]

  • 决策变量,这50桶里面,多少桶生产A1A_{1}A1多少桶生产A2A_{2}A2
    x1x_{1}x1桶生产A1A_{1}A1x2x_{2}x2桶,生产A2A_{2}A2
  • 目标函数:A1A_{1}A1获利24⋅3x124\cdot 3x_{1}243x1A2A_{2}A2获利16⋅4x216\cdot 4x_{2}164x2
    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+x250
    劳动时间的限制,每天480工时
    12x1+8x2≤480 12x_{1}+8x_{2}\le 480 12x1+8x2480
    A1A_{1}A1每天最多生产100公斤
    3x1≤100 3x_{1}\le 100 3x1100
    非负约束
    x1,x2≥0 x_{1},x_{2}\ge 0 x1,x20

线性规划模型的求解

简单线性规划模型的求解

对于一般只有两个决策变量的简单线性规划模型,可以通过图解法进行求解
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]]

在B(20,30)取得最优解
目标函数和约束条件是线性函数,可行域为直线段围成的凸多边形,目标函数的等值线为直线
最优解一定在凸多边形的某一个顶点取得

线性规划模型的软件求解

有许多求解数学规划模型的多种软件,如Matlab,Lingo,Excel,其中Lingo编程简单,易于操作,求解速度快,是求解规划模型的主要手段

Lingo编程入门

Lingo主要功能特色
  1. 既能解决线性规划问题,也有较强的求解非线性规划问题的能力
  2. 输入模型简练直观
  3. 运行速度快,计算能力强
  4. 内置建模语言,提供几十个内部函数,从而能以较少语句,较直观的方式描述较大规模的优化模型
  5. 将集合概念引入编程语言,很容易将实际问题转换为Lingo模型
  6. 能方便地与Excel、数据库等其他软件交换数据
需要注意的几个基本问题
  1. 尽量使用实数优化,减少整数约束和整数变量
  2. 尽量使用光滑优化,减少非光滑约束的个数
    尽量少使用绝对值,符号函数,变量求最大最小值,四舍五入,取整函数
  3. 尽量使用线性模型,减少非线性约束和非线性变量的个数
  4. 合理设定变量上下界,尽可能给出变量初始值
  5. 模型中使用的参数数量级要适当(小于10310^{3}103)
需要注意的几个方面
  1. 正确阅读求解报告Solution Report
  2. 了解敏感性分析Range Report
  3. 集合的应用SETS
  4. 正确理解求解状态窗口Solver Status
  5. 学会设置基本的求解选项OPTIONS
  6. 掌握与外部文件的基本接口方法
Lingo编程中的重要细节
  1. 代码需要始终在英文半角状态下输入
  2. Lingo编程中,一般<<<等同于≤\le>>>等同于≥\ge
  3. 除了程序头尾以及其他内置语句(model,end,sets,endsets,data,enddata)外,其他语句均需要以分号结尾
  4. 注释语句用!!!开始,分号结束
  5. Lingo默认状态下决策变量均为非负变量、
  6. Lingo在代码编译时,可以先按照集合段,目标段,约束段,逐段编译,完全编译通过后通过菜单"Lingo-Generate-Display model"来查看代码实现的模型
  7. 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]]

目标函数值是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]]

最优解是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多段式编程
  1. 集合段(SETS)
  2. 目标与约束段
  3. 数据段(DATA):对集合的属性输入必要的常数数据
    格式
    属性=常数列表
    常数列表中的数据用逗号分开,也可以用空格分开
    变量名=?,运行时赋初值
  4. 初始段(INIT):赋初值
  5. 计算段(CALC):预处理
    ![[Pasted image 20240807205936.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=14[400RP(I)+450OP(I)+20INV(I)]
  • 约束条件
  1. 能力限制
    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
  2. 产品数量平衡方程
    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(I1)+RP(I)+OP(I)DEM(I),I=1,2,3,4INV(0)=10
    本季度的库存,等价于上个季度的库存+本季度正常生产+本季度的加班生产-本季度的需求
  3. 变量的非负约束
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]]

![[Pasted image 20240807213218.png]]

结果表示生产总费用最小为78450

整数规划和0-1规划

整数规划问题的基本描述

要求全部或部分决策变量为整数的规划
分类:

  1. 纯整数规划
  2. 0-1整数规划
  3. 混合整数规划
    求解:
    满足整数要求的条件下确定达到的总体最优目标的最佳组合。其解为离散解
整数规划的数学描述

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为整数,或者为01
在Lingo编程中,决策变量为整数一般用@gin(x)@gin(x)@gin(x)表示;而0-1决策变量用@bin(x)@bin(x)@bin(x)表示

建设计划问题

![[Pasted image 20240807214412.png]]

![[Pasted image 20240807214424.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+5000x2130005x1+4x224x10,x20且为整数

人员安排问题

![[Pasted image 20240807215722.png]]

![[Pasted image 20240807215747.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. x18x1+x210x1+x2+x37x1+x2+x3+x46x2+x3+x4+x59x3+x4+x512x4+x55x52xj0,j=1,2,3,4,5且为整数

混合泳接力队的选拔

![[Pasted image 20240807220716.png]]

![[Pasted image 20240807220736.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=15j=14Cijxij
对运动员的约束:每个运动员最多参加一个项目
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+x141x21+x22+x23+x241x31+x32+x33+x341x41+x42+x43+x441x51+x52+x53+x541
对泳姿的约束:每个项目必须有一个运动员参加
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=15j=14Cijxij
约束条件:
每人最多入选泳姿之一
∑j=14xij≤1i=1,…,5 \sum_{j=1}^{4}x_{ij}\le 1\qquad i=1,\dots,5 j=14xij1i=1,,5
每种泳姿有且只有1人
∑i=15xij≤1j=1,…,4 \sum_{i=1}^{5}x_{ij}\le 1\qquad j=1,\dots,4 i=15xij1j=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]]

![[Pasted image 20240807223718.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. AXb
目标和约束都是矩阵形式
只有不等式约束
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. {AXbAeqX=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.  AXbAeqX=beqVLBXVUB
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.03x68500.02x1+0.05x47000.02x2+0.05x51000.03x3+0.08x6900xj0j=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优化工具箱简介

![[Pasted image 20240808005724.png]]

输入
![[Pasted image 20240808005814.png]]

输出
![[Pasted image 20240808005924.png]]

Logo

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

更多推荐