5

我有一个问题,我在 c# 中有一个事件发布者,为一群订阅者提供全局资源。该资源是一种竞争商品,因此可能无法满足所有消费者的需求。

想象的模型是到达市场的一批原料。许多厨师正在等待每种食材,并且必须在每种食材上菜时决定是否购买其中的一些。厨师们同意每个人都应该对每种成分都有机会,而且他们不希望为每种食物争分夺秒,因此他们决定应该存在某种优先级系统。

1)这种场景有名字吗?

2)以公平的方式实现这一点的好方法是什么,所以每个订阅者都有平等的机会获得成分?请记住,是否请求资源的决定取决于订阅者。

3) 请注意,优先级不需要固定的优先级。如果您在每次活动前掷骰子,则每次都可以创建一个订单。您也可以预先计算这一点。这种解决方案有什么缺点吗?

无论如何,这不是一个家庭作业问题。只是想知道是否有人已经看到了这一点,或者是否能够将通用解决方案转换为解决此问题的形式。

4

3 回答 3

2

听起来像是某种草案系统。在某个预定的顺序中,所有订阅者都被赋予接受或拒绝资源的权利,直到资源被充分利用。诀窍是如何确定该顺序。

如果这是我的项目,我想我会从简单的开始。从第一个订阅的订阅者开始,然后按该顺序浏览列表,直到资源被充分利用。然后,随着额外资源的可用,第一个没有选择权的订阅者(因为您的资源用完了)获得了优先拒绝权,并从那里继续。当你到达终点时,循环回到起点。当有很多批次的资源时,这是一个很好的模型,只是每个批次都不够。厨师的配料模型可以很好地配合这个系统;当天第一个出现的厨师将获得第一人选,以此类推,如果厨师被排除在外,不用担心,他会在下一批中获得机会。

另一种可能的方法是顺序无关的。询问所有订阅者是否需要特定资源。如果想要它的人多于可用资源,则将所有订阅者的名字放入帽子中并选择其中 X 个;他们得到资源。那些没有获得资源的人会保留他们的名字,从而给他们额外的机会获得下一个资源。当批量资源很小并且大多数或全部资源都非常需要时,这是更好的模型,以避免最后一个订阅者必须永远等待以获得好的机会。魔兽世界的战利品系统可能有点像这样(简化了所有党员“选择加入”每个项目;我不玩魔兽世界,所以我从未见过战利品系统工作)。

于 2012-08-28T16:19:12.857 回答
2

1)这种场景有名字吗?

是的,它被称为循环(如果我理解正确的话)

2) 以公平的方式实现这一点的好方法是什么,所以每个订阅者都有平等的机会获得成分?

系统越复杂,您应该越容易制定解决方案,KISS在这里工作得非常好。实现循环算法。

3) 请注意,优先级不需要固定的优先级。如果您在每次活动前掷骰子,则每次都可以创建一个订单。您也可以重新计算。这种解决方案有什么缺点吗?

这个问题在大型可扩展系统和网络中已经存在多年(例如,请参阅此线程)。人们尝试了很多事情,但除非您真的知道自己在做什么,否则请使用简单的一次性策略。

Round robin 不是完美的,肯定有它自己的缺点,但它也是最简单的解决方案。

于 2012-08-28T16:23:45.393 回答
1

1> 我不确定这个场景是否有名字

2> 公平是非常主观的。您需要有一个优化标准才能获得最佳解决方案。你说每个订阅者都有平等的机会获得成分。然后你只需要一个统一的随机变量来决定哪个应该得到它。

但你也说过厨师可能不想要一种特定的成分。因此,只有那些想要当前成分的厨师才需要考虑。因此,您需要进行加权分配,以考虑所有想要当前食材的厨师之间的公平性。

这可以按如下方式完成

假设有 X 个厨师

所有厨师都从零开始。

每次厨师获得资源时,他都会获得 X 分。所有未获得资源的厨师都将获得 -1 分。因此,积分越高,您在近期历史中获得的资源就越多。理想情况下,资源应该分配给得分最少的人。

当您在最少点上有多人时,只需使用随机均匀分布选择一个。这在某种意义上是公平的。

另一种选择是仍然允许所有厨师获取资源,但使用现在根据需要资源的厨师的积分总和计算的分布。这使其随机分配由想要资源的厨师和他们当前获取资源的历史决定。

于 2012-08-28T16:27:39.397 回答