假设您有一组节点。一些节点是生产者,一些是消费者,一些是路由器。每个节点都有一个最大吞吐量,它定义了它每天可以接受的最大单位数,以及它每天可以发送的最大单位数(在这种情况下,接受和发送不会相互干扰)。每个节点还具有单元的存储容量,允许它们处理流量的变化。此外,每个节点只能与最多8个附近节点(在一个平面上)外连接,并且相同的限制适用于连接中。
我已经有了一个启发式算法,给定一个图表,枚举节点并完成一个足够好的工作,将单元推送到后续节点。它枚举每个节点,向每个目标节点发送max(ceil(剩余可发送单元/剩余跟随节点),剩余可接收单元接收器)。
现在我需要一种方法来自动查看节点,并确定图形拓扑应该是什么,以便获得足够好的流量。我的基本想法是为每个节点分配一个“责任”,最初相当于他们消耗了多少单位。然后从n1到n2添加一条边将给n1一些责任。但我很快发现,节点可以消耗的数量与节点可以接受的数量之间的差异使算法混淆并引导我进入圈内。
修改的 每个生产者/消费者消耗的数量可以随时间变化(低于某个最大值),并且可以添加或删除节点。
任何简单的想法?
答案 0 :(得分:0)
如果您正在寻找一种“稳态”解决方案,即每天在给定边缘发生相同流量的解决方案,那么节点上就不会有任何“储存”资源(因为这意味着每个库存继续以稳定的速度增长,最终变得无限大。)
因此,在这种情况下,我们可以忘记每个节点的存储容量,问题与Maximum Flow problem非常相似,{{3}}可以在多项式时间内完全解决 太难了。维基百科链接提出了各种算法 - 我建议从福特 - 富尔克森开始,这不太难实现(其他可能更容易,但我自己没有实现)。
要将您的问题实际转变为Max Flow问题,您需要做的一件事是:Max Flow处理流跨边的约束,而不是节点 / em>的。要将“节点吞吐量”约束转换为“边缘吞吐量”约束,只需将每个节点转换为一行链接的3个节点(1 - > 2 - > 3),节点1和2之间的边缘容量等于节点的“输入容量”,以及节点2和3之间的边缘,其容量等于节点的“输出容量”。然后确保节点的所有输入都连接到节点1,并且所有输出都连接到节点3.
正如我所说,这将为您提供“稳态”解决方案。 可能可能通过预先指定天数并利用存储容量,您可以设计一种策略,在该天数内为您提供更多吞吐量,尽管我怀疑有人比我自己聪明可以证明即使这是不可能的。在任何情况下,如果您希望每天每个边缘都有相同的流量,那么您无法比Max Flow解决方案做得更好。