税金 最適化 PuLP

税金 最適化

税金に関する最適化問題の例として、税金の申告を行う個人が受ける税金控除の種類や額を最適に選択する問題を考えてみましょう。

具体的には、以下のような問題設定を考えます。


ある個人が申告する税金の総額を $T$ とします。

この個人は、以下のような種類の税金控除を受けることができます。

🔹住宅ローン控除: 最大で $H$ 円までの住宅ローンの利息を控除できる。
🔹教育費控除: 最大で $E$ 円までの教育費を控除できる。
🔹寄附金控除: 寄附金のうち、最大で $D$ 円までを控除できる。

この個人は、これらの控除を組み合わせて、総支払額である $T$ 円を最小限に抑えたいと考えています。

解法

最小限の支払額を求めるために、PuLPを用いた線形計画法を適用してみましょう。

数学モデルを以下に示します。

【変数】

🔹$h$: 住宅ローン控除額
🔹$e$: 教育費控除額
🔹$d$: 寄附金控除額

【目的関数】

🔹$\min$ $T - (h+e+d)$

【制約条件】

🔹住宅ローン控除は $H$ 円以内でなければならない:$h \leq H$
🔹教育費控除は $E$ 円以内でなければならない:$e \leq E$
🔹寄附金控除は $D$ 円以内でなければならない:$d \leq D$
🔹総控除額は総支払額 $T$ 以下でなければならない:$h+e+d \leq T$

PuLPを使ってこの問題を解くには、以下のようになります。

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
28
29
30
31
32
33
34
35
36
37
38
from pulp import *

# 最大の住宅ローン控除額
H = 500000

# 最大の教育費控除額
E = 100000

# 最大の寄附金控除額
D = 30000

# 総支払額
T = 1000000

# 問題を定義
prob = LpProblem("tax_optimization", LpMinimize)

# 変数を定義
h = LpVariable("h", 0, H)
e = LpVariable("e", 0, E)
d = LpVariable("d", 0, D)

# 目的関数を定義
prob += T - (h + e + d)

# 制約条件を定義
prob += h <= H
prob += e <= E
prob += d <= D
prob += h + e + d <= T

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

# 結果を表示
print(f"Status: {LpStatus[status]}")
print(f"Optimal value: {value(prob.objective)}")
print(f"h: {value(h.value())}, e: {value(e.value())}, d: {value(d.value())}")

このコードを実行すると、以下のような結果が得られます。

[実行結果]
Status: Optimal
Optimal value: 370000.0
h: 500000.0, e: 100000.0, d: 30000.0

この結果から、総支払額 $T$ が $1000000$ 円の場合、最小限の支払額は $370000$ 円であり、そのうち $500000$ 円が住宅ローン控除、$100000$ 円が教育費控除、$30000$ 円が寄附金控除であることがわかります。