A 题 分拣系统优化问题
        某电商公司配送中心的工作流程分为统计汇总、转运上架、按订单分拣、核对打包等
步骤。其中,分拣环节操作复杂,耗时较长,其效率是影响配送中心整体性能的关键因素。
首先,系统统计汇总出当天全部待配送订单所包含的所有货品及相应数量。然后,转运工
将这些货品由仓库转运至分拣处,并放置到货架上,等待分拣。上架时,一个货架中仅放
置同一种货品。为简化问题,不考虑货架的容积和载重限制,即每个货架能够放置的货品
件数没有限制。最后,分拣工按任务单依次分拣出每一个订单包含的货品。

 

问题1,基于订单之间的相似度,对所有订单排序,然后在满足N<200的情况下取批次,最终取出的批次有85批。

代码如下:

import pandas as pd
import numpy as np
data=pd.read_csv('D:\Desktop\A题 附件/附件1:订单信息.csv')
Matrix=np.zeros((923,1941),dtype='int') # 每一行代表一个订单,from tqdm import tqdm
for i in tqdm(range(0,20340)):for j in range(1,924):if data.iloc[i,0]=='D'+'%04d'%j :x=data.iloc[i,1]x=x[1:]x=int(x)Matrix[j-1,x-1]=1
np.savetxt('./Matrix.txt',Matrix,delimiter=' ',fmt='%d')matrix=np.loadtxt('./Matrix.txt')
list=[]
U=np.zeros((923,923))
for i in tqdm(range(0,923)):for j in range(0,923):x=np.sum(abs(matrix[j]-matrix[i]))list.append(x)sorted_id = sorted(range(len(list)), key=lambda k: list[k])U[i]=np.array(sorted_id)list=[]
U=U+1
np.savetxt('./Distance.txt',U,delimiter=' ',fmt='%d')Matrix=np.loadtxt('./Distance.txt')
list=[1]
k=0
z=1
y=np.zeros((1,1941))
for i in tqdm(range(1000000)):x=  Matrix[k][z]if x not in list :list.append(int(x))             #list直接储存订单z=1else:z=z+1if z==923:breakcontinuek=int(x-1)
np.savetxt('./list.txt',list,delimiter=' ',fmt='%d')

问题2按照蒙特卡洛随机的思想,对每批次内的货品随机排列,并计算距离的最小值,以此作为排列的最优值。

问题3按照指派问题的解决思想,对批次内的订单按距离生成效率矩阵,然后用linear_sum_assignment()函数求解,并分配订单。

问题2和问题3的代码如下:直接一步到位,将结果填入CSV中。

import csv
import random
import copy
import os
import numpy as np
from scipy import optimize
import numpy
import pandas as pd
from tqdm import tqdmdata=pd.read_csv('D:\Desktop\A题 附件/附件1:订单信息.csv')
# print(data)
data=np.array(data)
# 附件1订单名称,按从小到大排列的,每行保存一个订单号
num_order=[]
for i in range(len(data)):if data[i][0] not in num_order:num_order.append(data[i][0])
# print(len(num_order))
# print(num_order)
# 附件1对应订单的货品信息,每行保存一个订单的所有货品
list_all = []
for i in num_order:list_r = []for j in range(len(data)):if str(i) == str(data[j][0]):list_r.append(data[j][1])list_all.append(list_r)# 读取按照相似度排列号的订单顺序
data1=np.loadtxt('./list.txt')
data1=data1-1
listp=[]
list2=[]
list1=[]
# listp保存的每个批次中的订单索引,listp的长度就是分的批次,
# listp的每一行就是批次内的订单索引,对应num_order中的订单编号,
# 即假设listp[0][0]=0,则对应的订单号为num_order[0]='D0001'
for i in range(len(data1)):for j in list_all[int(data1[i])]:if j not in list2:list2.append(j)if len(list2)<=200:list1.append(int(data1[i]))else:listp.append(list1)list1=[]list2=[]for j in list_all[int(data1[i])]:if j not in list2:list2.append(j)list1.append(int(data1[i]))if i == len(data1)-1:list1 = []list1.append(int(data1[i]))listp.append(list1)list_aall= []      #     结果2所有的记录,即将这个数据直接写入结果2中
list_3_aall=[]    # 结果3所有的记录,即将这个结果直接写入结果3中
for m in tqdm(range(len(listp))):if len(listp[m])==1: # 当批次内只有一个订单时,直接写入结果2和结果3# 取批次内货品种类number=listp[m][0]list_p = []for j in list_all[int(number)]:if j not in list_p:list_p.append(j)# print(len(list_p), list_p)sorted(list_p)# print(list_p)list_num = []# 货品编号,1-lenfor i in range(len(list_p)):list_num.append(i + 1)# 直接写入结果2list_last_all = []for i in range(len(list_p)):list_last = []list_last.append(list_p[i])list_last.append(m + 1)list_last.append(i + 1)list_last_all.append(list_last)for i in list_last_all:list_aall.append(i)# 直接写入结果3list_3=[]list_3_all=[]list_3.append('D%04d'%(number+1))list_3.append(m+1)list_3.append(1)list_3.append(1)list_3_all.append(list_3)for i in range(len(list_3_all)):list_3_aall.append(list_3_all[i])path = './result2.csv'f = open(r'{}'.format(path), 'w', encoding='gbk', newline='')r1 = csv.writer(f)header = ['ItemNo', 'GroupNo', 'ShelfNo']r1.writerow(header)r1.writerows(list_aall)f.close()path = './result3.csv'f = open(r'{}'.format(path), 'w', encoding='gbk', newline='')r1 = csv.writer(f)header = ['OrderNo', 'GroupNo', 'WorkerNo', 'TaskNo']r1.writerow(header)r1.writerows(list_3_aall)f.close()else:# 批次内货品种类list_p=[]for i in listp[m]:for j in list_all[int(i)]:if j not in list_p:list_p.append(j)# print(len(list_p),list_p)sorted(list_p)# print(list_p)list_num=[]for i in range(len(list_p)):list_num.append(i+1)# 组合成为字典vecdict=dict(zip(list_p,list_num))# print(vecdict)# 将订单货品按字典索引编号,组成向量num_all=[]for i in listp[m]:num_r=[]for j in list_all[int(i)]:num_r.append(vecdict[j])num_all.append(num_r)# print(num_all)# 将批次内所有货品生成一个货架,并随机货架x=[i+1 for i in range(len(list_num))]# print(x)x_all=[] # 统计所有随机货架信息minx_all=[] # 统计每种随机货架下所有订单的距离dic_all=[] # 记录每一种货架排列方式下,每个订单的距离for i in range(200*200): # 随机200*200次np.random.shuffle(x) # 随机货架x_all.append(x) # 将货架信息保存dic=[] # 记录每个订单的距离for p in range(len(num_all)): # 读取批次内货品的长度,即货架的长度listx = [] # 记录每个订单内货品在当前货架摆放顺序下得货品索引for j in num_all[p]:listx.append(x.index(j)) # 将索引写入dicm=max(listx)-min(listx) # 将索引的最大值减去最小值,即为该订单在当前货架排列下的距离dic.append(dicm) # 将该订单的距离保存dic_all.append(dic)# print(dic)minx=sum(dic) # 将该批次内所有订单的距离求和并保存# print(minx)minx_all.append(minx) # 将当前货架摆放顺序下,批次距离保存,即为货架每排列一次,计算一次批次的距离# print(min(minx_all)) # 取出批次距离的最小值# print(x_all[minx_all.index(min(minx_all))]) # 取出批次距离最小值对应的货架排列顺序# 最小距离mindic=min(minx_all)# 最小距离对应的索引minindex=minx_all.index(mindic)vecdict=dict((val,key) for key,val in vecdict.items()) # 将货架序号与货品对应list_name=[]for i in range(len(x_all[minindex])):list_name.append(vecdict[x_all[minindex][i]]) # 读取批次距离最小对应的货架排列顺序,并转换为货品种类,即第一个货架存放哪种品类的商品# print(list_name)path='./result2.csv'f=open(r'{}'.format(path),'w',encoding='gbk',newline='')r1=csv.writer(f)header=['ItemNo','GroupNo','ShelfNo']list_last_all=[]for i in range(len(list_name)):list_last = []list_last.append(list_name[i])list_last.append(m+1)list_last.append(i+1)list_last_all.append(list_last)for i in list_last_all:list_aall.append(i)r1.writerow(header)r1.writerows(list_aall)f.close()# 完成一个批次内的订单指派# 首先生成指派矩阵# 分拣员人数n=5num=len(listp[m])# print('oring len:',num)# 补足数量,形成一个N*N的矩阵num1=0add_num=0if num%n!=0:add_num=int(num/n)+1add_num=int(add_num*n)else:add_num=int(num)# print(add_num)if num<=add_num:num1=add_num# print(num1,add_num)x=copy.deepcopy(dic_all[minindex])# print(x)# print('dic long', len(x))if num<num1:for i in range(num,num1):x.append(0)list_c=[]for i in range(num1):list_c.append(x)c=list_cc = np.array(c)# print(c)name_id,work_id=optimize.linear_sum_assignment(c)# print(c[name_id,work_id ].sum())# print(name_id,work_id)work=work_id.reshape(n,-1)num_order_p=[]for i in listp[m]:num_order_p.append(num_order[int(i)])# print(num_order_p)list_3=[]list_3_all=[]for i in range(len(work)):n=1for j in work[i]:if j<num:list_3=[]list_3.append(num_order_p[j])list_3.append(m+1)list_3.append(i+1)list_3.append(n)n=n+1list_3_all.append(list_3)# print('!='*5)# print(list_3_all)for i in list_3_all:list_3_aall.append(i)path = './result3.csv'f = open(r'{}'.format(path), 'w', encoding='gbk', newline='')r1 = csv.writer(f)header = ['OrderNo', 'GroupNo', 'WorkerNo','TaskNo']r1.writerow(header)r1.writerows(list_3_aall)f.close()

2022年第十四届华中杯数学建模A题解题思路附代码相关推荐

  1. 2023年第十五届华中杯数学建模赛题浅析

    2023年五一假期期间,数学建模竞赛就有四场,各种比赛各种需求应接不暇.因此,对于本次浅析有不足的地方欢迎大家指出.为了更好的帮助大家华中杯选题,首先为大家带来ABC三个题目的浅析,帮助大家更快的选题 ...

  2. 【比赛总结】2022十四届华中杯数学建模比赛总结

    前 好久没写博客了,因为最近在忙别的事情,事情比较多就不想写东西了 所以没在比赛结束的时候直接写总结,拖到了现在 最后的结果是忘记写附录.忘记提交代码和附件了,最终只有三等奖的成绩,这里没有怪我队友的 ...

  3. 2022年第十四届“华中杯”大学生数学建模挑战赛

    2022年第十三届"华中杯"大学生数学建模挑战赛   为了推广我国高校数学建模实践教学,培养学生的创新意识及运用数学方法和计算机技术解决实际问题的能力,第十四届"华中杯& ...

  4. 2023年第十五届电工杯数学建模A题B题思路汇总

    文章目录 0 赛题思路 1 竞赛信息 2 竞赛时间 3 组织机构 4 建模常见问题类型 4.1 分类问题 4.2 优化问题 4.3 预测问题 4.4 评价问题 0 赛题思路 (赛题出来以后第一时间在C ...

  5. 2023第十五届电工杯数学建模AB题思路模型

    文章目录 0 赛题思路 1 竞赛信息 2 竞赛时间 3 组织机构 4 建模常见问题类型 4.1 分类问题 4.2 优化问题 4.3 预测问题 4.4 评价问题 0 赛题思路 (赛题出来以后第一时间在C ...

  6. 第十届MathorCup高校数学建模A题解题思路

    本来想发两道题的解题思路就不再继续发的,但是我看A题有些想法,比赛也只过去一天现在发思路也还来得及想蹭蹭热度,于是总结总结也想发篇文章说说.而且我在这篇文章再说下啊,我这个只是思路,仅供参考.还有就是 ...

  7. 2022年第十四届全国大学生数学竞赛

    11.12非延迟地区开赛啦,小编为大家整理了2022年第十四届全国大学生数学竞赛真题加标答 希望帮到大 家   大学竞赛君自做答案90+,延迟地区的小伙伴也可以辅导

  8. 2023年华中杯数学建模A题新型镇静药物临床实验疗效分析与预测解题全过程文档及程序

    2023年华中杯数学建模 A题 新型镇静药物临床实验疗效分析与预测 原题再现   临床研究是新药物研究中的关键环节.本题拟围绕一种新型镇静药物的临床实验数据分析展开. 尝试根据附件中提供的数据和相关材 ...

  9. 2023年华中杯数学建模B题小学数学应用题相似性度量及难度评估解题全过程文档及程序

    2023年华中杯数学建模 B题 小学数学应用题相似性度量及难度评估 原题再现   某 MOOC 在线教育平台希望能够进行个性化教学,实现用户自主学习.在用户学习时,系统从题库中随机抽取若干道与例题同步 ...

最新文章

  1. 【网络流】解题报告:luogu P3376 【模板】网络最大流
  2. 怎么用css控制border成为三角形
  3. python代码怎么运行-python代码是怎样运行的
  4. 垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
  5. mysql没法安装_mysql没法使用、没法启动服务的解决方法
  6. rea t插件 vscode_精选!15个必备的VSCode插件-Go语言中文社区
  7. 第二阶段冲刺第四天(6月3号)
  8. 快速搭建Nextcloud+OnlyOffice私有云办公平台
  9. 拼多多加大百亿补贴力度,iPhone 12中配版券后价5899元
  10. php监考,科学网—监考与被监考 - 张珑的博文
  11. c#中是否有javascript中的jQuery类库?
  12. DotNetBar2使用实例(引用方法)
  13. 为什么马云最佩服「唐僧团队」?
  14. 企业邮箱账号,如何在foxmail上创建
  15. 【渝粤教育】 国家开放大学2020年春季 1054流通概论 参考试题
  16. Sql Server 本地链接设置 127.0.0.1
  17. 解决xhtmlrenderer flying-saucer-pdf-itext5 生成pdf时html中table分页内容太多挤到第二页问题。
  18. iOS开发工具-网络封包分析工具Charles
  19. android模拟器横屏快捷键,Android模拟器横屏切换方法
  20. uni-app微信公众号(5)——新增、修改地址

热门文章

  1. 解决win10蓝牙自动断连
  2. Laragon的安装、注意事项
  3. 课堂问题:一个凸函数的性质
  4. mysql创建外键级联更新_MySQL使用外键实现级联删除与更新的方法
  5. 东南亚跨境一件代发好用的Shopee货代系统—星卓越
  6. Ubuntu 20.04 live server版安装(详细版)
  7. 如何有效清理C盘?清除Windows更新后残留文件?磁盘清理?
  8. 如何进行日内趋势量化交易系统的设计?这篇文章可以给你启发!
  9. Huffman编码/译码问题
  10. 挑选西瓜(决策树实现)