最短的网格连接线长度

时间:2015-05-01 18:52:58

标签: r geospatial shortest-path

我正在建造一个微电网,所以我必须将12个左右的房屋连接到中央太阳能电源。接线是一个主要的成本,所以我试图想出一个最小化线长的配置。它类似但不完全像旅行商问题,因为多条线可以来自同一个源 - 如果它是单线/路径,它就像TSP一样。

所以我的问题是:

有没有人知道一种算法来确定连接所有点的最短路径,哪里有一个中心点可以连接不确定数量的周围点?最终解决方案应该类似于一个图表,其中 n-1 节点最多有两条边连接它们,一条最多可能有 n-1 边缘?具体来说,有没有办法在R中做到这一点?

编辑显示代码/效果

我假设单一路径以相对简单的方式解决了它。假设每个房子都直接连接到电源,我就解决了它。这是代码:

############ interested users Wire CalculationBommekalla Analysis
require(png)
require(grid)
require(arm)
require(DCluster)
require(ggplot2)

setwd("C:/Users/Lucas/Documents/India2014_2015/ADATS Docs/BoomekallaAnalysis")

data= read.csv("BommekallInterestedUsers.csv")
summary(data)
names(data)

data$ind = c(1:nrow(data))

##### Analysis

# Shortest Path

distFrame = data[,c("Lon.Deg", "Lat.Deg")]
dists= as.matrix(dist(distFrame, upper=TRUE))
diag(dists)=1000


current= which(data.WO$ind==11)  # sushilemma
ord = rep(current,length=nrow(data.WO))
dists[,current]=1000

for (j in c(1:(nrow(data.WO)-1))){
    current= which(dists[current,]==min(dists[current,]))
    dists[,current]=1000
    ord[j+1] = current
}

# line calculation
firstHouses= data.WO[ord,]
secondHouses= data.WO[c(ord[-1],NA),]

lines = data.frame(lonA = firstHouses$Lon.Deg, 
    latA= firstHouses$Lat.Deg, 
    lonB = secondHouses$Lon.Deg,
    latB = secondHouses$Lat.Deg)
lines= na.omit(lines)

# Spider web -- completely connected to source

ccLines = data.frame(latA = data$Lat.Deg[
    data$Name=="Sushilemma"], latB = data$Lat.Deg,
    lonA = data$Lon.Deg[data$Name=="Sushilemma"],
    lonB = data$Lon.Deg) 

# Haversine Distance -- atanh_trans() is arctan

linesRads=lines*pi/180

a= with(linesRads, sin((latB-latA)/2)^2+
    cos(latB)*cos(latA)*sin((lonB-lonA)/2)^2)
c= 2*asin(pmin(1,sqrt(a)))
lines$distance=6371*c*1000

totalDistance = sum(lines$distance)

totalCost = totalDistance*15

Map of the village

completely connected wiring

single path wiring with a single spatial outlier left out

0 个答案:

没有答案