2024mathorcup妈妈杯数学建模A题思路模型:比赛开始后第一时间更新,更新见文末名片,下面对2022年B题进行介绍:
2022Mathorcup 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为处理冲突之后多走的路)、转弯次数(可以与一二问中的结果数据进行对比)。
部分数据结果:时间窗和冲突搜索两个模型转弯次数对比
或者如果能做到的话,做出路径热力图去分析不同栅格节点所被走过的次数,对比两者可以分析拥挤度,并且分析死锁次数及类型,在本题中最好不要出现死锁情况,题中已经提出避免死锁,所以模型中应尽量减少死锁情况甚至不出现。