为猴子选择梯子时,其中的一个策略是选择距离起点最近的猴子速度最大的梯子。我以为这个方案吞吐率会很高,但实际运行时,在最后时刻经常出现这种情况:
如图,梯子1,2,3明明都是空的,但后上梯子的猴子还是只选择梯子0.实际观察会发现,在等待梯子1上所有猴子过河的过程中,吞吐率会有比较大的下降。(gui上显式的是实时吞吐率)
思考之后我发现,可能是因为这些猴子在生成后,立刻进行选择梯子的操作,当时梯子0的指标比较优越,就导致这一批猴子全部选中了梯子0.而由于猴子生成和过河之间隔了较长的一段时间,导致等到这批猴子过河的时候全部集中选择梯子0.
很明显,这不是我们想要的结果。为了提高吞吐率,我们希望猴子尽可能均匀地分布在所有梯子上。由此,我在上述方案的基础上进行了改进。在每个猴子选中一个梯子后,将其添加到该梯子的等待列表上,在其在梯子上前进一次之后,将其从梯子的等待列表移除。而在选择梯子时,若要选中一个梯子,需要满足一下三个条件:
- 梯子方向与该猴子方向相同
- 该梯子距离起点最近的猴子速度最大
- 该梯子等待列表中的猴子个数不超过k(自己设定)
如果没有满足条件的梯子,则该猴子在岸上等待,1s后重新进行一次选择。
改进的方案能够比改进前的方案取得更高的吞吐率