- 昨日の記事で連結した複体を作ることとその隣接行列を作ることをやった
- 複体は、単体が連結・オーバーラップしたものだった
- 今日は、立方格子が同様に連結・オーバーラップしたものとしての「立方格子の入れ子構造(複体的)」というのを考えてみる
library(igraph)
N <- 15
Bs <- list()
Cs <- list()
max.n <- 3
k <- 10
for(i in 1:k){
if(i ==1){
Bs[[i]] <- sample(1:N,sample(1:max.n,1))
Cs[[i]] <- sample(0:1,N,replace=TRUE)
Cs[[i]][Bs[[i]]] <- -1
}else{
tmp.n <- sample(1:max.n,1)
tmp.cube <- sample(1:(i-1),1)
a <- sample(Bs[[tmp.cube]],sample(1:min(tmp.n,length(Bs[[tmp.cube]])),1))
print(a)
print(tmp.n)
b <- sample((1:N)[-a],tmp.n-length(a))
Bs[[i]] <- sort(c(a,b))
Cs[[i]] <- sample(0:1,N,replace=TRUE)
tobesame <- which(Cs[[tmp.cube]] != -1)
Cs[[i]][tobesame] <- Cs[[tmp.cube]][tobesame]
Cs[[i]][Bs[[i]]] <- -1
}
}
Bs
Cs
MM <- NULL
for(i in 1:length(Bs)){
tmp <- expand.grid(rep(list(0:1),length(Bs[[i]])))
flats <- which(Cs[[i]] != -1)
tmp2 <- matrix(rep(Cs[[i]][flats],length(tmp[,1])),byrow=TRUE,nrow=length(tmp[,1]))
tmp3 <- matrix(0,length(tmp[,1]),N)
for(j in 1:length(flats)){
tmp3[,flats[j]] <- tmp2[,j]
}
non.flats <- which(Cs[[i]] == -1)
for(j in 1:length(non.flats)){
tmp3[,non.flats[j]] <- tmp[,j]
}
MM <- rbind(MM,tmp3)
}
MM.check <- MM %*% 2^(1:length(MM[1,]))
dups <- duplicated(MM.check)
MM.unique <- MM[!dups,]
D <- matrix(0,length(MM.unique[,1]),length(MM.unique[,1]))
for(i in 1:(length(MM.unique[,1])-1)){
for(j in (i+1):length(MM.unique[,1])){
if(sum(abs(MM.unique[i,] - MM.unique[j,])) == 1){
D[i,j] <- D[j,i] <- 1
}
}
}
g <- graph.adjacency(D,mode="undirected")
plot(g)
sh.p <- shortest.paths(g)
sorted.path <- t(apply(sh.p,1,sort))
plot(sorted.path[,length(D[1,])])