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")