【问题标题】:Pairwise calculations of distances between two sets of points成对计算两组点之间的距离
【发布时间】:2017-08-03 19:14:58
【问题描述】:

我在 Python 中进行成对计算时遇到了一些麻烦。

我有两组节点(例如供应商和客户)。

  • 设置 1:SupplierCO = (Xco, Yco) 用于多个供应商
  • 第 2 组:多个客户的客户 CO = (Xco, Yco)

我想计算一个客户和所有供应商之间的距离,并保存最短的距离。这应该为所有客户循环。

我意识到我必须使用两个 for 循环和一个 if 函数。但我不明白如何在循环时从正确的点选择坐标。

感谢您的回复! 更多信息: - 正弦距离 - 第 1 组中的每个点都必须与第 2 组中的所有点进行比较 - 这就是我目前所做的

import urllib.parse
from openpyxl import load_workbook, Workbook
import requests
from math import radians, cos, sin, asin, sqrt

"""load datafile"""
workbook = load_workbook('Macro.xlsm')
Companysheet = workbook.get_sheet_by_name("Customersheet")
Networksheet = workbook.get_sheet_by_name("Suppliersheet")

"""search for column with latitude/longitude - customers"""
numberlatC = -1
i = 0
for col in Customersheet.iter_cols():
    if col[2].value == "Latitude" :
        numberlatC = i
    i+=1

numberlongC = -1
j = 0
for col in Customersheet.iter_cols():
    if col[2].value == "Longitude" :
        numberlongC = j
    j+=1


latC = [row[numberlatC].value for row in Companysheet.iter_rows() ]
longC = [row[numberlongC].value for row in Companysheet.iter_rows()]

# haversine formula 
    dlon = lonC - lonS 
    dlat = latC - latS 
    a = sin(dlat/2)**2 + cos(latC) * cos(latS) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    r = 6371 # Radius of earth in kilometers. Use 3956 for miles
    distance = c*r 
    distances.append([distance])
    return distances

customers = [latC, longC]

谢谢!

【问题讨论】:

  • 您对答案有何期待?我们需要您的数据来为您提供任何具体的代码。
  • 缺少相当多的信息。欧几里得、Haversine 或其他距离?请显示模板代码。看来您对这种方法的想法是合理的,那么它在哪里落空了?
  • 如果他有节点和顶点,他可能是 Djikstra。
  • @mishavacic 好的,我错过了“最短距离”部分。你可能是对的。
  • 如果我用谷歌搜索你的确切问题标题,你的问题就是第一个结果。 This is the second result

标签: python python-3.x loops pairwise


【解决方案1】:

这应该可以让您大致了解。在下面的示例中,我只是使用了常规坐标,但是,您应该能够将其转换为您的需要。

supplier = [(1,3),(2,4),(8,7),(15,14)]
customer = [(0,2),(8,8)]

def CoordinatesDistance(A, B):
    import math
    x1, x2 = A
    y1, y2 = B
    return math.sqrt(math.exp((x2-x1)+(y2-y1)))

def shortest_distance_pair(Cust, Sup):
    pairs = []
    for X in Cust:
        shortest_distance = 999999
        for Y in Sup:
            distance = CoordinatesDistance(X,Y)
            #customer_distance.append(distance)
            if distance < shortest_distance:
                shortest_distance = distance
                sdp = (X,Y)
        pairs.append(sdp)
    return pairs

打印(最短距离对(客户,供应商))

print(shortest_distance_pair(customer,supplier))
[((0, 2), (8, 7)), ((8, 8), (8, 7))]

现在,如果您创建两个列表,1. 客户坐标,2. 供应商坐标;您应该能够利用上述内容。

【讨论】:

  • 非常感谢菲利普!另一个问题:如何获取 [(X,Y), (X,Y)] 格式的数据?我可以读取列表中的所有 Xco 和所有 Yco,但是如何合并它们?太棒了!
  • 这是一个不同的问题,您应该接受答案。但是,在您的情况下,您有customers = [latC, longC]。要将坐标添加到列表中的一对,只需添加 括号 customers = [(latC, longC)]。向列表中添加更多坐标:customers.append((latC,longC))
  • 再次感谢!目前我有一个'ValueError:解包的值太多(预期2)'在这个pastebin我的代码..我看不出这可能是什么原因造成的。 pastebin.com/itQTdrCe 谢谢!
  • 请将其添加为新问题。然后其他人也将能够找到答案:)
猜你喜欢
  • 2010-10-30
  • 2011-04-23
  • 2014-11-14
  • 1970-01-01
  • 2017-08-27
  • 2015-08-16
相关资源
最近更新 更多