基于地理位置的商品打包算法及Python代码实现
import pandas as pd
import numpy as np
from geopy.distance import geodesic
# 读取商品信息
df_product = pd.read_excel('D:\pythonProject3\商品信息\商品打包.xlsx')
df_product['已分配数量'] = 0
# 读取会员信息
df_member = pd.read_excel('D:\pythonProject3\打包问题\会员信息.xlsx')
df_member['已分配数量'] = 0
# 计算距离
def calculate_distance(lat1, lon1, lat2, lon2):
coords_1 = (lat1, lon1)
coords_2 = (lat2, lon2)
return geodesic(coords_1, coords_2).miles
# 遍历每个会员
for index, member in df_member.iterrows():
member_id = member['会员编号']
member_lat = member['会员GPS纬度']
member_lon = member['会员GPS经度']
member_limit = member['预订商品限额']
# 筛选距离 within 0.1 的商品
df_product_nearby = df_product[
(df_product['已分配数量'] == 0) &
(df_product.apply(lambda row: calculate_distance(member_lat, member_lon, row['新商品GPS纬度'], row['新商品GPS经度']) <= 0.1, axis=1))
]
# 按距离排序
df_product_nearby = df_product_nearby.sort_values(by='打包数量', ascending=False)
# 分配商品
remaining_limit = member_limit
for index, product in df_product_nearby.iterrows():
product_id = product['商品编号']
product_quantity = product['打包数量']
if product_quantity <= remaining_limit:
df_product.loc[df_product['商品编号'] == product_id, '已分配数量'] += product_quantity
df_member.loc[df_member['会员编号'] == member_id, '已分配数量'] += product_quantity
remaining_limit -= product_quantity
else:
break
# 输出结果
print('会员分配情况:')
print(df_member[['会员编号', '已分配数量', '预订商品限额']])
print('\n商品分配情况:')
print(df_product[['商品编号', '已分配数量']])
算法优化:
- 预先筛选商品: 在遍历每个会员之前,先筛选出距离该会员0.1英里以内的商品,避免计算所有商品的距离,提高效率。
- 按需求量排序: 将筛选出的商品按照打包数量降序排列,优先分配需求量大的商品,提高会员满意度。
- 代码简洁性: 使用pandas的apply函数简化代码,提高可读性。
原文地址: https://www.cveoy.top/t/topic/fAJA 著作权归作者所有。请勿转载和采集!