R 如何规划天井灯的最有效路线

R 如何规划天井灯的最有效路线,r,algorithm,igraph,R,Algorithm,Igraph,我想把院子里的灯串起来。根据我的要求,我意识到我需要一个算法来解决一个问题,以找出灯光应该采取的最有效的路线,从而使灯光覆盖的重复边最少。经过一番搜索,我意识到也许像这样的东西是我最好的选择 但是,我在创建图表时遇到了问题 以下是它需要的外观: 粉红色的圆圈代表我可以悬挂灯光的地方 “启动”是唯一可用的电源插座 黄点表示灯光应覆盖的所有位置 下面是我的图表在引用这篇文章后的样子: 如您所见,所有节点都位于正确的位置,但边在不应连接的位置连接。这是我的密码: library(igraph)

我想把院子里的灯串起来。根据我的要求,我意识到我需要一个算法来解决一个问题,以找出灯光应该采取的最有效的路线,从而使灯光覆盖的重复边最少。经过一番搜索,我意识到也许像这样的东西是我最好的选择

但是,我在创建图表时遇到了问题

以下是它需要的外观:

  • 粉红色的圆圈代表我可以悬挂灯光的地方
  • “启动”是唯一可用的电源插座
  • 黄点表示灯光应覆盖的所有位置
下面是我的图表在引用这篇文章后的样子:

如您所见,所有节点都位于正确的位置,但边在不应连接的位置连接。这是我的密码:

library(igraph)
gg<-graph.ring(20)
ll=matrix(
  c( 0,0,    75.25,0,    150.5,0,    225.8125,0,    302.8125,0, 
     0,-87,                                          302.8125,-87,
     0,-173.8125,                                    302.8125,-173.8125,
     0,-260.9375,                                    302.8125,-260.9375,
     16,-384.3125,                                   302.8125,-384.3125,
     16,-435.9575,                                   302.8125,-435.9375,
     16,-525.1875, 75.25,-525.1875, 150.5,-525.1875, 225.8125,-525.1875, 302.8175,-525.1875),
  ncol=2,byrow=TRUE)
plot(gg,layout=ll)
库(igraph)

gg我认为您可以使用edgelist中的graph_精确指定要连接的节点。只需指定以何种顺序连接哪些节点即可。顺便说一句,问题很好

  gg <- graph_from_edgelist(cbind(c(1:4, 6, 8, 10, 12, 14, 16:19, 1, 6, 8, 21, 12, 14, 5, 7, 9, 11, 13, 15), 
                                  c(2:5, 7, 9, 11, 13, 15, 17:20, 6, 8, 10, 12, 14, 16, 7, 9, 11, 13, 15, 20)))
  ll=matrix(
    c( 0,0,    75.25,0,    150.5,0,    225.8125,0,    302.8125,0, 
       0,-87,                                          302.8125,-87,
       0,-173.8125,                                    302.8125,-173.8125,
       0,-260.9375,                                    302.8125,-260.9375,
       16,-384.3125,                                   302.8125,-384.3125,
       16,-435.9575,                                   302.8125,-435.9375,
       16,-525.1875, 75.25,-525.1875, 150.5,-525.1875, 225.8125,-525.1875, 302.8175,-525.1875, 16, -260.9375),
    ncol=2,byrow=TRUE)
  plot(gg,layout=ll, edge.arrow.size = 0, vertex.size = c(rep(18, 20), 0),
       edge.color="orange")

是的,就是这样!谢谢但是,我如何将其制作成一个图形对象,可以用于此:
eulerian.g1有趣的是,我没有意识到这一点。所以,你想让欧拉循环成为一个非欧拉循环。我会调查的。自定义f(x)在我手中的盒子外不起作用。。但我明天早上会调查的!:-)是的,我不知道为什么它不能开箱即用,但是如果你勾选这个问题:,接受的答案会给出一个你可以使用的
make.euler
替换。我基本上复制/粘贴了它,然后做了这样一件事:
eulerian
# load custom f(x) as in
# https://stackoverflow.com/questions/40576910/solving-chinese-postman-algorithm-with-eulerization/40596816#40596816

eulerian <- make.eulerian(gg)
eulerian$info
g <- eulerian$graph

# set the layout as before to keep the circuit formatted according to your specs
par(mfrow=c(1,2))
plot(gg,layout=ll, edge.arrow.size = 0, vertex.size = c(rep(18, 20), 0),
     edge.color="orange", main = "Proposed")
plot(g,layout=ll, edge.arrow.size = 0, vertex.size = c(rep(18, 20), 0),
     edge.color="orange", main = "Eulerized")