0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【実装編】公共財供給メカニズム〜ピボタルメカニズム〜

0
Last updated at Posted at 2026-06-01

前回はボーエンメカニズムを紹介しました。ボーエンメカニズムは制約が厳しいことからボーエン=サミュエルソン条件を一般的には満たさないことを確認しました。

そこで、今回はプレイヤーの選好に対して別の制限を設けたピボタルメカニズムを紹介します。

【補足】ピボタルとは
「ピボタル(pivotal)」は物事の「回転軸」や「中心」を意味する単語から派生し、「極めて重要な」「中心的な」「決定的な」という意味を持つ形容詞です。何かの方向性や結果を大きく左右する、中枢となる要素に対して使われます。

【概要】

公共財を「供給するか・しないか」の2択(分割不可能な1単位)に限定した設定のもとで、各プレイヤーが表明した評価値の合計に基づいて供給の可否を決定し、自分の表明が供給の決定を左右した(ピボタルになった)プレイヤーのみに追加費用(クラーク税)を課します。この仕組みによって、正直に申告することが支配戦略となります。

満たす性質

性質 結果 理由
ボーエン=サミュエルソン条件 正直申告が支配戦略のため $\sum w_i = \sum v_i$ が成立し、パレート効率的な供給が実現されます
予算均衡条件 × 一般に $\sum t_i \neq c(G)$ となり余剰が生じます
個人合理性 × クラーク税の支払いにより、参加前より利得が下がるプレイヤーが生じます
耐戦略性 正直申告 $w_i = v_i$ が支配戦略です(後述)

【補足】グローブスメカニズムとの関係
(本記事とはあまり関係ありませんが、)ピボタルメカニズムはグローブスメカニズムの課税関数 $t_i = \sum_{j \neq i} w_j(G^*) + h(w_{-i})$ において、任意関数を $h(w_{-i}) = 0$ と設定したものに対応します。

ピボタルメカニズム(グローブスメカニズム)について、予算均衡条件と個人合理性は同時に満たせません(グリーン=ラフォン定理)。

【アルゴリズム】

  • ステップ1:各プレイヤー $i$ に公共財供給に対する評価値 $w_i$ を表明させます。マイナスの評価値は「供給してほしくない」という意思を表します。
  • ステップ2:表明された評価値の合計が供給費用 $c(G)$(今回は $c(G) = 0$ に基準化)以上であれば公共財を供給し、そうでなければ供給しません。
【\boldsymbol{供給水準}】G = \begin{cases} 1 & \text{if}\quad \displaystyle\sum_{i=1}^{n} w_i \geq 0 \\[6mm] 0 & \text{if}\quad \displaystyle\sum_{i=1}^{n} w_i < 0 \end{cases}
  • ステップ3:各プレイヤー $i$ に対して、「自分を除く全員の評価値の合計 $\sum_{j \neq i} w_j$ に基づく供給の可否」がステップ2の決定と異なる場合(=自分の表明が結果を左右した場合)のみ、$\left|\sum_{j \neq i} w_j\right|$ をクラーク税として徴収します。
【\boldsymbol{追加費用(クラーク税)}】t_i = \begin{cases} \left|\displaystyle\sum_{j \neq i} w_j\right| & \text{if}\quad \left(\displaystyle\sum_{i=1}^{n} w_i\right)\left(\displaystyle\sum_{j \neq i} w_j\right) < 0 \\[8mm] 0 & \text{otherwise} \end{cases}

上記のアルゴリズムを踏まえ、最終的な利得 $u_i(x_i,G)$ は下式のようになります。

【\boldsymbol{利得}】u_i(x_i,G)=x_i+v_i\cdot G-t_i

ピボタルメカニズムの耐戦略性

追加費用$t_i$はプレイヤーが決めた評価値が全体の評価値の符号を変えるほどの影響を与える場合に発生します。これにより嘘をつく動機がなくなり、正直申告が常に最善(最も合理的)になります。ゆえに、正直申告が支配戦略になります

【プログラム】Python

"""
ピボタルメカニズム(Pivotal Mechanism)
"""

# ===== 定数 =====
SEPARATOR = "=" * 50


# ===== 入力設定 =====
def input_data() -> tuple:
    """パラメータを設定する"""
    N   = 3                        # プレイヤー数
    x_p = [2, 2, 2]                # 各プレイヤーの私的財(初期保有)
    v   = [3, 1, -2]               # 真の便益(負値 = 公共財供給に反対)
    w   = [3, 1, -2]               # 表明する評価値(ここでは真実申告を仮定)
    return N, x_p, v, w


# ===== 供給水準の決定 =====
def determine_supply(w: list) -> int:
    """表明評価値の合計 ≥ 0 なら G=1(供給)、< 0 なら G=0(非供給)"""
    return 1 if sum(w) >= 0 else 0


# ===== 費用負担の計算 =====
def calculate_burden(N: int, w: list) -> list:
    """クラーク税(ピボタル税)t_i を計算する

    自分の申告が供給の可否を変えた場合のみ |Σ_{j≠i} w_j| を課税する。
    条件: (Σw_i) × (Σ_{j≠i} w_j) < 0  ← 自分の参加で符号が逆転する場合
    """
    total = sum(w)
    t = [0] * N
    for i in range(N):
        sum_without_i = total - w[i]
        if total * sum_without_i < 0:      # 自分がピボタル(結果を左右する)
            t[i] = abs(sum_without_i)
    return t


# ===== 利得の計算 =====
def calculate_payoff(N: int, x_p: list, v: list, G: int, t: list) -> list:
    """各プレイヤーの利得 u_i = x_p_i + v_i * G - t_i を計算する"""
    return [x_p[i] + v[i] * G - t[i] for i in range(N)]


# ===== 条件の確認 =====
def check_conditions(N: int, G: float, burden: list, payoff: list,
                     endowment: list, c_G: float) -> None:
    """予算均衡条件と個人合理性を数値的に確認する"""
    budget_ok = abs(sum(burden) - c_G) < 1e-9
    ir_flags  = [payoff[i] >= endowment[i] for i in range(N)]
    ir_ok     = all(ir_flags)

    print("【条件の確認】")
    print(f"  予算均衡条件 : {'⚫ 成立' if budget_ok else '× 不成立'}"
          f"  (Σt_i = {sum(burden):.4f}, c(G) = {c_G:.4f}")
    print(f"  個人合理性   : {'⚫ 成立' if ir_ok else '× 不成立'}")
    for i in range(N):
        sign = "" if ir_flags[i] else "<"
        mark = "" if ir_flags[i] else "×"
        print(f"    プレイヤー {i+1}: u_{i+1} = {payoff[i]:.4f} "
              f"{sign} x_p_{i+1} = {endowment[i]:.4f}  {mark}")


# ===== メイン =====
def main() -> None:
    print(SEPARATOR)
    print("  ピボタルメカニズム(Pivotal Mechanism)")
    print(SEPARATOR + "\n")

    # 1. 入力情報
    N, x_p, v, w = input_data()
    print("【入力情報】")
    print(f"  プレイヤー数 N      : {N}")
    print(f"  私的財(初期保有)  : {x_p}")
    print(f"  真の便益 v_i        : {v}")
    print(f"  表明する評価値 w_i  : {w}  (真実申告: w_i = v_i)\n")

    # 2. 公共財供給水準の決定
    G = determine_supply(w)
    print("【公共財供給水準】")
    print(f"  Σw_i = {sum(w)}{'G = 1(供給)' if G == 1 else 'G = 0(非供給)'}\n")

    # 3. 費用負担の計算(クラーク税)
    burden = calculate_burden(N, w)
    print("【費用負担(クラーク税)】")
    for i in range(N):
        s_i = sum(w) - w[i]
        pivotal = (sum(w) * s_i < 0)
        label = "ピボタル → 課税" if pivotal else "非ピボタル → 非課税"
        print(f"  プレイヤー {i+1}: Σ_{{j≠{i+1}}} w_j = {s_i:+d},  "
              f"t_{i+1} = {burden[i]}{label}")
    print()

    # 4. 利得の計算
    payoff = calculate_payoff(N, x_p, v, G, burden)
    print("【利得】  u_i = x_p_i + v_i × G - t_i")
    for i in range(N):
        print(f"  プレイヤー {i+1}: u_{i+1} = {x_p[i]} + {v[i]}×{G} - {burden[i]} = {payoff[i]:.4f}")
    print()

    # 5. 条件の確認(c(G) = 0 に基準化、初期保有 x_p_i と比較)
    check_conditions(N, G, burden, payoff, endowment=list(map(float, x_p)), c_G=0.0)


if __name__ == "__main__":
    main()

コード解説

  • determine_supply(w):評価値の合計が $0$ 以上であれば $G = 1$(供給)、未満であれば $G = 0$(非供給)を返します。
  • calculate_burden(N, w):全体の合計と自分を除く合計の積が負(符号が逆転する)プレイヤーをピボタルと判定し、$|S_{-i}|$ をクラーク税として課します。ピボタルでないプレイヤーの税額は $0$ です。
  • calculate_payoff(N, x_p, v, G, t):利得 $u_i = x_{p,i} + v_i \cdot G - t_i$ を計算します。
  • check_conditions(...):4メカニズム共通の条件確認関数です。予算均衡条件は $\sum t_i$ と $c(G) = 0$ を比較し、個人合理性は $u_i$ と初期保有 $x_{p,i}$ を比較します。プレイヤー3は $v_3 = -2$ のため公共財供給によって利得が初期保有を下回り、個人合理性が満たされません。

実行結果(N=3、$v = [3, 1, -2]$、真実申告の場合)

==================================================
  ピボタルメカニズム(Pivotal Mechanism)
==================================================

【入力情報】
  プレイヤー数 N      : 3
  私的財(初期保有)  : [2, 2, 2]
  真の便益 v_i        : [3, 1, -2]
  表明する評価値 w_i  : [3, 1, -2]  (真実申告: w_i = v_i)

【公共財供給水準】
  Σw_i = 2  →  G = 1(供給)

【費用負担(クラーク税)】
  プレイヤー 1: Σ_{j≠1} w_j = -1,  t_1 = 1  (ピボタル → 課税)
  プレイヤー 2: Σ_{j≠2} w_j = +1,  t_2 = 0  (非ピボタル → 非課税)
  プレイヤー 3: Σ_{j≠3} w_j = +4,  t_3 = 0  (非ピボタル → 非課税)

【利得】  u_i = x_p_i + v_i × G - t_i
  プレイヤー 1: u_1 = 2 + 3×1 - 1 = 4.0000
  プレイヤー 2: u_2 = 2 + 1×1 - 0 = 3.0000
  プレイヤー 3: u_3 = 2 + -2×1 - 0 = 0.0000

【条件の確認】
  予算均衡条件 : × 不成立  (Σt_i = 1.0000, c(G) = 0.0000)
  個人合理性   : × 不成立
    プレイヤー 1: u_1 = 4.0000 ≥ x_p_1 = 2.0000  ⚫
    プレイヤー 2: u_2 = 3.0000 ≥ x_p_2 = 2.0000  ⚫
    プレイヤー 3: u_3 = 0.0000 < x_p_3 = 2.0000  ×

実行結果の解説

$\sum w_i = 3 + 1 + (-2) = 2 \geq 0$ より、公共財が供給されます($G = 1$)。

プレイヤー $\sum_{j \neq i} w_j$ ピボタル判定 クラーク税 $t_i$
1 $-1$ ○(符号が逆転。自分がいないと供給されない) $|-1| = 1$
2 $+1$ ×(自分がいなくても供給される) $0$
3 $+4$ ×(自分がいなくても供給される) $0$

プレイヤー1は「自分がいなければ $\sum_{j \neq 1} w_j = -1 < 0$ となり供給されなかった」という意味でピボタルであり、追加費用が課されます。このペナルティ構造によって、いずれのプレイヤーも評価値を偽るインセンティブがなくなります(耐戦略性)。

参考資料

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?