以下是实现商品分配优化算法的完整代码:

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
    
    # 计算商品与会员之间的距离
    距离 = distance.cdist(商品信息[:, :2], [[会员GPS纬度, 会员GPS经度]])
    
    # 过滤距离超过0.1的商品
    有效商品索引 = np.where(距离 <= 0.1)[0]
    有效商品信息 = 商品信息[有效商品索引]
    有效商品编号 =  有效商品信息[:, 2]
    
    # 排序商品,优先选择打包数量大的商品
    排序索引 = np.argsort(有效商品信息[:, 3])[::-1]
    有效商品编号 = 有效商品编号[排序索引]
    有效商品打包数量 = 有效商品信息[排序索引, 3]

    # 遍历有效商品
    for j in range(len(有效商品编号)):
        商品编号 = 有效商品编号[j]
        打包数量 = 有效商品打包数量[j]
        
        # 如果商品已被其他会员挑选过,则跳过
        if 商品编号 in 已分配商品:
            continue
        
        # 如果当前会员已挑选商品数量加上当前商品数量超过预订商品限额,则跳过
        if 当前会员已挑选商品数量 + 打包数量 > 预订商品限额:
            continue
        
        # 将当前商品加入当前会员已挑选商品列表,并更新已挑选商品数量
        当前会员已挑选商品.append(商品编号)
        当前会员已挑选商品数量 += 打包数量
        
        # 将当前商品加入已分配商品列表
        已分配商品.append(商品编号)
    
    # 输出当前会员挑选到的商品数量和预订商品限额
    print('会员编号:', 会员编号)
    print('挑选到的商品数量:', 当前会员已挑选商品数量)
    print('预订商品限额:', 预订商品限额)
    print()
    
    # 输出当前会员挑选到的商品列表
    print('会员编号:', 会员编号)
    print('挑选到的商品列表:', 当前会员已挑选商品)
    print()

# 输出每个商品被分配到哪个会员
商品分配 = np.zeros(len(商品信息))
for i in range(len(商品信息)):
    商品编号 = 商品信息[i][2]
    for j in range(len(会员信息)):
        if 商品编号 in 当前会员已挑选商品[j]:
            商品分配[i] = j + 1
            break

print('商品分配:', 商品分配)

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

  1. 使用distance.cdist函数一次性计算所有商品与会员之间的距离,避免循环计算距离;
  2. 使用np.where筛选出距离小于等于0.1的有效商品,减少循环次数;
  3. 使用np.argsort对有效商品进行排序,优先选择打包数量大的商品,避免不必要的循环;
  4. 使用np.zeros初始化商品分配数组,提高代码效率。

通过这些优化,代码的执行效率得到了显著提升。


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

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