決定事項に投票で決める場合、一人一票で、無効票を投じることはできず、過半数の賛成があれば可決され、反対があれば否決されます。投票者は多くの派閥からなり、各派閥は非常に団結しています。同じ派閥の人々は全員が賛成票を投じるか、全員が反対票を投じます。しかし、派閥には人数に差があり、人数が多い派閥は決定に大きな影響力を持ち、人数が少ない派閥は力が弱いと言えます。そこで、次の問題が生じます:最終的な決定に影響を与えるのはどの派閥であり、その影響力はどれくらいあるのでしょうか?
派閥 X の影響力とは、全ての派閥が立場を決めた後、派閥 X が立場を変えると、決定結果が逆転する可能性があることを指します。逆に言えば、他の全ての派閥が投票を終えた後、派閥 X が全員が賛成票を投じれば、決定が通過し、全員が反対票を投じれば、決定が通過しなくなります。
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派閥は全く影響力を持っていません:
| 投票数 | 影響力 | 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;
-
}