医療最適化問題 PuLP

医療最適化問題

ある病院における輸血の最適化問題を考えてみましょう。

具患者に輸血を行う場合、その輸血に使用する血液の種類によって、患者に不適切な血液を投与してしまうリスクがあります。

このため、輸血に使用する血液の種類を適切に選択することが重要です。

この問題をPuLPを使って解くためには、以下のような手順を踏みます。

  1. 必要なパッケージをインポートします。

    1
    from pulp import *
  2. 問題を定義します。

    1
    2
    # 問題を定義
    prob = LpProblem('Blood_Transfusion', LpMinimize)
  3. 変数を定義します。

    1
    2
    3
    4
    # 変数を定義
    blood_type_A = LpVariable('Blood_Type_A', lowBound=0, cat='Integer')
    blood_type_B = LpVariable('Blood_Type_B', lowBound=0, cat='Integer')
    blood_type_O = LpVariable('Blood_Type_O', lowBound=0, cat='Integer')
  4. 目的関数を定義します。

    1
    2
    # 目的関数を定義
    prob += 10 * blood_type_A + 20 * blood_type_B + 30 * blood_type_O

各血液の種類について、そのコストを10, 20, 30としました。

血液の種類がAの場合には10のコスト、Bの場合には20のコスト、Oの場合には30のコストがかかるということになります。

  1. 制約条件を定義します。
    1
    2
    3
    4
    5
    # 制約条件を定義
    prob += blood_type_A + blood_type_B + blood_type_O >= 100
    prob += blood_type_A >= 20
    prob += blood_type_B >= 30
    prob += blood_type_O >= 40

病院で必要な総血液量が100であること、血液の種類Aが20以上必要であること、血液の種類Bが30以上必要であること、血液の種類Oが40以上必要であることを制約条件として定義しています。

  1. 最適化を実行します。

    1
    2
    # 最適化を実行
    prob.solve()
  2. 結果を表示します。

    1
    2
    3
    4
    5
    # 結果を表示
    print('Blood Type A: ', blood_type_A.value())
    print('Blood Type B: ', blood_type_B.value())
    print('Blood Type O: ', blood_type_O.value())
    print('Total Cost: ', value(prob.objective))

完全なソースコード

以上の手順をすべて組み合わせた完全なコードは次のようになります。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from pulp import *

# 問題を定義
prob = LpProblem('Blood_Transfusion', LpMinimize)

# 変数を定義
blood_type_A = LpVariable('Blood_Type_A', lowBound=0, cat='Integer')
blood_type_B = LpVariable('Blood_Type_B', lowBound=0, cat='Integer')
blood_type_O = LpVariable('Blood_Type_O', lowBound=0, cat='Integer')

# 目的関数を定義
prob += 10 * blood_type_A + 20 * blood_type_B + 30 * blood_type_O

# 制約条件を定義
prob += blood_type_A + blood_type_B + blood_type_O >= 100
prob += blood_type_A >= 20
prob += blood_type_B >= 30
prob += blood_type_O >= 40

# 最適化を実行
prob.solve()

# 結果を表示
print('Blood Type A: ', blood_type_A.value())
print('Blood Type B: ', blood_type_B.value())
print('Blood Type O: ', blood_type_O.value())
print('Total Cost: ', value(prob.objective))

[実行結果]

Blood Type A:  30.0
Blood Type B:  30.0
Blood Type O:  40.0
Total Cost:  2100.0

この結果から、血液の種類Aが30、種類Bが30、種類Oが40必要であり、総コストが2100であることが確認できました。