如何在R中的无环有向图上循环以找到应该移除哪个顶点以使距离最大化?
因为我认为我的主要障碍是编码这个问题,所以我把它放在这里,而不是放在MSE上。如果那不正确,我就把它移过去 我有一个矩阵,如何在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
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。即使我无法完整地编写整个新问题的代码(找出要最大化的节点),我在手工编写上面的代码时遇到了问题。