商品分配优化算法:基于距离和限额的商品分配方案
以下是实现商品分配优化算法的完整代码:
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数组进行计算,以提高代码的执行效率。主要优化点包括:
- 使用
distance.cdist函数一次性计算所有商品与会员之间的距离,避免循环计算距离; - 使用
np.where筛选出距离小于等于0.1的有效商品,减少循环次数; - 使用
np.argsort对有效商品进行排序,优先选择打包数量大的商品,避免不必要的循环; - 使用
np.zeros初始化商品分配数组,提高代码效率。
通过这些优化,代码的执行效率得到了显著提升。
原文地址: https://www.cveoy.top/t/topic/fAJp 著作权归作者所有。请勿转载和采集!