mirror of
https://github.com/samirsaci/picking-route.git
synced 2025-05-28 13:52:56 +08:00
85 lines
2.7 KiB
Python
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
|