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函数简化代码,提高可读性。
基于地理位置的商品打包算法及Python代码实现

原文地址: https://www.cveoy.top/t/topic/fAJA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录