Python小白的数学建模课-05.0-1规划

Posted youcans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python小白的数学建模课-05.0-1规划相关的知识,希望对你有一定的参考价值。


0-1 规划不仅是数模竞赛中的常见题型,也具有重要的现实意义。

双十一促销中网购平台要求二选一,就是互斥的决策问题,可以用 0-1规划建模。

小白学习 0-1 规划,首先要学会识别 0-1规划,学习将问题转化为数学模型。

『Python小白的数学建模课 @ Youcans』带你从数模小白成为国赛达人。



1. 什么是 0-1 规划?

0-1 整数规划是一类特殊的整数规划,变量的取值只能是 0 或 1。

0-1 变量可以描述开关、取舍、有无等逻辑关系、顺序关系,可以处理背包问题、指派问题、选址问题 、计划安排、线路设计 、人员安排等各种决策规划问题。进而,任何整数都可以用二进制表达,整数变量就可以表示为多个 0-1 变量的组合,因此任何整数规划都可以转化为 0-1 规划问题来处理。0-1 规划问题与运筹学中的很多经典问题也都有紧密联系。

在数学建模学习中,0-1 规划主要用于求解互斥的决策问题、互斥的约束条件问题、固定费用问题和分派问题。0-1 规划是数模竞赛的常见题型,国赛 B题经常有 0-1规划问题或可以转化为 0-1 规划问题。

0-1 规划的算法都比较复杂,大规模问题一般没有精确解法。本文仍然使用 PuLP 工具包求解 0-1 规划问题,该工具包的使用比较简单。建议本文读者重点关注 0-1 规划问题的分类及建模方法,把握哪些问题是 0-1 规划问题,是哪一类的 0-1 规划问题,如何对这些典型问题进行建模。在此基础上,才能调用 PuLP 函数进行求解。


欢迎关注 『Python小白的数学建模课 @ Youcans』 系列,持续更新
Python小白的数学建模课-A1.国赛赛题类型分析
Python小白的数学建模课-A2.2021年数维杯C题探讨
Python小白的数学建模课-01.新手必读
Python小白的数学建模课-02.数据导入
Python小白的数学建模课-03.线性规划
Python小白的数学建模课-04.整数规划
Python小白的数学建模课-05.0-1规划
Python数模笔记-PuLP库
Python数模笔记-StatsModels统计回归
Python数模笔记-Sklearn
Python数模笔记-NetworkX
Python数模笔记-模拟退火算法




2. 0-1 规划的分类及建模方法

规划问题的数学模型包括决策变量、约束条件和目标函数,围绕这三个要素都可能存在互斥的情况,从而导出不同类型的0-1规划问题,其建模方法也有差别。

2.1 互斥的决策问题

互斥的决策问题,是指决策方案、计划互斥,如决定投资项目、确定投资场所、选择投产产品等。

例如,双十一的促销活动,淘宝、京东、拼多多要求店铺二选一,最多只能选择参加一家平台,否则可能会被封杀,这是典型的互斥决策问题。

背包问题就是经典的互斥决策问题。给定一组 n 个物品,每种物品 i 的价值为 v i v_i vi、重量/体积为 w i w_i wi,背包所能容纳的总重量/总容量为(B),如何选择其中若干种物品(每种物品选 0 个或 1 个),使得物品的总价值最高?

背包问题的建模方法如下:

定义决策变量为:
x i = { 0 , 不 选 择 第    i    个 物 品 1 , 选 择 第    i    个 物 品 x_i = \\begin{cases} 0,不选择第\\;i\\;个物品\\\\ 1,选择第\\;i\\;个物品 \\end{cases} xi={0i1i
定义目标函数为:
m a x    f ( x ) = ∑ i = 1 n v i x i s . t . : { ∑ i = i n w i x i ≤ B , x i = 0 , 1 max\\;f(x) = \\sum_{i=1}^n v_i x_i\\\\ s.t.:\\begin{cases} \\sum_{i=i}^n w_i x_i \\leq B, \\\\ x_i = 0,1 \\end{cases} maxf(x)=i=1nvixis.t.:{i=inwixiB,xi=0,1

很多应用问题都可以用上述的背包问题数学模型来表达,例如:

  • 有 n个项目,每个项目所需投资额为 w i w_i wi,投产后的利润为 v i v_i vi,投资总限额为 B,求利润最大的投资方案;
  • 处理器能力有限,任务很多,如何选择使处理器的效用最大;

2.2 互斥的约束问题

互斥的约束问题,是指具有多个互斥的约束条件,这些约束条件只有一个起作用。

例如,货物运输有车运或者船运两种运输方式可供选择,已知采用车运的约束条件和船运的约束条件,必须且只能选择其中一种运输方式。这两个约束条件互斥,有且只有一个起作用,这是可以引入一个 0-1变量来处理。

一般地,设有 m 个互斥的约束条件:
a i 1 x 1 + . . . a i n x n ≤ b i , i = 1 , . . . m a_{i1}x_1 + ...a_{in}x_n \\leq b_i,i=1,...m ai1x1+...ainxnbii=1,...m

该类问题的建模方法,为了保证只有一个约束条件起作用,可以引入一个充分大的常数 M 和 m 个 0-1 变量表示约束是否起作用:
y i = { 0 , 第 i 个 约 束 不 起 作 用 1 , 第 i 个 约 束 起 作 用 y_i = \\begin{cases} 0,第 i 个约束不起作用\\\\ 1,第 i 个约束起作用 \\end{cases} yi={0i1i

于是可以构造新的 m+1 个约束条件:
s . t . : { a i 1 x 1 + . . . a i n x n ≤ b i + ( 1 − y i ) M , i = 1 , . . . m y 1 + . . . + y m = 1 y i = 0 , 1 s.t.:\\begin{cases} a_{i1}x_1 + ...a_{in}x_n \\leq b_i + (1-y_i)M,i=1,...m\\\\ y_1 + ... + y_m = 1\\\\ y_i = 0,1 \\end{cases} s.t.:ai1x1+...ainxnbi+(1yi)Mi=1,...my1+...+ym=1yi=0,1

由于 M 足够大,新的约束条件就能保证只有 y_i=1 的约束条件起作用,而其它约束条件都不起作用。


2.3 固定费用问题(Fixed cost problem)

固定费用问题,是指求解生产成本最小问题时,总成本包括固定成本和变动成本,而选择不同生产方式会有不同的固定成本,因此总成本与选择的生产方式有关。

固定费用问题,实际上是互斥的目标函数问题,对于不同的生产方式具有多个互斥的目标函数,但只有一个起作用。固定费用问题不能用一般的线性规划模型求解。

一般地,设有 m 种生产方式可供选择,采用第 j j j 种方式时的固定成本为 K j K_j Kj、变动成本为 c j c_j cj、产量为 x j x_j xj,则采用各种生产方式的总成本分别为:

m i n    P j = { k j + c j x j , x j ≥ 0 0 , x j = 0 , j = 1 , . . . m min\\;P_j = \\begin{cases} k_j + c_j x_j,&x_j \\geq 0\\\\ 0,&x_j = 0, j=1,...m \\end{cases} minPj={kj+cjxj0xj0xj=0,j=1,...m

该类问题的建模方法,为了构造统一的目标函数,可以引入 m 个 0-1 变量 y_j 表示是否采用第 j 种生产方式:
y j = { 0 , 不 采 用 第    j    种 生 产 方 式 1 , 采 用 第    j    种 生 产 方 式 y_j = \\begin{cases} 0,不采用第\\;j\\;种生产方式\\\\ 1,采用第\\;j\\; 种生产方式 \\end{cases} yj=以上是关于Python小白的数学建模课-05.0-1规划的主要内容,如果未能解决你的问题,请参考以下文章

Python小白的数学建模课-03.线性规划

Python小白的数学建模课-04.整数规划

Python小白的数学建模课-12.非线性规划

Python小白的数学建模课-12.非线性规划

Python小白的数学建模课-03.线性规划

Python小白的数学建模课-03.线性规划