Files
picking-route/utils/routing/distances.py
2021-11-01 23:12:52 +01:00

85 lines
2.7 KiB
Python

import numpy as np
import pandas as pd
import ast
from ast import literal_eval
def distance_picking(Loc1, Loc2, y_low, y_high):
'''Calculate Picker Route Distance between two locations'''
# Start Point
x1, y1 = Loc1[0], Loc1[1]
# End Point
x2, y2 = Loc2[0], Loc2[1]
# Distance x-axis
distance_x = abs(x2 - x1)
# Distance y-axis
if x1 == x2:
distance_y1 = abs(y2 - y1)
distance_y2 = distance_y1
else:
distance_y1 = (y_high - y1) + (y_high - y2)
distance_y2 = (y1 - y_low) + (y2 - y_low)
# Minimum distance on y-axis
distance_y = min(distance_y1, distance_y2)
# Total distance
distance = distance_x + distance_y
return int(distance)
def next_location(start_loc, list_locs, y_low, y_high):
'''Find closest next location'''
# Distance to every next points candidate
list_dist = [distance_picking(start_loc, i, y_low, y_high) for i in list_locs]
# Minimum Distance
distance_next = min(list_dist)
# Location of minimum distance
index_min = list_dist.index(min(list_dist))
next_loc = list_locs[index_min]
list_locs.remove(next_loc)
return list_locs, start_loc, next_loc, distance_next
def centroid(list_in):
'''Centroid function'''
x, y = [p[0] for p in list_in], [p[1] for p in list_in]
centroid = [round(sum(x) / len(list_in),2), round(sum(y) / len(list_in), 2)]
return centroid
def centroid_mapping(df_multi):
'''Mapping Centroids'''
# Mapping multi
df_multi['Coord'] = df_multi['Coord'].apply(literal_eval)
# Group coordinates per order
df_group = pd.DataFrame(df_multi.groupby(['OrderNumber'])['Coord'].apply(list)).reset_index()
# Calculate Centroid
df_group['Coord_Centroid'] = df_group['Coord'].apply(centroid)
# Dictionnary for mapping
list_order, list_coord = list(df_group.OrderNumber.values), list(df_group.Coord_Centroid.values)
dict_coord = dict(zip(list_order, list_coord))
# Final mapping
df_multi['Coord_Cluster'] = df_multi['OrderNumber'].map(dict_coord).astype(str)
df_multi['Coord'] = df_multi['Coord'].astype(str)
return df_multi
def distance_picking_cluster(point1, point2):
y_low, y_high = 5.5, 50
# Start Point
x1, y1 = point1[0], point1[1]
# End Point
x2, y2 = point2[0], point2[1]
# Distance x-axis
distance_x = abs(x2 - x1)
# Distance y-axis
if x1 == x2:
distance_y1 = abs(y2 - y1)
distance_y2 = distance_y1
else:
distance_y1 = (y_high - y1) + (y_high - y2)
distance_y2 = (y1 - y_low) + (y2 - y_low)
# Minimum distance on y-axis
distance_y = min(distance_y1, distance_y2)
# Total distance
distance = distance_x + distance_y
return distance