mirror of
https://github.com/samirsaci/picking-route.git
synced 2025-06-27 06:17:56 +08:00
first commit
This commit is contained in:
84
utils/routing/distances.py
Normal file
84
utils/routing/distances.py
Normal file
@ -0,0 +1,84 @@
|
||||
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
|
Reference in New Issue
Block a user