我有一个“门号”的优先队列。我从优先级队列中得到下一个门号(即对应优先级值最低的门),然后开门。门后,可能有礼物,也可能没有。根据礼物的有无,我更新了这个门号的优先级,并将其放回优先级队列中。然后我重复,让下一个门号码打开,等等。
假设每扇门都有不同的礼物补充率(即有些可能每天都会收到新礼物,有些则根本不会),我应该如何更新优先级值以最大化我找到的礼物数量?也就是说,我想最大化我打开有礼物的门与我打开没有礼物的门的比例。
我应该注意,补货率不能保证随着时间的推移而固定/存在随机变化。但我可以在这里简化假设。
这对我来说几乎像是一个蒙特卡洛问题,除了我越经常探索一个节点(门),它的期望值越低。(当然,没有树要构建;我们只需要计算出 depth-1 节点的值。)
最简单的方法是跟踪最后优先级 (LP) 和当前优先级 (CP),delta = CP - LP。如果我们找到礼物,设置下一个优先级 NP = CP + delta - 1;否则设置 NP = CP + delta + 1。我猜这是可行的,但它的优化似乎相当缓慢。
或者我们可以有一个乘法值:NP = CP + delta * shrink 或 NP = CP + delta * grow,其中 shrink < 1 并且 grow > 1。这就是我目前拥有的,而且几个月来似乎都可以正常工作,但是现在我遇到了一些门被背靠背打开的情况(即打开门 D,找到礼物,放回优先队列,D 现在再次成为最佳选择,当然没有找到礼物,现在放回去在优先级较低的队列中),这似乎很糟糕。作为参考,我使用了收缩 = 0.9 和增长 = 1.3。
是否有一个数学公式(如蒙特卡洛)来表达探索门的最佳方式?