🎓 レベル:標準 | 重要度:B(推奨)
📎 前提:多目的問題とパレート最適・期待効用と効用関数 | 関連:階層分析法(AHP)
要点(BLUF)
- 多属性効用理論(MAUT) は、複数の属性(コスト・性能…)を各属性の部分効用に変換し、重み付き和で1つの総合効用に束ねる方法です。
- 加法形 が正当化されるのは、属性間に相互選好独立性が成り立つとき。重み は属性の相対的重要度を表します。
- パレートフロンティア(多目的問題とパレート最適)上の1点を、明示した重みで選び出す操作。重みと正規化の置き方で結論が決まるため、透明性が命です。
1. なぜ効用に変換するのか
属性は単位がバラバラです。コストは「円」、性能は「点」、快適性は「5段階」——このまま足せません。そこで各属性を、0〜1の部分効用(最悪が0、最良が1)に変換してから重み付けします。これは期待効用と効用関数の効用を、複数の属性に拡張したものです。
総合効用は加法形で書きます。
が属性 の部分効用、 がその重み。 が最大の代替案を選びます。
2. 正規化と加重和
最も単純な部分効用は、線形の正規化(min-max スケーリング) です。利得型(大きいほど良い)と費用型(小さいほど良い)で式が変わります。
車選びの例(A・B・C)を、コスト(費用型)・性能・快適性(利得型)で評価し、重み 0.5 / 0.3 / 0.2 で統合します。
import numpy as np
names = ["A", "B", "C"]
raw = {"A": {"コスト": 300, "性能": 90, "快適性": 70},
"B": {"コスト": 150, "性能": 70, "快適性": 60},
"C": {"コスト": 250, "性能": 80, "快適性": 85}}
def normalize(values, benefit=True):
v = np.array(values, float)
if benefit: # 大きいほど良い
return (v - v.min()) / (v.max() - v.min())
else: # 小さいほど良い(コスト)
return (v.max() - v) / (v.max() - v.min())
norm = {
"コスト": normalize([raw[a]["コスト"] for a in names], benefit=False),
"性能": normalize([raw[a]["性能"] for a in names], benefit=True),
"快適性": normalize([raw[a]["快適性"] for a in names], benefit=True),
}
weights = np.array([0.5, 0.3, 0.2]) # コスト・性能・快適性
scores = []
for k, a in enumerate(names):
u = np.array([norm["コスト"][k], norm["性能"][k], norm["快適性"][k]])
s = np.dot(weights, u)
scores.append(s)
print(f"{a}: 部分効用={np.round(u,3)} 総合スコア={s:.3f}")
print("MAUT 最良案 ->", names[int(np.argmax(scores))])
出力:
A: 部分効用=[0. 1. 0.4 ] 総合スコア=0.380
B: 部分効用=[1. 0. 0. ] 総合スコア=0.500
C: 部分効用=[0.333 0.5 1. ] 総合スコア=0.517
MAUT 最良案 -> C
出力の意味:Bは最安なのでコストの部分効用が1(満点)ですが、性能・快適性が最低(0)で総合0.500。Cはどれも中庸〜高めでバランスが良く、総合0.517でわずかに勝ちます。Aは性能満点でもコストが最悪(0)で0.380。**「尖った最安B」より「バランスのCがわずかに上」**という、加重和ならではの折衷的な結論。ただしこの差0.017は僅差で、重みが少し変わればひっくり返ります(重み付けと感度分析で確認)。
3. 加法形が成り立つ条件:相互選好独立性
「各属性の効用を足す」加法形は、いつでも使えるわけではありません。正当化には相互選好独立性(mutual preferential independence) が必要です。ざっくり言うと、ある属性の好み(トレードオフ)が、他の属性の水準に依存しないこと。
- 成り立つ例:コストと性能のトレードオフが、快適性のレベルによらず一定。
- 破れる例:「辛さ」と「甘さ」——辛い料理での甘さの好みと、甘いデザートでの甘さの好みは別物(相互作用がある)。
独立性が破れると、属性間の相乗・相殺効果を捉える乗法形や、より一般の効用関数が要ります。実務では加法形を第一近似として使い、独立性が怪しい属性は束ねる(1つの複合属性にする)などで対処します。重みと部分効用を分けて書ける加法形の透明さは、合意形成では大きな利点です。
数式の直観的意味:重みは「交換比率」
重み は単なる重要度の数字ではなく、属性間の交換比率(トレードオフ率) を表します。正規化された効用空間で、属性 の効用を1単位下げる代わりに属性 の効用を 単位上げれば、総合効用は不変——これが加重和の等価線(無差別曲線)の傾きです。だから「コストの重み0.5」は「コストの満足を1減らすのを、性能の満足 で埋め合わせる」という意味を持ちます。重みを決めるとは、何と何をどの比率で交換してよいかを宣言すること。この解釈を持つと、次の階層分析法(AHP)が「一対比較でこの交換比率を引き出す手続き」だと見えてきます。
⚠️ よくある誤解
- 「素点をそのまま足す」は誤り:単位が違う属性を正規化せずに足すと、値域の大きい属性(コストの円単位など)が支配します。必ず0〜1などに揃えます。
- 「重みは重要度の主観で適当に」ではない:重みは交換比率なので、属性のスケール(正規化の仕方)と一体で意味を持ちます。正規化を変えたら重みも見直す必要があります。
- 「加法形はいつでもOK」ではない:相互選好独立性が前提です。属性に相互作用があるなら加法形は誤った順序を与えます。
- 「線形の部分効用しかない」ではない: は非線形(リスク回避を反映した凹関数など)でも構いません。重要なのは0〜1への単調変換であることです。
対応シミュレーション
本文のコードで重みベクトルを変えると最良案が入れ替わります。次の重み付けと感度分析では、これを系統的に動かして結論の頑健性を測ります。
関連ノート
- 第4章 多基準意思決定 目次
- 多目的問題とパレート最適 — 前提:重みでフロンティア上の1点を選ぶ
- 期待効用と効用関数 — 効用の考え方を多属性に拡張
- 階層分析法(AHP) — 次のトピック:重みを一対比較から導く
- 重み付けと感度分析 — 重みの不確かさへの頑健性
- 意思決定分析・リスク分析 全体目次