現在、衆院選の選挙方式は「小選挙区比例代表並立制」と呼ばれる方式でおこなわれております。この中で比例代表選挙での当選者の決定方法は「ドント方式」と呼ばれるアルゴリズムで算出されます。ドント方式をAWKで実装してみました。
{
seats = $1;
parties = NF - 1;
print "#votes for each party:"
for(i = 2; i <= NF; i++){
print "party ",i-1,":" ,$i
a[i-1] = $i
b[i-1] = $i
}
}
END{
for(i = 1; i <= parties; i++){
q[i] = 2;
win[i] = 0;
}
for(j = 1; j <= seats; j++){
indx = max_index(b)
win[indx]++;
b[indx] = a[indx]/q[indx]
q[indx]++;
}
print("--------------")
print("party: #winner")
for(i = 1; i <= parties; i++){
print(i,": ", win[i])
}
}
function max_index(a) {
for(i in a){
v_max = a[i];
v_index = i;
break
}
for(i in a){
if(a[i] > v_max){
v_max = a[i];
v_index = i;
}
}
return v_index;
}
以下のように、標準入力から当選者数、政党1の得票数、政党2の得票数、…と入力値を与えて使用します。
$ echo 7 400 60 150 330 160 | gawk -f dhondt.awk
#votes for each party:
party 1 : 400
party 2 : 60
party 3 : 150
party 4 : 330
party 5 : 160
--------------
party: #winner
1 : 3
2 : 0
3 : 1
4 : 2
5 : 1
最大値の計算はhttp://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_064
を参考にしました。