トロピカル演算と行列のトロピカル積とトロピカル行列式とグラフの最短距離計算
- トロピカル演算,がある
- 行列の積にも同じように定義する
- 今、グラフの距離行列 A を作る。ただし、対角成分は0とし、エッジのない頂点ペアに対応するセルは無限大とする
- このとき、頂点数nに対して、 (行列Aのトロピカル積のn-1回繰り返し)は、頂点ペア間の最短距離になると言う
- Rで確かめる
my.tropical.sum <- function(x,y=NULL){
min(c(x,y))
}
my.tropical.prod <- function(x,y){
x+y
}
my.tropical.matrix.prod <- function(X,Y){
ret <- matrix(0,length(X[,1]),length(Y[1,]))
for(i in 1:length(X[,1])){
for(j in 1:length(Y[1,])){
tmp <- c()
for(k in 1:length(X[1,])){
tmp <- c(tmp,my.tropical.prod(X[i,k],Y[k,j]))
}
ret[i,j] <- my.tropical.sum(tmp)
}
}
return(ret)
}
x <- 3
y <- 5
my.tropical.sum(x,y)
my.tropical.sum(c(x,y))
my.tropical.prod(x,y)
my.tropical.sum(Inf,3)
my.tropical.prod(Inf,3)
X <- matrix(1:6,2,3)
Y <- matrix(2:7,3,2)
X
Y
my.tropical.matrix.prod(X,Y)
library(igraph)
el <- rbind(c(1,2),c(2,3),c(3,1),c(1,4),c(5,4))
w <- 1:5
g <- graph.edgelist(el)
plot(g)
D.graph <- distances(g,mode="out",weights=w)
A <- matrix(Inf,5,5)
for(i in 1:length(w)){
A[el[i,1],el[i,2]] <- w[i]
}
diag(A) <- 0
A
my.tropical.shortest.dist <- function(A){
n <- length(A[,1])
ret <- A
for(i in 1:(n-2)){
ret <- my.tropical.matrix.prod(A,ret)
}
return(ret)
}
D.graph.tropical <- my.tropical.shortest.dist(A)
D.graph
D.graph.tropical
all.equal(D.graph, D.graph.tropical)
> D.graph
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 3 4 Inf
[2,] 5 0 2 9 Inf
[3,] 3 4 0 7 Inf
[4,] Inf Inf Inf 0 Inf
[5,] Inf Inf Inf 5 0
> D.graph.tropical
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 3 4 Inf
[2,] 5 0 2 9 Inf
[3,] 3 4 0 7 Inf
[4,] Inf Inf Inf 0 Inf
[5,] Inf Inf Inf 5 0
- トロピカル行列式はで与えられる
- 順列の総当たりである値を出し、その最小値を取るので、その最小値がただ一つの順列から得られるか、複数の順列が最小値を返すか、いずれの場合もある。この「重複」に意味があるので、それについても返す関数を作っておく
- ちなみにTropical volumeというものがあって、それは、トロピカル行列式の値が2個(以上)の順列によって与えられるときは0になり、そうでない時には、順列で入れ替えて得られる、最小値と第二最小値の差になる。そのことをと表す