Python 整数プログラミング - 0-1 型プログラミング

        型 0 −1 の整数計画法は、変数x_{j}が値 0 または 1 のみを取る整数計画法の特殊なケースです。この時x_{j}呼ばれた

0 から 1 の変数、またはバイナリ変数。x_{j}値 0 または 1 のみを取る条件には、次の制約が適用されます。

0\leq x_{j}\leq 1

        整数の置換は、一般的な整数計画法の制約形式と一致しています。実際の問題では、0 −1 個の変数を導入すると、さまざまな状況で個別に議論する必要がある線形計画問題を 1 つの問題に統合できます。最初に、0 −1 個の変数を導入する実際の問題を紹介します。


1.数学的モデリングプロセス

投資サイトの選択 - 相互に排他的なプログラム

例 4 ある企業が、市の東、西、および南地区に営業所を開設しようとしています。提案では、 7 つのポジション (ポイント)A_{i}(i=1,2,...,7)から選択できます。規制:

イーストサイドで。A_{1},A_{2},A_{3} 3 つのポイントのうち、多くても 2 つを 選択してください。

ウエストエンドで。2 つの点のうち少なくとも 1 つA_{4},A_{5} が選択されます。

South Zone ではA_{6},A_{7} 、2 つのポイントのうち少なくとも 1 つが選択されます。

A_{i}ポイントを選択した場合、設備投資はb_{i}RMBと見積もられ、年間利益はc_{i}RMBが、総投資額はBRMBを超えることはできません。聞く

年間利益を最大化するには、どのポイントを選択する必要がありますか?

問題を解くときは、まず 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 {または} 1 \end{array}\right.  \end{整列}

2. 相互に排他的な制約

相互に排他的な制約が 2 つあります。

5 x_{1}+4 x_{2} \leq 24 \text {または} 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 { または } 1 \end{array}\right.

ここで、M は十分に大きな数です。制限

x_{1}=0 \text { または } 500 \leq x_{1} \leq 800

として書き換えることができます

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

相互に排他的な制約が m 個ある場合:

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

制約の 1 つだけが機能するメートルこと、 メートル0 −1 個y_{i}(i=1,2,...,m)の変数と十分に大きな定数M、および次の一連m+1の制約を導入します。

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

 上記の要件を満たします。これは、(2) によりy_{i} 、m の 1 つだけが 0 の値を取ることができるためです。y_{i}^{*}=0(1) に , を代入するi=i^{*}と、制約のみが機能し、他の式は冗長になります。

3. 固定費の問題

        固定費 (fixed cost) の問題は、一般的な線形計画法では記述できませんが、混合整数計画法に変更することで解決できます。以下の例を参照してください。

        例 5 ある工場では、特定の製品を生産するためにいくつかの異なる生産方法を選択できます. 変動費は削減されます. 逆に, 選択した生産方法への投資が少ない場合, 各製品に割り当てられる変動費は将来的に増加する可能性があります. . そのため、総合的に検討する必要があります。3つの方法から選択できます。

  • 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.

目的関数を構成するとき、それを 1 つの問題で一様に議論するために、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 )+\左(k_{3} y_{3}+c_{3} x_{3}\右)

(3) この要件は、次の 3 つの線形制約として表すことができます。

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

 ここ\varepsilonで、 は十分に小さい正の数で、Mは十分に大きい正の数です。> 0 の場合は 1 でなければx_{j}なりません。 = 0が0 の場合のみ意味があります。y_{j}x_{j}y_{j}

栗を取る:

 \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 {または} 1 \end{array}\right.  \end{整列}

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

おすすめ

転載: blog.csdn.net/qq_21402983/article/details/126443083