読者です 読者をやめる 読者になる 読者になる

面白ければいいんじゃない?

やくたいのないこと、痛々しいことばかり書きます。

民主主義と独裁をモデル化して計算してみた。

社会 情報

はじめに

そんなわけで、id:kawango氏が民主主義と独裁の意思決定について議論しているわけです。意思決定の速度とか、そういうアレで。
民主主義は本当は独裁よりもましなのか? - 続・はてなポイント3万を使い切るまで死なない日記


ただ、民主主義と一言で言ってもいろいろな側面があって、もちろん意思決定の速度というのも重要な課題なんですが、やはり民主主義と独裁を分ける最大の要素というのは政権交代の容易さであると思われるわけです。そういうわけで、民主主義についての一つの見方として「制度化された革命」というのがあります。要するに武力で革命やって為政者を追い出すのではなく、定期的な選挙によって政権を選ぶというのが民主主義だよ、っていう考え方です。id:kawango氏の専門の経営でも経営と所有の分離という形で似たような感じで実装されているわけですが。

モデル化

そこで、民主主義の政権交代の容易性という観点から私はこういうモデルを立てました。

  • 為政者は有能、普通、無能に分けられる。
  • 為政者は決心をするが、有能は良い結果を生むことが多く、無能は悪い結果を生むことが多い。
  • 民主主義では何度か悪い結果を出した為政者は別の為政者に交代させられる。
  • 独裁ではちょっとやそっとじゃ地位は揺るがないが、あまり悪い結果が続くと革命を起こされる。

で、これをルール化してみます。パラメータは適当に決めました。

  • 有能、普通、悪い為政者が選出される可能性は1/3ずつ
  • 為政者の良い判断は住民の厚生を1増加させる、普通の判断は増減しない、悪い判断は1減少する
    • 有能な為政者は1/2の確率で良い判断をし、1/4の確率で普通の判断をし、1/4の確率で悪い判断をする
    • 普通の為政者は1/3の確率で良い判断をし、1/3の確率で普通の判断をし、1/3の確率で悪い判断をする
    • 悪い為政者は1/5の確率で良い判断をし、3/10の確率で普通の判断をし、1/2の確率で悪い判断をする
  • 悪い判断を連続して下すと革命(政権交代)が起きる
    • 民主主義では3回連続で悪い判断をすると政権交代する
    • 独裁では10回連続で悪い判断をすると革命する
  • この判断を10000回繰り返す

そしてこれを10回試行して、住民の厚生の最終値を出しました。結果は以下の通り。

試行回数 1 2 3 4 5 6 7 8 9 10 平均 標準偏差
民主 886 1152 1232 1190 1377 1164 1533 775 1163 1521 1199.3 242.8003524
独裁 2462 -2086 -2350 2493 2533 2435 -2090 2413 -7 76 587.9 2140.507025

結論

独裁が平均では悪い傾向があるが、成功したときは民主主義を大きく上回る結果を出している。
標準偏差で見ると独裁のばらつきがアホみたいに大きい。

おまけ

今回の計算に使ったソースコードは以下です。cで書いています。パラメータ変更したり新たな要素を追加して比較していくと面白いと思います。あ、このパラメータは上記の独裁仕様です。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main(){
	
	/*変数宣言初期化、乱数初期化など*/
	
	int adventdenom = 1000;/*指導者の出現確率の分母*/
	int decidedenom = 1000;/*判断確率の分母*/
	
	int goodleader = 666;/*これを超えれば良い指導者*/
	int medleader = 333;/*これを超えれば並の指導者*/
	
	int gl_gooddec = 500;/*良い指導者はこれを超えればよい判断*/
	int ml_gooddec = 666;/*並の指導者はこれを超えればよい判断*/
	int bl_gooddec = 800;/*悪い指導者はこれを超えればよい判断*/
	
	int gl_meddec = 250;/*良い指導者はこれを超えれば並の判断*/
	int ml_meddec = 333;/*並の指導者はこれを超えれば並の判断*/
	int bl_meddec = 500;/*悪い指導者はこれを超えれば並の判断*/
	
	int revidx = 10;/*この回数連続して悪い判断をすると革命*/
	int comp = 0;/*不満度:連続して悪い判断をした数*/
	
	int trials = 10000;/*試行回数*/
	int i = 0;/*ループ変数*/
	
	int leader = 0;/*今のリーダーが何か 1=良い、2=並み、3=悪い*/
	int revflag = 1;/*革命あったよフラグ あったら1 なければ0*/
	int score = 0;/*民衆の福利スコア 良い判断でインクリ 並みの判断で変化なし 悪い判断でデクリ*/
	
	int temprand = 0;/*乱数一時保存用*/
	srand((unsigned)time(NULL));
	
	/*プログラム本体*/
	
	/*初期指導者を設定*/
	temprand = ((double)rand()/((double)RAND_MAX+1))*adventdenom;
	
	if(temprand > goodleader) leader = 1;
	else if(temprand > medleader) leader = 2;
	else leader = 3;
	
	revflag = 1;/*初期値指導者を設定したのでフラグを立てる*/
	
	for(i=1;i<=trials;i++){
		
		/*指導者決心判定・スコア増減・不満度増減処理*/
		temprand = ((double)rand()/((double)RAND_MAX+1))*decidedenom;/*指導者決心判定用乱数生成*/
		
		
		if(leader == 1){
			if(temprand > gl_gooddec){
				score++;
				printf("%d\t%d\t%d\n",revflag,leader,score);
				comp = 0;
			}
			else if(temprand > gl_meddec){
				printf("%d\t%d\t%d\n",revflag,leader,score);
				comp = 0;
			}
			else{
				score--;
				printf("%d\t%d\t%d\n",revflag,leader,score);
				comp++;
			}
		}
		else if(leader == 2){
			if(temprand > ml_gooddec){
				score++;
				printf("%d\t%d\t%d\n",revflag,leader,score);
				comp = 0;
			}
			else if(temprand > ml_meddec){
				printf("%d\t%d\t%d\n",revflag,leader,score);
				comp = 0;
			}
			else{
				score--;
				printf("%d\t%d\t%d\n",revflag,leader,score);
				comp++;
			}
		}
		else if(leader == 3){
			if(temprand > bl_gooddec){
				score++;
				printf("%d\t%d\t%d\n",revflag,leader,score);
				comp = 0;
			}
			else if(temprand > bl_meddec){
				printf("%d\t%d\t%d\n",revflag,leader,score);
				comp = 0;
			}
			else{
				score--;
				printf("%d\t%d\t%d\n",revflag,leader,score);
				comp++;
			}
		}
		
		revflag = 0;
		
		/*革命発生処理*/
		if(comp >= revidx){
			
			revflag = 1;
			comp = 0;
			temprand = ((double)rand()/((double)RAND_MAX+1))*adventdenom;
			
			if(temprand > goodleader) leader = 1;
			else if(temprand > medleader) leader = 2;
			else leader = 3;
		}
	}
}

注意:ここに書かれていることは筆者の個人的見解であり所属する組織などの意志を表すものではありません。