数学规划模型|线性规划|整数规划

规划模型的概念

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

规划模型的数学描述

将一个优化问题用数学式子来描述,即求函数
u = f ( x ) x = ( x 1 , x 2 , … , x n ) u=f(x)\qquad x=(x_{1},x_{2},\dots,x_{n}) u=f(x)x=(x1,x2,,xn)
x x x是一个向量
在约束条件
h i ( 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个等式
g j ( x ) ≤ 0 ( g j ( 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可行域

整理一下
一个规划问题的数学模型可表示为 m i n ( o r m a x ) u = f ( x ) x ∈ Ω s . t . h i ( x ) = 0 , i = 1 , 2 , 3 , … , m . g j ( x ) ≤ 0 ( g j ( 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)是目标函数
  • x x x是决策变量
  • 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 ) , h i ( x ) , g i ( x ) , i = 1 , 2 , … , m , j = 1 , 2 , … , p f(x),h_{i}(x),g_{i}(x),i=1,2,\dots,m,j=1,2,\dots,p f(x),hi(x),gi(x),i=1,2,,m,j=1,2,,p,均为线性函数,则称该模型为线性规划模型
m a x ( 或 m i n ) z = c 1 x 1 + c 2 x 2 + ⋯ + c n x n s . t . { a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n ( ≤ = ≥ ) b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n ( ≤ = ≥ ) b 2 … a m 1 x 1 + a m 2 x 2 + ⋯ + a m n x n ( ≤ = ≥ ) b m x j ≥ 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)

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

![[Pasted image 20240807081425.png]]

![[Pasted image 20240807081455.png]]

  • 决策变量,设甲车床,生产工件1 x 1 x_{1} x1件,生产工件2 x 2 x_{2} x2件,生产工件3 x 3 x_{3} x3件,乙车床,生产工件1 x 4 x_{4} x4件,生产工件2 x 5 x_{5} x5件,生产工件3 x 6 x_{6} x6
  • 目标函数是希望加工费用最低
    m i n   z = 13 x 1 + 9 x 2 + 10 x 3 + 11 x 4 + 12 x 5 + 8 x 6 min\ z=13x_{1}+9x_{2}+10x_{3}+11x_{4}+12x_{5}+8x_{6} min z=13x1+9x2+10x3+11x4+12x5+8x6
  • 约束条件:台时的限制和加工工件数量的限制
    0.4 x 1 + 1.1 x 2 + 1.0 x 3 ≤ 800 0.5 x 4 + 1.2 x 5 + 1.3 x 6 ≤ 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 ≥ 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的数量分别为 x 1 , x 2 , x 3 x_{1},x_{2},x_{3} x1,x2,x3,在乙车床上加工工件1、2、3的数量分别为 x 4 , x 5 , x 6 x_{4},x_{5},x_{6} x4,x5,x6,可建立以下线性规划模型
    m i n   z = 13 x 1 + 9 x 2 + 10 x 3 + 11 x 4 + 12 x 5 + 8 x 6 s . t . { x 1 + x 4 = 400 x 2 + x 5 = 600 x 3 + x 6 = 500 0.4 x 1 + 1.1 x 2 + 1.0 x 3 ≤ 800 0.5 x 4 + 1.2 x 5 + 1.3 x 6 ≤ 900 x i ≥ 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桶里面,多少桶生产 A 1 A_{1} A1多少桶生产 A 2 A_{2} A2
    x 1 x_{1} x1桶生产 A 1 A_{1} A1 x 2 x_{2} x2桶,生产 A 2 A_{2} A2
  • 目标函数: A 1 A_{1} A1获利 24 ⋅ 3 x 1 24\cdot 3x_{1} 243x1 A 2 A_{2} A2获利 16 ⋅ 4 x 2 16\cdot 4x_{2} 164x2
    m a x   z = 72 x 1 + 64 x 2 max\ z=72x_{1}+64x_{2} max z=72x1+64x2
  • 约束条件:
    牛奶供应的限制,每天50桶
    x 1 + x 2 ≤ 50 x_{1}+x_{2}\le 50 x1+x250
    劳动时间的限制,每天480工时
    12 x 1 + 8 x 2 ≤ 480 12x_{1}+8x_{2}\le 480 12x1+8x2480
    A 1 A_{1} A1每天最多生产100公斤
    3 x 1 ≤ 100 3x_{1}\le 100 3x1100
    非负约束
    x 1 , x 2 ≥ 0 x_{1},x_{2}\ge 0 x1,x20

线性规划模型的求解

简单线性规划模型的求解

对于一般只有两个决策变量的简单线性规划模型,可以通过图解法进行求解
l 1 : x 1 + x 2 = 50 l 2 : 12 x 1 + 8 x 2 = 480 l 3 : 3 x 1 = 100 l 1 : x 1 = 0 , l 5 : x 2 = 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. 模型中使用的参数数量级要适当(小于 1 0 3 10^{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
D E M : 需求量 R P : 正常生产的产量 O P : 加班生产的产量 I N V : 库存量 \begin{array}{} DEM:需求量 \\ RP:正常生产的产量 \\ OP:加班生产的产量 \\ INV:库存量 \end{array} DEM:需求量RP:正常生产的产量OP:加班生产的产量INV:库存量

  • 目标函数
    m i n ∑ I = 1 4 [ 400 R P ( I ) + 450 O P ( I ) + 20 I N V ( I ) ] min\sum_{I=1}^{4}[400RP(I)+450OP(I)+20INV(I)] minI=14[400RP(I)+450OP(I)+20INV(I)]
  • 约束条件
  1. 能力限制
    R P ( 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. 产品数量平衡方程
    I N V ( I ) = I N V ( I − 1 ) + R P ( I ) + O P ( I ) − D E M ( I ) , I = 1 , 2 , 3 , 4 I N V ( 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. 混合整数规划
    求解:
    满足整数要求的条件下确定达到的总体最优目标的最佳组合。其解为离散解
整数规划的数学描述

m i n ( o r m a x ) u = f ( x ) x ∈ Ω s . t . h i ( x ) = 0 , i = 1 , 2 , 3 , … , m . g j ( x ) ≤ 0 ( g j ( 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编程中,决策变量为整数一般用 @ g i n ( x ) @gin(x) @gin(x)表示;而0-1决策变量用 @ b i n ( x ) @bin(x) @bin(x)表示

建设计划问题

![[Pasted image 20240807214412.png]]

![[Pasted image 20240807214424.png]]

设A、B两种类型的基地各建设 x 1 , x 2 x_{1},x_{2} x1,x2
m a x   z = 20 x 1 + 10 x 2 s . t . { 2000 x 1 + 5000 x 2 ≤ 13000 5 x 1 + 4 x 2 ≤ 24 x 1 ≥ 0 , x 2 ≥ 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个时段
为使服务部门服务员总数最少
设前五个时段安排的服务员各为 x 1 , x 2 , x 3 , x 4 , x 5 x_{1},x_{2},x_{3},x_{4},x_{5} x1,x2,x3,x4,x5
m i n   z = x 1 + x 2 + x 3 + x 4 + x 5 s . t . { x 1 ≥ 8 x 1 + x 2 ≥ 10 x 1 + x 2 + x 3 ≥ 7 x 1 + x 2 + x 3 + x 4 ≥ 6 x 2 + x 3 + x 4 + x 5 ≥ 9 x 3 + x 4 + x 5 ≥ 12 x 4 + x 5 ≥ 5 x 5 ≥ 2 x j ≥ 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种组合方式
设甲是否蝶泳为 x 11 x_{11} x11,是否仰泳为 x 12 x_{12} x12,是否蛙泳为 x 13 x_{13} x13,是否自由泳为 x 14 x_{14} x14
以此类推
x i j = { 0 1 x_{ij}=\left\{\begin{matrix} 0 \\ 1 \end{matrix}\right. xij={01取1表示,第i个人。去游第j种泳姿,取0表示第i个人,不游第j种泳姿

总共有20个决策变量,最终取1的只有四个,其他的都取0
表格里的成绩用 C i j C_{ij} Cij来表示
混合泳接力总成绩
∑ i = 1 5 ∑ j = 1 4 C i j x i j \sum_{i=1}^{5}\sum_{j=1}^{4}C_{ij}x_{ij} i=15j=14Cijxij
对运动员的约束:每个运动员最多参加一个项目
x 11 + x 12 + x 13 + x 14 ≤ 1 x 21 + x 22 + x 23 + x 24 ≤ 1 x 31 + x 32 + x 33 + x 34 ≤ 1 x 41 + x 42 + x 43 + x 44 ≤ 1 x 51 + x 52 + x 53 + x 54 ≤ 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
对泳姿的约束:每个项目必须有一个运动员参加
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 \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
在这里插入图片描述
目标函数:
m i n z = ∑ i = 1 5 ∑ j = 1 4 C i j x i j min\quad z=\sum_{i=1}^{5}\sum_{j=1}^{4}C_{ij}x_{ij} minz=i=15j=14Cijxij
约束条件:
每人最多入选泳姿之一
∑ j = 1 4 x i j ≤ 1 i = 1 , … , 5 \sum_{j=1}^{4}x_{ij}\le 1\qquad i=1,\dots,5 j=14xij1i=1,,5
每种泳姿有且只有1人
∑ i = 1 5 x i j ≤ 1 j = 1 , … , 4 \sum_{i=1}^{5}x_{ij}\le 1\qquad j=1,\dots,4 i=15xij1j=1,,4
x i j = { 0 1 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
M i n   z = c X s . t .   A X ≤ b \begin{array}{} Min\ z=cX \\ s.t.\ AX\le b \end{array} Min z=cXs.t. AXb
目标和约束都是矩阵形式
只有不等式约束
x = l i n p r o g ( x , A , b ) x=linprog(x,A,b) x=linprog(x,A,b)

  • c是目标函数的系数
  • A是约束不等式的系数矩阵
  • b是约束不等式的右单项
  • x是输出的最优解
    模型2
    M i n   z = c X s . t .   { A X ≤ b A e q ⋅ X = b e q \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 = l i n p r o g ( x , A , b , A e q , b e q ) x=linprog(x,A,b,Aeq,beq) x=linprog(x,A,b,Aeq,beq)
    模型3
    M i n   z = c X s . t .   { A X ≤ b A e q ⋅ X = b e q V L B ≤ X ≤ V U B \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

例子

m a x   z = 0.4 x 1 + 0.28 x 2 + 0.32 x 3 + 0.72 x 4 + 0.64 x 5 + 0.6 x 6 s . t . { 0.01 x 1 + 0.01 x 2 + 0.01 x 3 + 0.03 x 4 + 0.03 x 5 + 0.03 x 6 ≤ 850 0.02 x 1 + 0.05 x 4 ≤ 700 0.02 x 2 + 0.05 x 5 ≤ 100 0.03 x 3 + 0.08 x 6 ≤ 900 x j ≥ 0 j = 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只求解最小的情况,如果要求解最大,需要加一个负号,把整个目标函数转化为最小

任务分配问题

m i n   z = ( 13 9 10 11 12 8 ) X s . t .   ( 0.4 1.1 1 0 0 0 0 0 0 0.5 1.2 1.3 ) X ≤ ( 800 900 ) ( 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 ) X = ( 400 600 500 ) , X = ( x 1 x 2 x 3 x 4 x 5 x 6 ) ≥ 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]]

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值