有一項決策要投票表決,一人一票,不得投廢票,過半數贊成則通過,反之則否決。投票者有許多派系組成,各個派系都相當團結,同樣派系的人,要嘛全部都是投贊成票,要嘛全部都是投反對票。然而有些派系人多,有些派系人少,人多的派系能左右大局,人少的派系卻勢單力薄。於是產生一個問題:有能力對最終決策造成影響的是哪些派系?影響能力又是多少?
一個派系有能力對決策造成影響,是指所有派系都設定立場之後,此派系一旦改變立場,會馬上顛倒決策結果。換個角度來說,是指此派系之外的所有派系都投完票之後,此派系若全數投贊成票,則會使決策順利通過,反之若全數投反對票,則會使決策無法通過。
Banzhaf Power Index の計算方式は次のようになります:一つの派系 X の Banzhaf Power Index = 派系 X 影響決策の場合の数 ÷ (派系 1 影響決策の場合の数 + ... + 派系 N 影響決策の場合の数) 。全ての派系の Banzhaf Power Index の合計は 1 になります。
Banzhaf Power Index を通じて、各派系の力や投票表決の公平性を確認することができます。
1.
A派系9票、B派系9票、C派系7票、D派系3票、E派系1票、F派系1票。
総投票数は30票。過半数の票数は16票。
2.
A派系を例にとると、A派系が影響する決策の場合は合計16種類あります:
AB AC ABC ABD ABE ABF ACD ACE ACF
ABDE ABDF ABEF ACDE ACDF ACEF ADEF
派系が出現する場合は賛成票を投じたことを示し、派系が出現しない場合は反対票を投じたことを示します。
Aを除くと決策結果が逆転します。
3.
D派系、E派系、F派系は全く結果に介入することができず、影響力がありません:
| votes | power | BPI
\--+-------+-------+-------
A | 9 | 16 | 16/48
B | 9 | 16 | 16/48
C | 7 | 16 | 16/48
D | 3 | 0 | 0
E | 1 | 0 | 0
F | 1 | 0 | 0
\--+-------+-------+--------
| 30 | 48 | 1.0
-
int w [6]; // 各種派系の人数
-
int c [(16-1) + 1]; // 0 票から 15 票までの未過半数の場合の数を計算する
-
int power [6]; // 各派系が決策結果に影響する場合の数
-
int sum = 0; // power [] の合計
-
void Banzhaf_power_index()
-
{
-
for (int k=0; k<N; ++k)
-
{
-
// 一時的に派系 k を除外し、残りの派系の投票の場合の数を計算する。
-
memset(c, 0, sizeof(c));
-
c[0] = 1;
-
for (int i=0; i<N; ++i)
-
if (i != k)
-
for (int j=16-1; j>=w[i]; --j)
-
c[j] += c[j-w[i]];
-
// 過半数の票数に近づく場合の数を累計する
-
power[k] = 0;
-
for (int j=max(16-w[k], 0); j<16; ++j)
-
power[k] += c[j];
-
sum += power[k];
-
}
-
for (int i=0; i<N; ++i)
-
cout << i << "派系の BPI は" << float (power [i]) / sum;
-
}