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

2023-11-19

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=1
    else:
        z=z+1
        if z==923:
            break
        continue
    k=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 tqdm


data=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-len
        for i in range(len(list_p)):
            list_num.append(i + 1)
        # 直接写入结果2
        list_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)
        # 直接写入结果3
        list_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=5
        num=len(listp[m])
        # print('oring len:',num)
        # 补足数量,形成一个N*N的矩阵
        num1=0
        add_num=0
        if num%n!=0:
            add_num=int(num/n)+1
            add_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_c
        c = 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=1
            for 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+1
                    list_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()
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 基于conda的相关命令

    conda 查看python版本环境 打开Anaconda Prompt的命令输入框 查看自己的python版本 conda env list 激活相应的python版本 环境 conda avtivate python 3 9 若输入以下
  • 我在工作中是如何使用【Linux】的

    目录 前言 一 常用命令 二 文件和目录处理 三 用户与组管理命令 四 进程管理命令 五 网络管理命令 六 帮助命令 七 磁盘管理 前言 大家好 这是我首篇博客 内容是linux工作需用到的内容 在这里我给大家总结出来了 希望多支持支持 感
  • 【Hello mysql】 mysql的事务

    Mysql专栏 Mysql 本篇博客简介 介绍mysql的事务 mysql的事务 事务的概念 事务功能测试 事务的隔离级别 如何理解隔离性 粗浅理解 隔离级别 查看和设置隔离级别 四种隔离级别详解 读 未提交 读 提交 可重复读 串行化 一
  • 6月17日实验课之“H.264文件解析”

    文章目录 1 实验要求 2 实验结果 2 1 SPS 2 1 1 profile idc 2 1 2 level idc 2 1 3 seq parameter set id 2 1 4 log2 max frame num minus4
  • jmeter+接口测试练习+接口关联+Json提取

    1 测试用例设计 2 因为要执行多条用例 所以在Jmeter添加了http信息头管理器和http请求默认值 3 查询用户信息接口需要用到登录的token 但要先登录再把token拿出来传到查询的信息头里 会出现登录信息已过期的提示 考虑用j
  • 从0开始写Vue项目-Vue页面主体布局和登录、注册页面

    1 从0开始写Vue项目 环境和项目搭建 慕言要努力的博客 CSDN博客 2 从0开始写Vue项目 Vue2集成Element ui和后台主体框架搭建 慕言要努力的博客 CSDN博客 一 主体布局 关于主体布局 我们刚开始肯定是做的死数据的
  • 考研数二第三讲 极限存在准则和两个重要极限和极限运算准则

    根据前面介绍的内容 具体推理数列以及函数的极限推理过程 在实际应用中极限的两大准则使用还是比较广泛的 大家需要多多关注 极限存在准则和两个重要极限 准则 I 夹逼准则 如果数列 xn yn zn 满足下列条件 证明 此函数分母的极限为 0
  • 稿费一般多少钱一千字_编写教材的稿费一般是多少

    我们知道编写教材是会受到一定的稿酬的 除了编写教材 还有图书 报纸 个人公开发表等等 公费出书都有可能获取一定的稿酬 那么稿酬是如何计算的呢 编写教材的稿费一般是多少 以下是根据 出版文字作品报酬规定 介绍了基本稿酬的标准 供大家参考 19
  • VUE项目中的全局格式化时间过滤器

    自定义格式化时间 一 问题 这是一个后台管理系统中的商品列表页 其中的时间这一项在调用接口后会发现是以毫秒来计算的 这样当然是不行的啦 要换算成我们日常使用的2020 04 07 17 13 这样的时间格式 二 解决办法 1 打开项目中的m
  • html5 比例尺,高德地图API之缩放比例尺控件+3D转换

    缩放比例尺控件 首先引入控件 amap scale 然后使用 map addcontrol 添加控件map margin 0 padding 0 list style none container width 100 height 100
  • Flutter 画板实现

    import package flutter material dart class DrawingBoard extends StatefulWidget override DrawingBoardState createState gt
  • Unity5.4.1与NGUI出现的问题Ignoring menu item NGUI because it is in no submenu!

    原文 http www tasharen com forum index php topic 14856 0 Hey Arenmook after upgrading to Unity 5 4 1 from 5 3 6p1 and upgr
  • 【CMake】教程:第2步 添加库

    CMake 教程 第2步 添加库 问题 当写的程序由多个模块组成 如何组织这些代码 以及如何利用模块代码生成的库呢 解答思路 编写模块代码 将模块代码生成库 编写调用程序 编译链接模块库 以求一个数的平方根为例 编写模块代码 MathFun
  • FreeRTOS任务基础知识

    多任务系统 对于单任务系统 每个任务的优先级都是相同的 多任务将一个大问题分成小问题 每个小任务完成的时间很短 看起来像同时完成 多任务系统通过任务调度器来安排任务优先顺序 FreeROTS根据是一个抢占式的实时多任务系统 高优先级的任务可
  • 保护您的企业数据免受.mkp勒索病毒:恢复加密数据库的关键策略

    引言 近年来 勒索病毒已经成为网络安全领域中最为恶劣和具有挑战性的威胁之一 它们通过加密用户的敏感数据 并勒索赎金来造成严重的经济和业务损失 91数据恢复研究院在本文将深入探讨一种名为 mkp的勒索病毒 并提供针对 mkp勒索病毒感染导致数
  • Unity+Pico 手柄按键控制

    一 定义手柄按键API 1 InputDevices GetDeviceAtXRNode 通过XRNode获取对应的设备 2 XRNode是一个枚举类型 包含LeftEye RightEye CenterEye Head LeftHand
  • 利用油猴脚本实现知网搜索自动选择核心期刊

    利用知网查询学术期刊默认选择全部期刊 而很多时候我们只希望找到SCI SSCI等核心期刊 每次都要手动勾选太麻烦 这里利用油猴写一个脚本自动点选想要查询的期刊 省去每次选择的麻烦 首先在浏览器中安装油猴插件 右键插件按钮选择 选项 打开油猴
  • 记:解决 Weditor 页面元素坐标定位不到、不准确的问题

    前言 这几天同事也在研究使用uiautomator2 之前安装一直都挺稳定没有啥报错 然后后面有换了一个uiautomator2版本 最后就使用Weditor 的时候就开始出现了Weditor 界面定位不到 不准确的问题了 如下图 解决思路
  • 智能文档比对小程序,支持扫描件比对、PDF比对,Word比对,合同比对、公文比对,限时免费使用

    很多企业在实际业务场景中 合同会反复修改 一份合同从无到有 需要经历洽谈 起草 签订 履行 变更等多个业务环节 合同文件既有电子版也有纸质版 各个环节存在大致内容类似但细节有差异的多个版本文档 企业不仅需要自动识别图像中的文本信息 将图片或
  • 2022年第十四届华中杯数学建模A题解题思路附代码

    A 题 分拣系统优化问题 某电商公司配送中心的工作流程分为统计汇总 转运上架 按订单分拣 核对打包等 步骤 其中 分拣环节操作复杂 耗时较长 其效率是影响配送中心整体性能的关键因素 首先 系统统计汇总出当天全部待配送订单所包含的所有货品及相