数学建模之规划2——非线性规划(01规划、整数规划、动态规划)

本文深入探讨了整数规划与0-1规划的概念及其应用,包括原油采购与加工、混合泳接力队选拔及选课策略等多个实例,展示了如何通过建立数学模型解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

术语解释

  • 整数规划:规划中的变量(全部或部分)限制为整数,称为整数规划。(很多的单位是不能拆分成小数的)
  • 0-1规划:决策变量仅取值0或1的异类特殊的整数规划。(决策变量要么取0,要么取1)(可以解决快递员问题、协作效率最优化问题、解决流程化问题效果很多好)
  • 非线性规划:目标函数或约束条件中至少有一个是非线性函数的最优化问题。
  • 多目标规划:研究多于一个目标函数在给定区域上的最优化。
  • 动态规划:是运筹学的一个分支,是求解决策过程最优化的数学方法。

整数规划及0-1规划模型

概述

  • 首先0-1其实也是整数规划。
  • 整数规划指的是决策变量为非负整数值的一类线性规划。
  • 在实际问题的应用中,整数规划模型对应着大量的生产计划或活动安排等决策问题,整数规划的解法主要有分枝定界解法及割平面解法。
  • 在整数规划问题中,0-1型整数规划则是其中较为特殊的一类情况,它要求决策变量的取值仅为0或1,在实际问题的讨论中,0-1型整数规划模型也对应着大量的最优决策的活动与安排讨论,我们将列举一些模型范例,以说明这个事实。

例题1:原油采购与加工

在这里插入图片描述
目标:你现在要使收益最大,如何安排原油的采购和加工。

  • 市场上可买到不超过1500t的原油A:
  • 购买量不超过500t时的单价为10000元/t;
  • 购买量超过500t但不超过1000t时,超过500t的部分8000元/t;
  • 购买量超过1000t时,超过1000t的部分6000元/t.

问题分析:

  • 利润:销售汽油的收入-购买原油A的支出。
  • 难点:原油A的购价与购买量关系复杂。
  • 决策变量:支出 = 原油A的购买量
    在这里插入图片描述
  • Max  =4.8(x11+x21)+5.6(x12+x22)−c(x)Max \space \space = 4.8(x_{11}+x_{21})+5.6(x_{12}+x_{22})-c(x)Max  =4.8(x11+x21)+5.6(x12+x22)c(x)
  • c(x)~购买原油A的支出
  • c(x)={10x(0≤x≤500)8x+1000(500≤x≤1000)6x+3000(1000≤x≤1500)c(x) = \begin{cases} 10x&(0\leq x\leq 500)\\8x+1000&(500\leq x\leq 1000)\\ 6x+3000&(1000\leq x \leq 1500)\end{cases}c(x)=10x8x+10006x+3000(0x500)(500x1000)(1000x1500)
  • 原油供应
  • x11+x12≤500+xx_{11}+x_{12}\leq 500+xx11+x12500+x 库存500t
  • x21+x22≤1000x_{21}+x_{22}\leq 1000x21+x221000 库存1000t
  • x≤1500x\leq 1500x1500不能卖超过1500
  • x11x11+x21≥0.5\frac{x_{11}}{x_{11}+x_{21}}\geq 0.5x11+x21x110.5,A要大于50%。
  • x12x12+x22≥0.6\frac{x_{12}}{x_{12}+x_{22}}\geq 0.6x12+x22x120.6,B要大于60%。
  • 目标函数c(x)不是线性函数,是非线性规划。
  • 对于用分段函数定义的c(x),一般的非线性规划软件也难以输入和求解。

模型求解

  • x1,x2,x3x_1,x_2,x_3x1,x2,x3以价格10,8,6(千元/t)采购A的吨数。这对于任何一种情况都成立。
  • 于是有x=x1+x2+x3, c(x)=10x1+8x2+6x3x = x_1+x_2+x_3,\space c(x) = 10x_1+8x_2+6x_3x=x1+x2+x3, c(x)=10x1+8x2+6x3
  • Max  =4.8(x11+x21)+5.6(x12+x22)−10x1+8x2+6x3Max \space \space = 4.8(x_{11}+x_{21})+5.6(x_{12}+x_{22})-10x_1+8x_2+6x_3Max  =4.8(x11+x21)+5.6(x12+x22)10x1+8x2+6x3
  • 然而只有当x1=500x_1 = 500x1=500的时候,x2x_2x2才能有值,同理当x1+x2≥1000x2=500x_1+x_2\geq 1000 x_2=500x1+x21000x2=500时,x3x_3x3才能有值
  • 所以约束等价于(x1−500)∗x2=0(x_1-500)*x_2 = 0(x1500)x2=0【这个太牛逼了】
  • 同理(x2−500)x3=0(x_2-500)x_3 = 0(x2500)x3=0
  • 0≤x1,x2,x3≤5000\leq x_1,x_2, x_3\leq 5000x1,x2,x3500

求解代码

Model:
Max= 4.8*x11 + 4.8*x21 + 5.6*x12 + 5.6*x22 - 10*x1 - 8*x2 - 6*x3;
x11+x12 < x + 500;
x21+x22 < 1000;
x11 - x21 > 0;  
2*x12 - 3*x22 > 0;
x=x1+x2+x3;     
(x1 - 500) * x2=0; 
(x2 - 500) * x3=0; 
x1 < 500;
x2 < 500;
x3 < 500;
end 

最终结果

 Local optimal solution found.
  Objective value:                            4800.000
  Total solver iterations:                          14
     Variable           Value        Reduced Cost
            X11        500.0000            0.000000
            X21        500.0000            0.000000
            X12        0.000000           0.2666667
            X22        0.000000            0.000000
              X1        0.000000           0.4000000
              X2        0.000000            0.000000
              X3        0.000000            0.000000
                X        0.000000            0.000000

这里分段函数的处理非常经典,需要反复仔细看。

分派问题(0-1规划)

  • 若干项任务分给一些候选人来完成,每人的专长不同,完成每项任务取得的效益或需要的资源不同,如何分派任务使获得的总效益最大,或付出的总资源最少?
  • 若干种策略供选择,不同的策略得到的收益或付出的成本不同,各个策略之间有相互制约关系,如何在满足一定条件下作出抉择,使得收益最大或成本最小?
  • 指派(Assignment)问题:有若干项任务, 每项任务必有且只能有一人承担,每人只能承担一项,不同人员承担不同任务的效益(或成本)不同,怎样分派各项任务使总效益最大(或总成本最小)?一般情况分为三种
    • 人员数量与任务数量相等
    • 人员数量大于任务数量(本例)
    • 人员数量小于任务数量 ?

0-1规划数学模型

Max(Min)z=c1x1+x2x2+.....+cnxn Max(Min)z = c_1x_1+x_2x_2+.....+c_nx_nMax(Min)z=c1x1+x2x2+.....+cnxn
{a11x1+a12x2+...a1nxn≤(≥,=)b1a21x1+a22x2+...a2nxn≤(≥,=)b2..............am1x1+am2x2+...amnxn≤(≥,=)b2x1,x2,......,xn=0∣1\begin{cases} a_{11}x_1+a_{12}x_2+...a_{1n}x_n\leq (\geq ,=)b_1 \\a_{21}x_1+a_{22}x_2+...a_{2n}x_n\leq (\geq ,=)b_2 \\.............. \\a_{m1}x_1+a_{m2}x_2+...a_{mn}x_n\leq (\geq ,=)b_2 \\x_1,x_2,......,x_n = 0|1\end{cases}a11x1+a12x2+...a1nxn(,=)b1a21x1+a22x2+...a2nxn(,=)b2..............am1x1+am2x2+...amnxn(,=)b2x1,x2,......,xn=01

案例:混合泳接力队的选拔

在这里插入图片描述

  • 问题:如何选拔队员组成4*100混合泳接力队?
  • 讨论:丁的蛙泳成绩退步到1‘15’‘2;戊的自由泳成绩进步到57’‘5 , 组成接力队的方案是否应该调整?
    在这里插入图片描述
  • 若选择队员i参加泳姿j的比赛,记xij=1x_{ij} = 1xij=1,否则记xij=0x_{ij} = 0xij=0
  • 这里面的约束相当复杂,队员只能游一种泳姿,并且每种泳姿也只能由一名队员游。
  • 目标函数:min Z=∑j=14∑i=15cijxijmin\space Z = \sum^4_{j=1}\sum^5_{i=1}c_{ij}x_{ij}min Z=j=14i=15cijxij
  • 约束条件:∑j=14xij≤1,i=1,...,5             (1)\sum^4_{j=1}x_{ij}\leq 1,i = 1,...,5 \space \space \space \space \space \space \space \space \space \space \space \space \space (1)j=14xij1,i=1,...,5             1
    ∑i=15xij=1,j=1,...,4             (2)\sum^5_{i=1}x_{ij} = 1,j = 1,...,4\space \space \space \space \space \space \space \space \space \space \space \space \space (2)i=15xij=1,j=1,...,4             2
  • 一式:每人最多入选泳姿。
  • 二式:每种泳姿有且只有一个人。

模型求解代码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(i):
   @sum(person(j):x(j,i))=1;);
@for(link: @bin(x));
END 

案例2 选课策略(0-1多目标复杂规划)

在这里插入图片描述

  • 要求至少选两门数学课、三门运筹学课和两门计算机课
  • 为了选修课程门数最少,应学习哪些课程?
  • 选修课程最少,且学分尽量多,应学习哪些课程?

决策变量

  • xi=1x_i = 1xi=1~选课好i的课程,0为不选,1为选择。

目标函数

  • 选修课程总数最少:min Z=∑i=19ximin\space Z = \sum^9_{i=1}x_imin Z=i=19xi

约束条件1:至少选两门数学课、三门运筹学课和两门计算机课

  • 最少2门数学课: x1+x2+x3+x4+x5≥2x_1+x_2+x_3+x_4+x_5\geq 2x1+x2+x3+x4+x52

  • 3门运筹学课:x3+x5+x6+x8+x9≥3x_3+x_5+x_6+x_8+x_9\geq 3x3+x5+x6+x8+x93

  • 2门计算机课:x4+x6+x7+x9≥2x_4+x_6+x_7+x_9\geq 2x4+x6+x7+x92

  • 要有最优化方法、那么必须要学微积分和线性代数,x3≤x1,x3≤x2&ThickSpace;⟺&ThickSpace;2x3−x1−x2≤0x_3\leq x_1, x_3\leq x_2 \iff2x_3-x_1-x_2\leq 0x3x1,x3x22x3x1x20

  • 要选数据结构,必须选计算机编程,x4≤x7&ThickSpace;⟺&ThickSpace;x4−x7≤0x_4\leq x_7\iff x_4-x_7\leq 0x4x7x4x70

  • 要选应用统计,必须学微积分和线性代数,x5≤x1,x5≤x2&ThickSpace;⟺&ThickSpace;2x5−x1−x2≤0x_5\leq x_1, x_5\leq x_2 \iff2x_5-x_1-x_2\leq 0x5x1,x5x22x5x1x20

  • 要选预测理论,必选引用统计,x7−x8≤0x_7-x_8\leq 0x7x80

  • 要选数学实验,必选微积分、线性代数x9≤x1,x9≤x2&ThickSpace;⟺&ThickSpace;2x9−x1−x2≤0x_9\leq x_1, x_9\leq x_2 \iff2x_9-x_1-x_2\leq 0x9x1,x9x22x9x1x20

  • 基本的方法论就是把约束条件转化为不等式

约束条件2:课程最少、学分尽量多

min  Z=∑i=19ximin\space \space Z = \sum^9_{i = 1}x_imin  Z=i=19ximax  W=5x1+4x2+4x3+3x4+4x5+3x6+2x7+2x8+3x9max\space \space W = 5x_1+4x_2+4x_3+3x_4+4x_5+3x_6+2x_7+2x_8+3x_9max  W=5x1+4x2+4x3+3x4+4x5+3x6+2x7+2x8+3x9

  • 目标加权组合
    • ※※双目标规划方法可转化为min{Z,−W}min\{Z,-W\}min{Z,W},这样可以转化成单目标优化
  • 把一个目标作为约束,解另一个目标的规划
    • 先以课程最少为目标,不管学分多少,最优解已经可以通过上面的不等式算出,6门课程,总学分21。
    • 以学分最多,不管课程最多→\rightarrow肯定是选完所有的课程。
    • 先求出一个作为约束条件,课程最小一定是6,我们把它作为约束条件,再来看怎么选学分最高。

总结

  • 用0-1变量表示策略选择是常用的方法
    • “要选甲 (x1)必选乙 (x2)” 可用x1≤x2x1\leq x2x1x2描述.
    • “要选甲 (x1)必不选乙 (x2)” 怎样描述?
    • “甲乙二人至多选一人” 怎样描述?
    • “甲乙二人至少选一人” 怎样描述?
  • 双(多)目标规划的处理方法
    • 加权组合成一个新目标, 化为单目标规划.
    • 一个目标作为约束, 解另一个目标的规划.
### 整数规划概述 整数规划是一种特殊的优化问题,在该类问题中,部分或全部变量被限制为整数值。当目标函数和约束条件均为线性形式时,这种特殊类型的整数规划被称为整数线性规划 (Integer Linear Programming, ILP)[^1]。由于其广泛的适用性和实际意义,整数规划在多个领域得到了广泛应用,例如生产调度、物流管理和资源分配等问题。 #### 基本概念 整数规划可以分为以下几类: - **纯整数规划**:所有决策变量都必须取整数值。 - **混合整数规划**:仅部分决策变量需满足整数约束,其余可为连续值。 - **0-1规划**:决策变量只能取值为0或1,通常用于表示二元选择的情况[^2]。 对于某些特定结构的整数规划问题,存在专门设计的有效算法来求解它们。例如,针对指派问题(Assignment Problem),可以通过匈牙利算法高效找到最优解;而对于更一般的整数线性规划问题,则常采用分支定界法(Branch and Bound)、割平面法(Cutting Plane Method)等通用技术进行处理[^3]。 以下是基于MATLAB实现的一个简单例子展示如何构建并解决一个最大收益型常规指派问题: ```matlab clc, clear, close all; prob = optimproblem('ObjectiveSense', 'max'); x = optimvar('x', 6, 4, 'Type', 'integer', 'LowerBound', 0, 'UpperBound', 1); c = [4 2 3 4; 6 4 5 5; 7 6 7 6; 7 8 8 6; 7 9 8 6; 7 10 8 6]; M = c .* x; % 设置目标函数 prob.Objective = sum(sum(M)); % 添加约束条件 prob.Constraints.con1 = sum(x, 2) == 1; % 每行求和结果等于1 prob.Constraints.con2 = sum(x) >= 1; % 每列求和结果大于等于1 [sol, flav, flag] = solve(prob); disp(sol.x); % 输出解决方案矩阵X disp(flav); % 显示最终的目标函数值 ``` 此代码片段定义了一个具有六个工人和四个任务的最大化利润分配方案,并通过调用`optimproblem()`创建了相应的最优化模型对象。随后利用循环语句分别设置了两个主要约束条件——即每人最多承担一项工作以及每项工作任务至少由一人完成的要求。最后借助内置函数`solve()`完成了整个计算流程[^4]。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值