如何在R中的无环有向图上循环以找到应该移除哪个顶点以使距离最大化?

如何在R中的无环有向图上循环以找到应该移除哪个顶点以使距离最大化?,r,graph-algorithm,mathematical-optimization,R,Graph Algorithm,Mathematical Optimization,因为我认为我的主要障碍是编码这个问题,所以我把它放在这里,而不是放在MSE上。如果那不正确,我就把它移过去 我有一个矩阵,m,我构造它来表示一个无环有向图,其中矩阵项是节点之间的距离。例如[为了确认我构造的正确性],顶点1分别指向距离为3、4和4的顶点2、3、4。顶点12与顶点13、16、19的距离分别为6、2、6 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 [1,] 0 3 4

因为我认为我的主要障碍是编码这个问题,所以我把它放在这里,而不是放在MSE上。如果那不正确,我就把它移过去

我有一个矩阵,
m
,我构造它来表示一个无环有向图,其中矩阵项是节点之间的距离。例如[为了确认我构造的正确性],顶点1分别指向距离为3、4和4的顶点2、3、4。顶点12与顶点13、16、19的距离分别为6、2、6

      V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20
 [1,]  0  3  4  4  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0
 [2,]  0  0  0  0  3  5  0  0  0   0   0   0   0   0   0   0   0   0   0   0
 [3,]  0  0  0  0  0  2  2  0  0   0   0   0   0   0   0   0   0   0   0   0
 [4,]  0  0  0  0  0  0  0  5  0   0   0   0   0   0   0   0   0   0   0   0
 [5,]  0  0  0  0  0  0  0  0  0   0   0   0   0   8   0   0   0   0   0   0
 [6,]  0  0  0  0  0  0  0  0  3   0   0   0   0   0   0   0   0   0   0   0
 [7,]  0  0  0  0  0  0  0  0  6   4   0   0   0   0   0   0   0   0   0   0
 [8,]  0  0  0  0  0  0  0  0  0   3   0   5   0   0   0   0   0   0   0   0
 [9,]  0  0  0  0  0  0  0  0  0   0   3   0   3   0   0   0   0   0   0   0
[10,]  0  0  0  0  0  0  0  0  0   0   0   0   3   0   0   0   0   0   0   0
[11,]  0  0  0  0  0  0  0  0  0   0   0   0   0   1   3   0   0   0   0   0
[12,]  0  0  0  0  0  0  0  0  0   0   0   0   6   0   0   2   0   0   6   0
[13,]  0  0  0  0  0  0  0  0  0   0   0   0   0   0   1   0   0   0   0   0
[14,]  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   5   0   0   0
[15,]  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   4   1   0   0
[16,]  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   3   2   0
[17,]  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   2
[18,]  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   3
[19,]  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   4
[20,]  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0   0   0   0   0
我已经使用一种向后递归方法(我不确定它是否有一个合适的名称)遍历并手动计算了一条最小距离路径,它从顶点20开始,然后迭代返回顶点1,其中每次迭代:

f(i)=min{s(i,j)+f(j)} 其中i和j是顶点,s(i,j)是从顶点i到j的边长度,f(j)是从顶点j到终端顶点的最小距离

f(20) = 0
f(19) = 4 + f(20) = 4
f(18) = 3 + f(20) = 3
f(17) = 2 + f(20) = 2
f(16) = min { 3 + f(18) | 2 + f(19) = 6
f(15) = min { 4 + f(17) | 1 + f(18)  = 4
f(14) = 5 + f(17) = 7
f(13) = 1 + f(15) = 5
f(12) = min { 6 + f(13) | 2 + f(16) | 6 + f(19) = 8
f(11) = min { 1 + f(14) | 3 + f(15) = 7 
f(10) = min \{ 3 + f(13) = 8
f(9) = min { 3 + f(11) | 3 + f(13) = 8
f(8) = min { 3 + f(10) | 5 + f(12) = 11
f(7) = min { 6 + f(9) | 4 + f(10) = 12
f(6) = 3 + f(9) = 11
f(5) = 8 + f(14) = 15
f(4) = 5 + f(8) = 16
f(3) = min { 2 + f(6) | 2 + f(7) = 13
f(2) = min { 3 + f(5) | 5 f(6) = 16
f(1) = min { 3 + f(2) | 4 + f(3) | 4 + f(4) = 17
它将最小路径标识为1-3-6-9-13-15-18-20。现在,我正试图找到要删除的单条边,它将最大化从顶点1到顶点20的距离,而不使用
R
包(如果有),这样我就可以看到发生了什么。我真的不确定如何开始这项工作,我知道这几乎是徒劳的,但我还是从以下几点开始:

for (i in nrow(t)-1:2) {
  for (j in ncol(t):1) {
    if k != 0 { s[j] <- k }

  }
}
for(i in nrow(t)-1:2){
对于ncol(t)中的(j):1{

如果k!=0{s[j],这听起来像是一个依靠优化技术来解决的攻击者/防御者模型。一种简单(但效率极低)的方法是迭代每个分支(使用),删除一个,然后重新计算。冲洗、起泡、重复,认识到这可能需要很长时间。这是编写优化引擎的一个原因,通常使用特定的代数建模语言和专有库,以更快地解决其他因素。R不适用于这类工作。基本R甚至更少那么。您是否尝试过至少在图形数据结构中使用igraph软件包?大多数标准图形算法都可用,您应该能够在此基础上进行构建,而不是手工制作。除了绘图之外,我没有尝试过igraph。即使我无法完整地编写整个新问题的代码(找出要最大化的节点),我在手工编写上面的代码时遇到了问题。