社会を<モデル>でみる:数理社会学への招待
29章:なぜ差別しなくても外国人居住区ができるのか
○と♯の2つのグループが存在し、以下の条件で他の場所へ移動する。
○: 近隣に2人以下○の場合、
♯: 近隣の1/3以上が♯でない場合、
例1
#
# 1 epochで複数回移動するエージェントがいてもいいバージョン
# 次回は移動は1epoch内で最大1回とするものを作りましょう。
#
# function to check circles
ck.circle <- function(world,i_row,i_col,max.row,max.col) {
neighbor=world[max(i_row-1,1):min(i_row+1,max.row),
max(i_col-1,1):min(i_col+1,max.col)]
circles=length(which(neighbor==2))
act=ifelse(circles<3,"move","stay")
return(act)
}
# function to check sharps
ck.sharp <- function(world,i_row,i_col,max.row,max.col) {
neighbor=world[max(i_row-1,1):min(i_row+1,max.row),
max(i_col-1,1):min(i_col+1,max.col)]
all.neighb=length(which(neighbor!=0))-1
if (all.neighb==0){
return("move")
} else {
sharps=length(which(neighbor==1))-1
act=ifelse(sharps/all.neighb<(1/3),"move","stay")
return(act)
}
}
FUNmigration<-function(N.row=10, N.col=10, N.sharp=10, N.circle=10) {
# initialization
world=matrix(0,nrow=N.row,ncol=N.col)
temp.vec=c(rep(1,N.sharp),rep(2,N.circle))
world[sample(1:(N.row*N.col),N.sharp+N.circle,replace=F)]=temp.vec
moved=1;counter=0
# plotting initial config.
par(mfrow=c(1,2))
idx1<-which(world==2,arr.ind=T);idx2<-which(world==1,arr.ind=T)
plot(idx1[,1],idx1[,2],type="n",xlim=c(0.5,N.row+0.5),
ylim=c(0.5,N.col+0.5),main="Initial Arrangement",
xlab="location @ x", ylab="location @ y")
text(idx1[,1],idx1[,2],"o",cex=4,col="red");
text(idx2[,1],idx2[,2],"#",cex=4,col="blue")
# main loop, max.iter=1000
while (moved>0 & counter<1000) {
moved=0
counter=counter+1
for (i_row in 1:N.row) {
for (i_col in 1:N.col) {
if (world[i_row,i_col]==1) {
act=ck.sharp(world,i_row,i_col,N.row,N.col)
if (act=="move") {
dest=sample(which(world==0),1)
world[dest]=1
world[i_row,i_col]=0
moved=1
}
}
if (world[i_row,i_col]==2) {
act=ck.circle(world,i_row,i_col,N.row,N.col)
if (act == "move") {
dest=sample(which(world==0),1)
world[dest]=2
world[i_row,i_col]=0
moved=1
}
}}}}
# plotting result
idx1<-which(world==1,arr.ind=T)
idx2<-which(world==2,arr.ind=T)
plot(idx1[,1],idx1[,2],type="n",xlim=c(0.5,N.row+0.5),ylim=c(0.5,N.col+0.5),
main="Arragement After Migration",,xlab="location @ x", ylab="location @ y")
text(idx1[,1],idx1[,2],"#",cex=4,col="blue")
text(idx2[,1],idx2[,2],"o",cex=4,col="red")
return(world)
}
例2
#
# 移動は1epoch内で最大1回とするバージョン
#
FUNmigration2<-function(N.row=10, N.col=10, N.sharp=10, N.circle=10) {
# initialization
world=matrix(0,nrow=N.row,ncol=N.col)
temp.vec=c(rep(1,N.sharp),rep(2,N.circle))
world[sample(1:(N.row*N.col),N.sharp+N.circle,replace=F)]=temp.vec
moved=1;counter=0
# plotting initial config.
par(mfrow=c(1,2))
idx1<-which(world==2,arr.ind=T);idx2<-which(world==1,arr.ind=T)
plot(idx1[,1],idx1[,2],type="n",xlim=c(0.5,N.row+0.5),
ylim=c(0.5,N.col+0.5),main="Initial Arrangement",
xlab="location @ x", ylab="location @ y")
text(idx1[,1],idx1[,2],"o",cex=4,col="red");
text(idx2[,1],idx2[,2],"#",cex=4,col="blue")
ck.circle <- function(world,i_row,i_col,max.row,max.col) {
neighbor=world[max(i_row-1,1):min(i_row+1,max.row),
max(i_col-1,1):min(i_col+1,max.col)]
circles=length(which(neighbor<0))
act=ifelse(circles<3,"move","stay")
return(act)
}
ck.sharp <- function(world,i_row,i_col,max.row,max.col) {
neighbor=world[max(i_row-1,1):min(i_row+1,max.row),
max(i_col-1,1):min(i_col+1,max.col)]
all.neighb=length(which(neighbor!=0))-1
if (all.neighb==0){
return("move")
} else {
sharps=length(which(neighbor>0))-1
act=ifelse(sharps/all.neighb<(1/3),"move","stay")
return(act)
}
}
# ここから違う
moved=1;counter=0;N.row=10;N.col=10;
while (moved>0 & counter<1000) {
moved=0
counter=counter+1
for (i_sharp in 1:N.sharp) {
idx=which(world==i_sharp,arr.ind=T)
act=ck.sharp(world,idx[1],idx[2],N.row,N.col);
if (act=="move") {
dest=sample(which(world==0),1)
world[dest]=i_sharp
world[idx[1],idx[2]]=0
moved=1
}
}
for (i_circle in -1:-N.circle) {
idx=which(world==i_circle,arr.ind=T)
act=ck.circle(world,idx[1],idx[2],N.row,N.col);
if (act=="move") {
dest=sample(which(world==0),1)
world[dest]=i_circle
world[idx[1],idx[2]]=0
moved=1
}
}
}
# plotting result
idx1<-which(world==1,arr.ind=T)
idx2<-which(world==2,arr.ind=T)
plot(idx1[,1],idx1[,2],type="n",xlim=c(0.5,N.row+0.5),ylim=c(0.5,N.col+0.5),
main="Arragement After Migration",,xlab="location @ x", ylab="location @ y")
text(idx1[,1],idx1[,2],"#",cex=4,col="blue")
text(idx2[,1],idx2[,2],"o",cex=4,col="red")
return(world)
}