Python整数规划— 0−1型规划

  • Post author:
  • Post category:python


0 −1型整数规划是整数规划中的特殊情形,它的变量
x_{j}
仅取值 0 或 1。这时
x_{j}
称 为

0 −1变量,或称二进制变量。
x_{j}
仅取值 0 或 1 这个条件可由下述约束条件:

0\leq x_{j}\leq 1

整数所代替,是和一般整数规划的约束条件形式一致的。在实际问题中,如果引入 0 −1变 量,就可以把有各种情况需要分别讨论的线性规划问题统一在一个问题中讨论了。我们 先介绍引入0 −1变量的实际问题。


1.数学建模过程

投资场所的选定—相互排斥的计划

例 4 某公司拟在市东、西、南三区建立门市部。拟议中有 7 个位置(点)
A_{i}(i=1,2,...,7)
可供选择。规定:

在东区。由
A_{1},A_{2},A_{3}
三个点中至多选两个;

在西区。由
A_{4},A_{5}
两个点中至少选一个;

在南区,由
A_{6},A_{7}
两个点中至少选一个。

如选用
A_{i}
点,设备投资估计为
b_{i}
元,每年可获利润估计为
c_{i}
元,但投资总额不能 超过
B
元。问

应选择哪几个点可使年利润为最大?

解题时先引入0 −1变量
x_{i}(i=1,2,...,7)

于是问题可列写成:

\begin{aligned} &\operatorname{Max} \quad z=\sum_{i=1}^{7} c_{i} x_{i} \\ &\left\{\begin{array}{l} \sum_{i=1}^{7} b_{i} x_{i} \leq B \\ x_{1}+x_{2}+x_{3} \leq 2 \\ x_{4}+x_{5} \geq 1 \\ x_{6}+x_{7} \geq 1, \quad x_{i}=0 \text { or } 1 \end{array}\right. \end{aligned}

2.相互排斥的约束条件

有两个相互排斥的约束条件

5 x_{1}+4 x_{2} \leq 24 \text { or } 7 x_{1}+3 x_{2} \leq 45

引入0 −1变量 y ,则上述约束条件可改写为:

\left\{\begin{array}{l} 5 x_{1}+4 x_{2} \leq 24+y M \\ 7 x_{1}+3 x_{2} \leq 45+(1-y) M \\ y=0 \text { or } 1 \end{array}\right.

其中 M 是充分大的数。 约束条件

x_{1}=0 \text { or } 500 \leq x_{1} \leq 800

可改写为

\left\{\begin{array}{l} 500 y \leq x_{1} \leq 800 y \\ y=0 \text { or } 1 \end{array}\right.

如果有 m 个互相排斥的约束条件:

a_{i 1} x_{1}+\cdots+a_{i n} x_{n} \leq b_{i} \quad i=1,2, \cdots, m

为了保证这
m
个约束条件只有一个起作用,我们引入
m
个0 −1变量
y_{i}(i=1,2,...,m)
和一个充分大的常数
M
,而下面这一组
m+1
个约束条件

\begin{aligned} &a_{i 1} x_{1}+\cdots+a_{i n} x_{n} \leq b_{i}+y_{i} M \quad i=1,2, \cdots, m \\ &y_{1}+\cdots+y_{m}=m-1 \end{aligned}

就合于上述的要求。这是因为,由于(2),m 个
y_{i}
中只有一个能取 0 值,设
y_{i}^{*}=0
, 代入(1),就只有
i=i^{*}
的约束条件起作用,而别的式子都是多余的。

3.关于固定费用的问题(Fixed Cost Problem)

固定费用(固定成本)的问题不能用一般线 性规划来描述,但可改变为混合整数规划来解决,见下例。

例 5   某工厂为了生产某种产品,有几种不同的生产方式可供选择,如选定的生产 方式投资高(选购自动化程度高的设备),由于产量大,因而分配到每件产品的变动成 本就降低;反之,如选定的生产方式投资低,将来分配到每件产品的变动成本可能增加。 所以必须全面考虑。今设有三种方式可供选择,令:

  • x_{j}
    表示采用第 j 种方式时的产量;
  • c_{j}
    表示采用第 j 种方式时每件产品的变动成本;
  • k_{j}
    表示采用第 j 种方式时的固定成本。

为了说明成本的特点,暂不考虑其它约束条件。采用各种生产方式的总成本分别为:

P_{j}=\left\{\begin{array}{ll} k_{j}+c_{j} x_{j}, & \text { } x_{j}>0 \\ 0, & \text { } x_{j}=0 \end{array} \quad j=1,2,3 .\right.

在构成目标函数时,为了统一在一个问题中讨论,现引入0 −1变量
y_{j}
,令

于是目标函数

\min z=\left(k_{1} y_{1}+c_{1} x_{1}\right)+\left(k_{2} y_{2}+c_{2} x_{2}\right)+\left(k_{3} y_{3}+c_{3} x_{3}\right)

(3)式这个规定可表为下述 3 个线性约束条件:

y_{j} \varepsilon \leq x_{j} \leq y_{j} M, \quad j=1,2,3

其中
\varepsilon
是一个充分小的正常数,
M
是个充分大的正常数。当
x_{j}
> 0时
y_{j}
必须为 1;当
x_{j}
= 0时只有
y_{j}
为 0 时才有意义。


举个栗子:

\begin{aligned} &\operatorname{Max} \quad z=3 x_{1}-2 x_{2}+5 x_{3} \\ &\left\{\begin{array}{l} x_{1}+2 x_{2}-x_{3} \leq 2 \\ x_{1}+4 x_{2}+x_{3} \leq 4 \\ x_{1}+x_{2} \leq 3 \\ 4 x_{2}+x_{3} \leq 6 \\ x_{1}, x_{2}, x_{3}=0 \text { or } 1 \end{array}\right. \end{aligned}

4.编程实现

使用Python实现

import pulp
InvestLP = pulp.LpProblem("0 −1型整数规划问题", sense=pulp.LpMaximize)  # 定义问题,求最大值
x1= pulp.LpVariable('x1', cat='Binary')  # 定义 x1
x2= pulp.LpVariable('x2', cat='Binary')  # 定义 x2
x3= pulp.LpVariable('x3', cat='Binary')  # 定义 x3
InvestLP += (3*x1 - 2*x2 + 5*x3 )  # 设置目标函数 f(x)
InvestLP += (x1 + 2*x2 - x3  <= 2)  # 不等式约束
InvestLP += (x1 + 4*x2 + x3 <= 4)
InvestLP += (x1 +x2 <= 3)
InvestLP += (4*x2 +x3 <= 6)
InvestLP.solve()
print(InvestLP.name)  # 输出求解状态
print("求解状态:", pulp.LpStatus[InvestLP.status])  # 输出求解状态
for v in InvestLP.variables():
    print(v.name, "=", v.varValue)  # 输出每个变量的最优值
print("目标函数值 =", pulp.value(InvestLP.objective))  # 输出最优解的目标函数值

输出结果:

0 −1型整数规划问题
求解状态: Optimal
x1 = 1.0
x2 = 0.0
x3 = 1.0
目标函数值 = 8.0



版权声明:本文为qq_21402983原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。