以下是实现上述功能的完整代码:

import pandas as pd
import numpy as np
from scipy.spatial import distance

# 读取商品信息和会员信息
商品信息_df = pd.read_excel(r"D:\pythonProject3\商品信息\商品打包.xlsx")
会员信息_df = pd.read_excel(r"D:\pythonProject3\打包问题\会员信息.xlsx")

# 将商品信息和会员信息转换为numpy数组
商品信息 = 商品信息_df[['新商品GPS纬度', '新商品GPS经度', '商品编号', '打包数量']].values
会员信息 = 会员信息_df[['会员编号', '会员GPS纬度', '会员GPS经度', '预订商品限额']].values

# 初始化已分配商品的列表
已分配商品 = []

# 遍历每个会员
for i in range(len(会员信息)):
    会员编号 = 会员信息[i][0]
    会员GPS纬度 = 会员信息[i][1]
    会员GPS经度 = 会员信息[i][2]
    预订商品限额 = 会员信息[i][3]
    
    # 初始化当前会员已挑选的商品列表和已挑选商品数量
    当前会员已挑选商品 = []
    当前会员已挑选商品数量 = 0
    
    # 遍历每个商品
    for j in range(len(商品信息)):
        商品GPS纬度 = 商品信息[j][0]
        商品GPS经度 = 商品信息[j][1]
        商品编号 = 商品信息[j][2]
        打包数量 = 商品信息[j][3]
        
        # 如果商品已被其他会员挑选过,则跳过
        if 商品编号 in 已分配商品:
            continue
        
        # 计算商品和会员之间的距离
        距离 = distance.euclidean((商品GPS纬度, 商品GPS经度), (会员GPS纬度, 会员GPS经度))
        
        # 如果商品距离超过0.1,则跳过
        if 距离 > 0.1:
            continue
        
        # 如果当前会员已挑选商品数量加上当前商品数量超过预订商品限额,则跳过
        if 当前会员已挑选商品数量 + 打包数量 > 预订商品限额:
            continue
        
        # 将当前商品加入当前会员已挑选商品列表,并更新已挑选商品数量
        当前会员已挑选商品.append(商品编号)
        当前会员已挑选商品数量 += 打包数量
        
        # 将当前商品加入已分配商品列表
        已分配商品.append(商品编号)
    
    # 输出当前会员挑选到的商品数量和预订商品限额
    print("会员编号:", 会员编号)
    print("挑选到的商品数量:", 当前会员已挑选商品数量)
    print("预订商品限额:", 预订商品限额)
    print()
    
    # 输出当前会员挑选到的商品列表
    print("会员编号:", 会员编号)
    print("挑选到的商品列表:", 当前会员已挑选商品)
    print()
    
# 输出每个商品被分配到哪个会员
商品分配 = np.zeros(len(商品信息))
for i in range(len(商品信息)):
    商品编号 = 商品信息[i][2]
    商品分配[i] = [j+1 for j in range(len(会员信息)) if 商品编号 in 当前会员已挑选商品]
    
print("商品分配:", 商品分配)

优化算法的方法主要是减少循环次数和使用numpy数组进行计算,以提高代码的执行效率。


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

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