2017-08-03 84 views
-2

我在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] 

謝謝!

+0

你對答案有什麼期待?我們需要你的數據給你任何具體的代碼。 –

+0

有很多信息缺失。歐幾里得,Haversine或其他距離?請顯示模板代碼。看來你對這種方法的理解是合理的,因此它在哪裏掉下來? – roganjosh

+0

如果他有節點和頂點,可能是Djikstra。 – MishaVacic

回答

0

這應該給你一個總的想法。在下面的例子中,我只使用了常規座標,但是,您應該可以將其轉換爲您的需要。

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 

打印(shortest_distance_pair(客戶,供應商))

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

現在,如果你創建兩個列表,1.客戶座標,並且2.供應商協調;你應該能夠利用以上。

+0

非常感謝菲利普! 還有一個問題: 如何獲取[(X,Y),(X,Y)]格式的數據? 我可以讀取列表中的所有Xco和所有Yco,但我如何合併它們? Grts! –

+0

這是一個不同的問題,你應該接受答案。然而,就你而言,你有'customers = [latC,longC]'。要在列表中創建一對座標,只需添加_brackets_'customers = [(latC,longC)]'。向列表添加更多的座標:'customers.append((latC,longC))' – Philip

+0

再次感謝! 目前我有一個'ValueError:太多的值來解壓(預期2)' 在這個pastebin我的代碼..我不明白這可能導致。 https://pastebin.com/itQTdrCe 謝謝! –

相關問題