Парные расчеты расстояний между двумя наборами точек

Я сталкиваюсь с некоторыми проблемами при выполнении парного вычисления в 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]

Спасибо!

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

печать (shortest_distance_pair(заказчик, поставщик))

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

Теперь, если вы создаете два списка: 1. Координаты клиента и 2. Координаты поставщика; Вы должны быть в состоянии использовать вышеупомянутое.

Другие вопросы по тегам