规划数学建模 2 - 非线性规划(01 规划、整数规划、动态规划)
最编程
2024-04-20 12:33:45
...
术语解释
- 整数规划:规划中的变量(全部或部分)限制为整数,称为整数规划。(很多的单位是不能拆分成小数的)
- 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的购买量
- M a x = 4.8 ( x 11 + x 21 ) + 5.6 ( x 12 + x 22 ) − 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 ) = { 10 x ( 0 ≤ x ≤ 500 ) 8 x + 1000 ( 500 ≤ x ≤ 1000 ) 6 x + 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(0≤x≤500)(500≤x≤1000)(1000≤x≤1500)
- 原油供应
- x 11 + x 12 ≤ 500 + x x_{11}+x_{12}\leq 500+x x11+x12≤500+x 库存500t
- x 21 + x 22 ≤ 1000 x_{21}+x_{22}\leq 1000 x21+x22≤1000 库存1000t
- x ≤ 1500 x\leq 1500 x≤1500不能卖超过1500
- x 11 x 11 + x 21 ≥ 0.5 \frac{x_{11}}{x_{11}+x_{21}}\geq 0.5 x11+x21x11≥0.5,A要大于50%。
- x 12 x 12 + x 22 ≥ 0.6 \frac{x_{12}}{x_{12}+x_{22}}\geq 0.6 x12+x22x12≥0.6,B要大于60%。
- 目标函数c(x)不是线性函数,是非线性规划。
- 对于用分段函数定义的c(x),一般的非线性规划软件也难以输入和求解。
模型求解
- x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3以价格10,8,6(千元/t)采购A的吨数。这对于任何一种情况都成立。
- 于是有 x = x 1 + x 2 + x 3 , c ( x ) = 10 x 1 + 8 x 2 + 6 x 3 x = x_1+x_2+x_3,\space c(x) = 10x_1+8x_2+6x_3 x=x1+x2+x3, c(x)=10x1+8x2+6x3
- M a x = 4.8 ( x 11 + x 21 ) + 5.6 ( x 12 + x 22 ) − 10 x 1 + 8 x 2 + 6 x 3 Max \space \space = 4.8(x_{11}+x_{21})+5.6(x_{12}+x_{22})-10x_1+8x_2+6x_3 Max =4.8(x11+x21)+5.6(x12+x22)−10x1+8x2+6x3
- 然而只有当 x 1 = 500 x_1 = 500 x1=500的时候, x 2 x_2 x2才能有值,同理当 x 1 + x 2 ≥ 1000 x 2 = 500 x_1+x_2\geq 1000 x_2=500 x1+x2≥1000x2=500时, x 3 x_3 x3才能有值
- 所以约束等价于 ( x 1 − 500 ) ∗ x 2 = 0 (x_1-500)*x_2 = 0 (x1−500)∗x2=0【这个太牛逼了】
- 同理 ( x 2 − 500 ) x 3 = 0 (x_2-500)x_3 = 0 (x2−500)x3=0
- 0 ≤ x 1 , x 2 , x 3 ≤ 500 0\leq x_1,x_2, x_3\leq 500 0≤x1,x2,x3≤500
求解代码
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
推荐阅读
-
正负偏差变量 即 d2+、d2- 分别表示决策值中超出和未达到目标值的部分。而 di+、di- 均大于 0 刚性约束和目标约束(柔性目标约束有偏差) 在多目标规划中,>=/<= 在刚性约束中保持不变。当需要将约束条件转换为柔性约束条件时,需要将 >=/<= 更改为 =(因为已经有 d2+、d2- 用来表示正负偏差),并附加上 (+dii-di+) 注意这里是 +di、-di+!之所以是 +di,-di+,是因为需要将目标还原为最接近的原始刚性约束条件 优先级因素和权重因素 对多个目标进行优先排序和优先排序 目标规划的目标函数 是所有偏差变量的加权和。值得注意的是,这个加权和都取最小值。而 di+ 和 dii- 并不一定要出现在每个不同的需求层次中。具体分析需要具体问题具体分析 下面是一个例子: 题目中说设备 B 既要求充分利用,又要求尽可能不加班,那么列出的时间计量表达式即为:min z = P3 (d3- + d3 +) 使用 + 而不是 -d3 + 的原因是:正负偏差不可能同时存在,必须有 di+di=0 (因为判定值不可能同时大于目标值和小于目标值),而前面是 min,所以只要取 + 并让 di+ 和 dii- 都为正值即可。因此,得出以下规则: 最后,给出示例和相应的解法: 问题:某企业生产 A 和 B 两种产品,需要使用 A、B、C 三种设备。下表显示了与工时和设备使用限制有关的产品利润率。问该企业应如何组织生产以实现下列目标? (1) 力争利润目标不低于 1 500 美元; (2) 考虑到市场需求,A、B 两种产品的生产比例应尽量保持在 1:2; (3)设备 A 是贵重设备,严禁超时使用; (4)设备 C 可以适当加班,但要控制;设备 B 要求充分利用,但尽量不加班。 从重要性来看,设备 B 的重要性是设备 C 的三倍。 建立相应的目标规划模型并求解。 解:设企业生产 A、B 两种产品的件数分别为 x1、x2,并建立相应的目标计划模型: 以下为顺序求解法,利用 LINGO 求解: 1 级目标: 模型。 设置。 variable/1..2/:x;! s_con_num/1...4/:g,dplus,dminus;!所需软约束数量(g=dplus=dminus 数量)及相关参数; s_con(s_con_num);! s_con(s_con_num,variable):c;!软约束系数; 结束集 数据。 g=1500 0 16 15. c=200 300 2 -1 4 0 0 5; 结束数据 min=dminus(1);!第一个目标函数;!对应于 min=z 的第一小部分;! 2*x(1)+2*x(2)<12;!硬约束 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i)); !使用设置完成的数据构建软约束表达式; ! !软约束表达式 @for(variable:@gin(x)); !将变量约束为整数; ! 结束 此时,第一级目标的最优值为 0,第一级偏差为 0: 第二级目标: !求 dminus(1)=0,然后求解第二级目标。 模型。 设置。 变量/1..2/:x;!设置:变量/1..2/:x; ! s_con_num/1...4/:g,dplus,dminus;!软约束数量及相关参数; s_con(s_con_num(s_con_num));! s_con(s_con_num,variable):c;! 软约束系数; s_con(s_con_num,variable):c;! 结束集 数据。 g=1500 0 16 15; c=200 300 2 -1 4 0 0 5; 结束数据 min=dminus(2)+dplus(2);!第二个目标函数 2*x(1)+2*x(2)<12;!硬约束 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i)); ! 软约束表达式;! dminus(1)=0; !第一个目标结果 @for(variable:@gin(x)); ! 结束 此时,第二个目标的最优值为 0,偏差为 0: 第三目标 !求 dminus(2)=0,然后求解第三个目标。 模型。 设置。 变量/1..2/:x;!设置:变量/1..2/:x; ! s_con_num/1...4/:g,dplus,dminus;!软约束数量及相关参数; s_con(s_con_num(s_con_num));! s_con(s_con_num,variable):c;! 软约束系数; s_con(s_con_num,variable):c;! 结束集 数据。 g=1500 0 16 15; c=200 300 2 -1 4 0 0 5; 结束数据 min=3*dminus(3)+3*dplus(3)+dminus(4);!第三个目标函数。 2*x(1)+2*x(2)<12;!硬约束 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i)); ! 软约束表达式;! dminus(1)=0; !第一个目标约束条件; ! dminus(2)+dplus(2)=0; !第二个目标约束条件 @for(variable:@gin(x));! 结束 最终结果为 x1=2,x2=4,dplus(1)=100,最优利润为
-
数学建模 [作业问题 - 解释性摘要(数据处理方法、规划模型、图形和网络模型、微分方程模型、统计模型、系统评价决策模型)] 第 3 章 数据处理方法- 第 3 章 数据处理方法
-
[数学建模] Python+Gurobi - 从零开始学习优化建模线性规划模型 (LP)
-
Python 数学建模系列(II):整数规划的规划问题
-
Python 数学建模系列(II):整数规划的规划问题
-
Python 数字建模笔记 - 模拟退火算法(3)整数规划问题
-
规划数学建模 2 - 非线性规划(01 规划、整数规划、动态规划)
-
数学规划模型 - 整数规划问题
-
小白自学数学建模丨M002 - 整数规划(ILP)
-
数学建模学习 - 整数规划 1