尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

我发现自己写的智能体不如随机搜索 —— 备赛记录(三)

我发现自己写的智能体不如随机搜索 —— 备赛记录(三) 上一篇我写智能体自己找的参数把差距压掉了 85.7%。这一篇要说的是那个 85.7% 站不住而且我一开始的对照本身就不公平。我把这件事从头讲一遍因为我觉得比又进步了更值得写。一、我拿 3 次评估去和 12 次抽样比上一篇的对照表里智能体组和随机组是这样产生的组怎么来的随机组随机采样12个配置取其中最好的一个智能体组模型跑了3次选了其中一轮然后我把这俩放一张表里比。结果是四个实例里有三个随机搜索赢了。C201 上随机采样 1 次就达到了智能体 3 次都没达到的水平。我当时的第一反应是评估次数太少。于是我去查了智能体每个实例到底跑了几次答案是 C101 跑了 20 次、其余三个实例各 3 次。而唯一跑够次数的那个 C101智能体确实打平了随机搜索。看上去结论清楚了不是策略不行是次数不够。二、可是随机搜索追上智能体只要 1 次我决定先把随机搜索到底有多强量出来而不是继续猜。写了个脚本随机采 30 个配置画出最好成绩随评估次数的变化曲线然后看随机搜多少次能追上智能体。结果是这样的实例智能体随机追上它需要智能体实际评了几次C10110 车 / −0.00%约 10 次20 次C2014 车 / 13.01%约 1 次3 次R2015 车 / 27.92%约 3 次3 次RC2016 车 / 25.64%约 3 次3 次这张表把我的解释推翻了。如果只是次数不够随机搜索不可能 1 次就追上。次数少只能解释评估得少解释不了每次评估更差。所以问题不在算力在策略智能体每次都在做局部微调而没有一个能跳到好区域的探索动作。三、更难堪的对照它输给了一套固定参数我还有一组基线是按教科书经典参数调好的固定配置——I1 插入启发式参数来自 Solomon 1987 的原文一个数都不改。下面是上一篇发表的那两个实例同样的 5000ms、5 个种子实例智能体固定经典参数谁赢C10110.0 车 / 3.06%10.4 车 / 2.65%固定参数RC2016.0 车 / 25.64%9.0 车 / −1.49%智能体上一篇我写的是跟人工调参比结果是分层的——这句话其实已经承认了它没赢只是当时的重点在别处我把它放到footnotes里一笔带过。放到四个实例上一看输得更明显实例智能体固定经典参数谁赢C10110.0 车 / 1.22%10.6 车 / 3.37%智能体C2014.0 车 / 6.69%3.0 车 / −0.00%固定参数R2015.0 车 / 8.64%5.0 车 / 19.69%智能体RC2016.0 车 / 21.26%5.0 车 / 10.49%固定参数距离这一层互有胜负但车辆数这一层智能体在四个实例里输了三个。更糟的是这张表我早就跑出来了数字一直躺在那里我却没有去看分组胜负——因为我只关心相对不调参组降了多少而那个数字是 85.7%很好看。四、根因我把标准答案藏在门外复盘下来我认为有三个原因从轻到重。第一个起点太随机。智能体从自己随便猜的一个初始配置出发然后一路小步微调。它从来没试过教科书上那套经典参数那片区域——而那片区域里就有好解。我相当于让它在一片荒地上找东西却没告诉它附近有路。第二个一次只看一个数字。这条是我最没想到的。求解器里有个随机种子。同一个配置、同样的时间预算换一个种子结果可能差很多。我拿 C101 试了种子结果默认种子828.94 / 10 车seed 114 车 / 1241.40都没收敛seed 211 车 / 891.04seed 412 车 / 894.03seed 512 车 / 912.44会话里智能体只看到默认种子这一个数字是 828.94 / 10 车。它以为这是好配置实际情况是这个配置在 5 个种子上的均值是 12.0 车 / 16.68%。也就是说它在拿一次偶然的观测做决策。而我居然在对照表里用 5 个种子的均值去评判它——一边给它单次观测一边用均值考核它。第三个没有会失败的保护。我在项目说明里写过各种异常都会被记录并如实报出但实际上模型如果报了个不存在的数字我这边没有任何东西会去核对。直到那天我写了个脚本拿日志里的配置重跑内核、和模型自述的指标逐条比对才发现这个校验是必要的。五、我改了三处第一处让底座把文献先验交给模型。以前我只给了模型实例长什么样客户数、时间窗紧度、容量比。现在我把各构造策略的经典参数连同出处一起给它让它自己决定用不用、怎么改。分工是这样底座负责把已知的东西给出来模型负责决定怎么用。内核依然一个默认值都不给——那条红线没破。改完第一次跑模型的开局就变成了i1文献先验起点基线参数正是 α10.7 / α20.3 / λ0.3 / μ0.2。第二处让模型看见方差。我给求解工具加了一个多种子评估参数。现在模型每轮至少用 3 个种子求解工具会返回每次的结果和均值、极值汇总。效果是直接可见的。模型开始在决策记录里写3 个种子全部 759.724 辆车极稳定max-min0convergedtrue它开始按稳定好而不是偶然好来挑配置。有一次它试了另一个构造策略发现明显更差就退回来了——这在以前不会发生因为以前它没有方差这个概念。第三处给自己加两个会自己报警的工具。一个核对模型的自我陈述拿配置重跑内核覆盖模型报的数字一个核对手写文档和实验数据是否一致。第二个工具第一次运行就抓到17 处数字失配——我手抄进项目说明的那些数字早就跟上实验重跑脱节了而没有任何东西会告诉我。六、现在的数据同样四个实例同样 5000ms 预算同样 5 个种子实例不调参固定经典参数智能体改进后已知最优C10120.8 车 / 131.78%10.6 车 / 3.37%10 车 / 1.22%10 车 / 828.94C20115.0 车 / 217.88%3.0 车 / −0.00%4.0 车 / 6.69%3 车 / 591.56R20115.0 车 / 54.27%5.0 车 / 19.69%5.0 车 /8.64%4 车 / 1252.37RC20115.0 车 / 74.72%5.0 车 / 10.49%6.0 车 / 21.26%4 车 / 1406.94相对不调参距离差距降低 92.1%用车数从比最优多 11.2 降到多 1.0相对固定经典参数距离已经基本持平9.45% vs 8.39%但用车数还落后1.0 vs 0.6最好的一例C101两个指标都追平了已知最优同一张表在改进前是C101 3.06%、C201 13.01%、R201 27.92%、RC201 25.64%。 改进最大的其实不是 C101——它在改进前就很好是R201 从 27.92% 降到 8.64% 车辆数从 6 辆降到 5 辆。多种子评估带来的稳健性提升在这一例上体现得最清楚。七、还没解决的有三件事我没做成写在这儿比较合适。第一车辆数这一层还是最弱的。四个实例里只有 C101 达到了已知最优的车辆数。随机搜索采样 30 次在车辆数这一层也优于我的智能体。第二我给模型准备了一个能减车的算子它一次都没用过。那个算子叫route-elimination——把一整条路线拆掉把客户全塞回其他路线车辆数可能减 1。它是我们代码里唯一能减少车辆数的算子。我用各种方式提示模型把算子目录连同这是唯一能减车的算子一起给它在提示词里写成硬性要求车辆数比最优多就必须试一次甚至把触发条件绑到具体数字上。连续五轮、42 次评估它一次都没选。我不知道这是模型的判断问题还是理解问题。但我决定不再想办法让它用了——如实写出来更有价值能力给了不等于会用这本身就是一条结论。第三配置几乎不能跨实例复用。我把为实例 A 选出的配置原封不动搬到实例 B 上跑12 次迁移里只有 1 次不劣于 B 自己的配置。这划定了这套方法的正确定位它不是一次调参到处用而是把每一次调参自动化。目标是把每一次调参的边际成本降下来不是消除调参。八、一句话总结上一篇那个 85.7% 不是假的但它是真的因为一个不公平的对照。我这几天做的最有价值的事不是把数字从 85.7% 变成 92.1%而是发现自己的对照不成立然后把它推翻重来。顺便说一句我一开始怀疑结果不可复现是因为用了挂钟时间预算——听起来很合理也和设计文档对得上。但我把种子逐个跑了一遍才发现不是。理论听起来自洽不等于它是原因。
返回列表