金を追って人数を増やす

MikuHatsune2011-04-29

4/25のセミナーの続き。
ここのスクリプトを流用してみる。
 
今回は二者間だけでなく、三者以上での資産の取引を加えた。
N人をteam人で構成される小グループに分ける。
team人の中で、損する人がまず決まる(資産の移動方向の決定)。
そのうえで、どれだけ資産が移動するかランダムに決定する(移動量の決定)。
1回の取引で、資産を得ることも与えることもなんやかんやあるだろうが、取引開始と終了時の差分だけを考えると、セミナーのモデルになる、と思う。
ということで、modelは、1がフリーマーケット、2が詐欺師、3が離婚、とする。
N人をteam人で構成されるいくつかの集団に分けたら、team人揃わない集団が多くて1つ出ることがある。このとき、この人たちは取引を行わないことにする。

trademodel<- function(N,M,team,cycles,model){
  library(MCMCpack)
  money<- rep(M,N)
  group<- N%/%team
  Mmove<- matrix(0,cycles+1,N)
  Mmove[1,]<- money
    for(cy in 1:cycles){
      tradepairs<- sample(N)
      tradegroup<- array(tradepairs,c(1,team,group))
        for(tg in 1:group){
          loser <- sample(1:team,size=sample(1:(team-1),size=1))
          winner<- (1:team)[-loser]
            if(model==1)               # flea market
              losemoney<- runif(length(loser))*min(money[tradegroup[,,tg]])
              money[tradegroup[,loser,tg]]<- money[tradegroup[,loser,tg]]-losemoney
              money[tradegroup[,winner,tg]]<- money[tradegroup[,winner,tg]]+rdirichlet(1,rep(1,length(winner)))*sum(losemoney) 
            }else if(model==2){        # theif
              losemoney<- runif(length(loser))*money[tradegroup[,loser,tg]]
              money[tradegroup[,loser,tg]]<- money[tradegroup[,loser,tg]]-losemoney
              money[tradegroup[,winner,tg]]<-               money[tradegroup[,winner,tg]]+rdirichlet(1,rep(1,length(winner)))*sum(losemoney)
            }else{                     # divorce
              losemoney<- runif(length(loser))*money[tradegroup[,loser,tg]]
              money[tradegroup[,loser,tg]]<- money[tradegroup[,loser,tg]]-losemoney
                if(length(winner)>1){
                  money[tradegroup[,winner,tg]]<-               money[tradegroup[,winner,tg]]+rdirichlet(1,rep(1,length(winner)))*sum(losemoney)
                }else{
                  money[tradegroup[,winner,tg]]<- money[tradegroup[,winner,tg]]+sum(losemoney)
                }
            }
    }
    Mmove[cy+1,]<- money
  }
  return(Mmove)
}
# 取引するグループを2〜10人にしてみる。
ylim<- c(0,N*M)
N<- 100
M<- 100
team<- 1
model<- 1
cycles<- 1000*5
Res<- lapply(mapply(rep,0,1:9),unique)
for(i in 1:9){
Res[[i]]<- trademodel(N,M,i+1,cycles,1)
}
# 個人が持つ資産の時間変化をプロット。
par(mfrow=c(3,3))
for(pl in 1:9){
  matplot(Res[[pl]],type="l",pch=1,col=rainbow(N),ylim=ylim,frame=FALSE,
          xlab="trade cycle",ylab="property",
          main=paste("money trade" ,pl+1,"people"))
}
# 資産の分布をプロット。
par(mfrow=c(3,3))
for(pl in 1:9){
  hist(Res[[pl]][cycles+1,],breaks=N,col=5,ylim=c(0,100),
       xlab="money",ylab="frequency",
       main=paste("money trade" ,pl+1,"people"))
}

二者間取引だと、最終的にある一人に総資産が吸い上げられるが、三者以上にすると資産独占にはならないが、資産を多くもつ数人が生まれる。
寡占だと思う。
詐欺師や離婚モデルと違って、資産順位の変化は乏しい(プロットのほとんどが平行線)。
寡占の人たちが同じ取引の場に登場する機会はランダムなので、寡占がさらに進めば資産の移動がさらに稀になる。
取引の回数を増やせば、独占に近付きそう。