华为杯2023
不出意外,task_process_2()是主要的分配方案
待优化点:
应该一直以合成最高等级的物品为核心,目前对高等级物品的权重分配似乎并不合理
如果已经有高等级成品可以售卖,应该永远以高等级优先
如果高等级物品的合成仅缺一个物件,且场上还有成品的情况下,这个的优先级应该是很高的!!!
还是两个分配方案两个运动控制方案,目前暂时不清楚为啥两个分配方案结果不同
目前主要任务:给我确定不同的种子到底为啥对我的结果影响这个么大!!!!!!!!!!!
task_process_2() 对图2有巨大的bug!!!!!,已经修复,
由于正式赛会更改地图,所以暂时停止调参上分,转为优化简介代码,为将来的调参节省时间
目前已经实现了两种版本的方案分配,一种是有等级的(task_process()),一种是没有等级的(task_process_1())
两个运动控制方案(cal_instruct(), cal_instruct_1()),分别为两种分配方案服务
实现了对地图的区分,可以针对不同的地图使用不同的分配方案和运控控制方案
调参时应该注意下面的几个方面!!!
1、本地调试尽量加入随机种子,仔细查看不同种子对运动尤其是最后几秒的影响;
2、本地与云端巨大差异的原因,尤其是最后几秒,记得录频逐帧分析;
3、查看每一张图应该停止交易的时间是多少,分别指定;
4、确定最终输出速度数据类型(int, float)对每一张图的影响;
5、不同的运动控制方案会影响最终几秒的状态,但是最终的目标都是希望少撞墙,快速拐弯,不打转;
6、极端情况下可以为没一副地图设计不同的运控控制方案;
7、极端情况小车完全对撞不动,这种情况仍然经常出现!!
8、计算当距离结束还有多少时间时就不在买了,这个 它距离背上这个物品之后目标点的距离/最大速度<=(距离结束的时间) 时候就不再购买这个东西
9、如果场上有8,9工作台,可以尝试着优先去去高级的物品试试看会不会更高
10、最后几秒如果场上有更高级的物品而且能卖就直接去拿这个最高级的物品
11、调试过程中发现有一版的分配方案对map_1格外有效,所以还是加进来了,到时候所有的地图都可以试试
12、可以尝试关闭分配方案对工作台123的时间区分限制,对那种123分布很远的map有奇效
13、不同的分配方案可以分别搭配不同的的运动控制方式
14、运动控制方式中有若干种约束可以选择,注意分别调参
15、判定小车互相撞击的警戒距离warning_distance 是需要分别设置的
16、提交时注意记录每一次提交各个地图对应的分数并保留代码,要对的上
官方baseline map1结果是864876,并且似乎没有考虑到碰撞的情况,撞了也不管,就硬撞然后一点点偏移
简单化这一题,可以分为两大问题:
1、多机器人的路径规划,即如何同时控制四个机器人到达各自的目标点
2、最优方案,即每一个机器人应该去哪个点
完全按照官方demo推演,并不是像我之前想的,但是仍然是针对每一帧进行的操作,不需要知道之前的状态,也不需要知道之后的状态
1、工作台8和9不生产物品,要他们干啥?
答:用来收购相应的物品,物品不能在机器人身上凭空卖掉,只能在对应的收这个物品的工作台售卖,机器人只能凭空销毁物品
2、有没有可能有的工作台压根就不会出现?
答:是的,完全有可能
3、判题器给定的工作台和机器人信息都是按照一定的顺序来的,是map里面的顺序吗(从左到右,从上到下)?
答:是按照判题器第一次给你的位置来,第一次判题器发过来的就是初始的状态,里面含有所有的物体以及坐标,并且题目保证每一次的输出顺序一致
4、既然每一次指令发送都会给所有物体的位置信息,那我是不是不用初始化时记录各个物体的位置了?
答:目前来看似乎是这样,初始化时其实只需要大概看一下就行,我甚至感觉不看都行。。。。。
5、我的代码中每一次买卖都是针对当前帧的执行的,并且会改变本地状态的记录,如果有一帧没有对上,岂不是可能导致后面的状态全部出错乱掉?
答:目前来看是的,所以一定要尽量保证不丢帧,后面的完善可以考虑加上实时对比每个机器人身上背的东西,如果与预期不符需要进行修改操作,这些是后话了
6、do_task()中,如果这个交易不能进行怎么办?虽然任务是按照队列顺序进行的,但是执行后面任务的机器人可能比执行前一个任务的机器人先到达,可能这个地方的产品还没有被拿走, 这种应该如何处理?
答:目前的解决方法是对每一个task使用task_id标记,如果已经完成了就放进done_tasks集合中,
站在上帝的视角看全局,从一开始就规划好了所有的路径,接下来的任务就是如何控制这4个机器人行动的问题
想在本地实时记录所有东西的状态,具体方案为对每一个物体创建一个类,每一帧都更新所有的实例,但是发现好像不太需要,因为所有物体的状态每一帧 0 判题器都会返回给我,我为什么要记录呢?所以就想到了思路二
由于每一帧的情况判题器都会给我,所以我只需要针对这一瞬间的情况给出操作即可,不需要考虑之后的与之前的状态,
对于这种想法比较可行
问题1就是多机器人的路径规划简单版,因为没有障碍,只需要它们自己之间别相互阻挡就行,这是一个独立的部分,网上应该有比较成熟的方案,只要配合判题器稍作修改就行
问题2才是我们能优化的关键,也就是我们要让每一个机器人去哪个工作台的问题。
目前想到一个最简单的版本:首先每一个机器人都有自己的状态(0,1),0表示这台机器人刚完成任务现在是空闲状态,需要给他分配任务其实就是
给一个工作台让他去,1表示这个机器人现在有任务在身,不要管他,让他去执行任务。关键就是没有任务的机器人应该让他去哪个工作台,分配任务的逻辑
如下:
① 观察工作台7有没有成品,有的话直接拿去8或9卖掉(哪个近取哪个)
② 观察工作台7缺不缺原材料,缺的话看4、5、6有没有做好了的,如果有做好了的或正在做都直接去拿,如果到达了这个工作台还没有
做好的话就直接去1、2、3拿这个工作台需要的原材料(这一步可以优化成事先计算好达到目标工作台时有没有做好),回头直接把这个1、2、3卖掉并
拿走4、5、6卖给7,如果到达1、2、3后工作台还没有做好就在那等着
整体的思路就是尽量生成7,但是这可能会浪费大量的时间去走到工作台7,尤其是当7号工作台距离其他的工作台非常远的时候
一共两大部分:
想到一个小点,不是小车去找工作台,而是工作台找小车,所以就盯着456789,只要他们有需求就去找这个需求的根源,让距离这个根源需求最近的小车 去取,这样好像可以规避某些工作台不存在的问题,因为如果一单对这个东西有需求,就一定有工作台可以出售,极端状态如果123都不存在的话,根源需求永远不会得到满足, 小车永远不会动
宏观来看,每一个小车除了在完成交易的瞬间没有任务外,其他所有时刻身上应该都是背着任务(目标点)的,因此每一帧结束时其实小车都有任务在身,
换句话说小车一直有目标要去
1、给定当前小车的位置信息运动状态和目标点,给我这一时刻需要对这个小车发出的指令
2、已知当前所有工作台的状态,如何给小车分配任务,也就是说如何指定每一个小车的目标工作台
1、图3运行到剩余24-22s的时候会有三个机器人停止不动,但是很明显场上缺了好几个23,而且也有23已经做好了的工作台,但是他们都没有去,为什么? 已解决
2、目前每一帧的运算速度是0.15ms左右,完全足够
3、暂时计划加入dwa的路径规划
4、当场上缺少多种物品而且这些缺的都已经生产好了的情况下,优先去最高级的点,而不是最近的!
5、机器人会远离目标点,速度负的打分反而高,因为归一化值是负的! 直接把最小速度设置为0
6、机器人在靠近目标是会减速 因为当靠近目标的时候,距离太快的在预判的时间范围内会超过目标点,使得角度评价分数变得特别低,所以角度评价 时,需要考虑是否已经距离目标点足够近,如果足够近就直接给一个很高的分
7、DWA暂时放弃,转向方案优化和简单的防止撞墙,然后针对地图进行调参
方案优化1、当机器人需要搬东西的时候,优先搬等级最高的,而不是最近的 -->>>>分变低了,由此可以知道距离才是关键
方案优化1、当机器人需要搬东西的时候,优先搬我到这个台的距离+这个工作台到目标工作台的距离 的最小值 分还是降低了,感觉有许多地位比较低的小车在运输的过程中会突然被高级的小车抢掉目标,导致多走许多路
需求1、在购买一个物品之前判断将这个物品送到目标点所需要的时间,如果时间已经不够了就不要购买 已完成 需求2、将判断机器人携带物品状态下需要将这个物品送到哪个工作台这个操作写成函数封装起来,需求1需要这个需求 已完成 需求3、如果有的工作台已经有两个只差一个原材料时优先去般这个工作台缺的原材料,但是对于工作台8不公平 已经设置weight权重,注意调整 需求4、如果场上有工作台9,那么each_lack_num将永远为[0,1000,1000,1000,1000,1000,1000,1000,1000],而且,如果两个机器人都背着相同的物体,但是目标工作台类型是9,那么可以不用等待
需求5、如果有工作台缺1,应该从距离这个工作台最近的1号工作台去哪,除非这个1号距离当前机器人很远,但是因该要考虑这种情况,顶多是加某个权重的问题,现在考虑的只有当前机器人到1号工作台的距离! 添加了 not_constraint_123_map 变量,用来标记忽略123工作台加工时间的地图,这可能会导致拥挤和大量的相互碰撞,谨慎使用
需求6、极限条件下,0号刚卖然后就解除了自己对这个工作台的抢占,同一帧1号就买同种材料,这是1号极有可能还是指向同一个工作台,所以机器人在卖掉一个物品后除了取消自身对这个工作台的抢占外,还需要将n_each_lack中的原来缺这个物品对应的这个工作台删除! 已完成
需求7、将4副地图的运动控制完全分开,调整起来更方便点
需求8、去机器人与成品和成品到工作台距离最小 的成品为空手机器人的目标,并且是实时检测的