2022 MathorCup 数学建模B题思路解析


Mathorcup B题题目介绍

​ B题无人仓的搬运机器人调度问题本题考虑在无人仓内的仓库管理问题之一,搬运机器人 AGV 的调度问 题。更多的背景介绍请参看附件-背景介绍。对于无人仓来说,仓库的地图 模型可以简化为图的数据结构。

一、问题一

1、地图模型

​ 题目中已经给出了地图的栅格模型,然后在题目给的附件里也有地图数据(map.csv),所以可以用Matlab建立一个栅格地图模型,之后再在这个模型基础上面进行路径规划,进行仿真模拟。

2、路径规划

​ 现在有较多的路径规划算法,但在AGV和仓储搬运路径问题上常用的有A*算法、Dijkstra算法,在本题中可以选择A*算法、Dijkstra算法来计算AGV路径规划模型,但在本题中,从结果看来,A*算法是优于Dijkstra算法的,所以可以直接选用A*算法。

A*算法的核心部分(Matlab)

%% 预处理
% 初始化closeList
closeList = start_node;
closeList_path = {start_node,start_node};
closeList_cost = 0;
child_nodes = child_nodes_cal(start_node,  m, n, obs, closeList); %子节点搜索函数 

% 初始化openList
openList = child_nodes;
for i = 1:size(openList,1)
    openList_path{i,1} = openList(i,:);
    openList_path{i,2} = [start_node;openList(i,:)];%从初始点到第i个子节点
end

for i = 1:size(openList, 1)
    g = norm(start_node - openList(i,1:2));%norm求范数,返回最大奇异值;abs求绝对值
    h = abs(target_node(1) - openList(i,1)) + abs(target_node(2) - openList(i,2));
    %终点横坐标距离加纵坐标距离
    f = g + h;
    openList_cost(i,:) = [g, h, f];
end

%% 开始搜索
% 从openList开始搜索移动代价最小的节点
[~, min_idx] = min(openList_cost(:,3));%输出openlist_cost表中最小值的位置
parent_node = openList(min_idx,:);%父节点为代价最小节点


%% 进入循环
flag = 1;
while flag   
    
    % 找出父节点的忽略closeList的子节点
    child_nodes = child_nodes_cal(parent_node,  m, n, obs, closeList); 
    
    % 判断这些子节点是否在openList中,若在,则比较更新;没在则追加到openList中
    for i = 1:size(child_nodes,1)
        child_node = child_nodes(i,:);
        [in_flag,openList_idx] = ismember(child_node, openList, 'rows');%ismember函数表示子节点在open表中则返回1,判断flag,输出此子节点在openlist表中的位置
        g = openList_cost(min_idx, 1) + norm(parent_node - child_node);%按照新父节点计算此子节点的g,h值
        h = abs(child_node(1) - target_node(1)) + abs(child_node(2) - target_node(2));
        f = g+h;
        
        if in_flag   % 若在,比较更新g和f        
            if g < openList_cost(openList_idx,1)
                openList_cost(openList_idx, 1) = g;%将openlist_cost表中第id个位置的第一个数更新为以新父节点计算的g值
                openList_cost(openList_idx, 3) = f;
                openList_path{openList_idx,2} = [openList_path{min_idx,2}; child_node];
            end
        else         % 若不在,追加到openList
            openList(end+1,:) = child_node;
            openList_cost(end+1, :) = [g, h, f];
            openList_path{end+1, 1} = child_node;
            openList_path{end, 2} = [openList_path{min_idx,2}; child_node];
        end
    end
   
    
    % 从openList移除移动代价最小的节点到 closeList
    closeList(end+1,: ) =  openList(min_idx,:);
    closeList_cost(end+1,1) =   openList_cost(min_idx,3);
    closeList_path(end+1,:) = openList_path(min_idx,:);
    openList(min_idx,:) = [];%openlist表中已跳出的最小值位置设为空
    openList_cost(min_idx,:) = [];
    openList_path(min_idx,:) = [];
 
    % 重新搜索:从openList搜索移动代价最小的节点(重复步骤)
    [~, min_idx] = min(openList_cost(:,3));
    parent_node = openList(min_idx,:);
    
    % 判断是否搜索到终点
    if parent_node == target_node
        closeList(end+1,: ) =  openList(min_idx,:);
        closeList_cost(end+1,1) =   openList_cost(min_idx,1);
        closeList_path(end+1,:) = openList_path(min_idx,:);
        flag = 0;
    end
end

3、任务分配调度模型

​ 通过遍历两个附件(订单、AGV)去选择挑选小车,利用上述的算法去计算路径的长度,之后挑选出路径最短的小车与任务,给AGV进行任务分配。

注意:一个订单可能对应的托盘不止一个,在订单数量需求较大时,可能需要两个托盘甚至更多

二、问题二

​ 在这题中,可以加入遗传蚁群算法去优化拣货分区模型,之后建立多目标规划,可以引入几个指标,例如:转弯次数、路径长度、拣货台拣货数量平均度、拥挤度、拣货效率几个方面进行规划,下面是做出的分区结果:
分区结果

可以考虑建立多种分区结果,然后进行对比选取最优

三、问题三

1、分析

​ 冲突问题可以选用时间窗或者冲突搜索,去调整之前模型路径,把冲突情况分成边冲突和点冲突这两种情况:

(1)点冲突

在这里插入图片描述

节点冲突

在这里插入图片描述

相向冲突

(2)边冲突

在这里插入图片描述

在下一时刻交换位置

2、冲突处理及模型评价

​ 选用了冲突搜索,计算结果更加优秀,可以用元组去存储冲突数据,建立一个冲突约束树,之后在不断建立下一层,直到没有冲突,此时这条最终路径,作为AGV的执行任务路径。之后可以利用各类指标去对比在一二问中的模型,例如:冲突处理代价(AGV为处理冲突之后多走的路)、转弯次数(可以与一二问中的结果数据进行对比)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vrFJ5Qj5-1650454796775)(C:\Users\83411\AppData\Roaming\Typora\typora-user-images\image-20220420193029885.png)]

部分数据结果:时间窗和冲突搜索两个模型转弯次数对比

​ 或者如果能做到的话,做出路径热力图去分析不同栅格节点所被走过的次数,对比两者可以分析拥挤度,并且分析死锁次数及类型,在本题中最好不要出现死锁情况,题中已经提出避免死锁,所以模型中应尽量减少死锁情况甚至不出现。

  • 17
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯了的猪丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值