先交作业(可以直接滑倒最底下看,现在是16%,感觉还挺稳的)。第二个厨师也可以换金平铲达浪,配翡翠鸡肉卷、莓果和麦片鱿鱼圈,差不了几分。
先前在论坛里分享了自己的一个宴会自动计算器,得到了大家好评,好开心
使用说明在上面的链接里面有,也会不断更新。@黑翼之龙 也写了一个很不错的版本 https://www.taptap.cn/moment/366998323346802144
在这个链接里面提到说,因为迭代次数有限,不能得到最优解,评论里面也有问怎么增加迭代次数。那么问题来了,迭代次数越高,就越容易得到最优解吗?
这个问题的答案并不简单。实际上,按照目前算法,即使无穷无尽地迭代下去,也永远无法保证得到最优解。(这也是宴会和厨神令人着迷的地方😄)
另外,单单增加迭代次数,也不见得就更容易得到最优解(有点ai调参数的感觉),只能说迭代次数太低的时候不大容易找到最优解。以下面这张图为例,橙色的线是找到的配置(也就是三个厨师九个菜)的分数随迭代次数变化的曲线,而蓝色的线是温度随迭代次数变化的曲线。可以看到,在这张图里,当迭代次数到2500以上之后,找到的分数就没有变化了。
要想理解这背后的道理,就需要了解一下"模拟退火"到底在干什么。每一次迭代的时候,就在当前的配置基础上进行一点改动(比如换一个菜/交换两个菜顺序/给厨神换个厨具等等)。每一步会根据当前的温度和新配置的分数来决定是否接受这个新配置:新的分数越高、温度越高,也就越容易接受这个新配置。新的分数如果比原来的还低,而且温度也不大高,那这一次迭代就更有可能不接受这个新配置。
听起来很复杂,但总结一下,就是说,温度比较高的时候很高概率"来者不拒"、比较低的时候很高概率"挑三拣四",只接受更好的解。而温度是随着迭代次数不断下降的。
那为什么最后会得到一个比较好的解呢?首先,如果是正常营业时,一直"挑三拣四"可以得到最优解,但在宴会/厨神的复杂机制下,这保证最后我随便换一个菜都会比当前分数低(这种情况叫做"局部最优"),但我们不知道如果同时换两个菜会怎样。如果想要跳出局部最优,即使是看起来比较差的配置我也要试试,所以需要有一定概率"来者不拒",期待在此之后可以柳暗花明。而我们最后总归是想得到比较好的解的,一直"来者不拒",什么牛鬼蛇神就都来了,分数也不好,所以越往后"挑三拣四"的概率就要越大。这样一轮就完成了一次模拟退火。
总结一下,一次迭代就是提出一个新的配置,根据这个配置的分数选他/拒绝,一次模拟退火就是迭代很多次。
在我的程序中,厨师和菜谱是分开的(因为厨师一变,菜谱可能有很大改动,之前积累的优势可能就荡然无存),也就是说,我的一次就是提出一个新的厨师配置,然后根据这个配置的分数选他/拒绝。可是光有厨师没有菜,怎么知道分数呢?于是我每一个厨师配置都再固定这三个厨师,对9个菜进行一次模拟退火,得到一个对这三个厨师的分数上限估计值。
说了这么多,还是没有解答"到底怎样才能更容易得到最优解"这个问题。其实,我也不是特别清楚,感觉这就有点像人工智能里面参数的选取,像炼丹一样玄乎。有心的朋友可能注意到我把T_MAX(起始温度)从原先的500改成了20000,也就是说在一开始更容易"来者不拒"。这么设置仅仅只是因为我看到网上说一般一开始"来者不拒",可能有一定道理,但我并没有看到结果明显变好了。另外,增加迭代次数仅仅只是让最后"挑三拣四"多挑了一会儿,对于跳出局部最优其实帮助也不大,但更可能找到一个局部最优。或者如果有兴趣的朋友还可以下载到自己电脑上多试几次、观察图像、改这条蓝线(也就是退火速率,决定了温度随着迭代次数是怎么下降的),可能有用,这里就不再赘述了。
最后,希望有大佬可以帮忙看看怎么从图鉴网自动生成宴会规则,或者看看可不可以在windows上正常运行更加方便🥺
以及!选更新的时候不要选错方向了🥺虽然有自动关闭pr的机器人但是我github会给我连发三封邮件,还以为有人提pr了,白高兴一场
(为什么更新了TapTap就不能发长文啊,好难受啊)