我正在开发一个Javascript游戏,人们可以在这里创建输送线。想象一下邮政服务,包裹进来,旅行输送机,加工和卡车结束。这些输送机可以是任何复杂的,可以包含环路等。
相当复杂(且效率低)的输送机的示例 Example conveyor with bad graphics
输送机示例图: Conveyor example
圆圈中的数字表示当前情况 - 该传送带上的包裹数量“部分”。
规则:
问题:
如何通过两个步骤快速解决这样的图表:
生成必要的数据结构/图形(缓存)(性能:< 200ms,1000个元素)。实际上,如果在下次行程计算行程计算之前设置发生变化,则只需要重新计算。
计算包裹旅行。 (性能:< 20ms,1000个元素)
一些有问题的解决方案
选项A:解决每个组件。 (for循环每个组件并根据当前情况求解)不起作用,因为循环,连接,合并会导致它不会根据需要均匀地移动包。它也不遵守规则,“包”只能从一个组件传送到另一个组件。基于循环次序,可能是包立即结束)。此外,它可能始终只选择一个输入,另一个将始终被阻止。
选项B:计算每个组件他们想要做什么并发现冲突。 (例如A和B想要推送到C 10包EACH,但C总共只能接受12个。修复错误,所以A和B都只能移动6个,这意味着它们的库存至少每个4个下一个滴答这可能会导致更多的错误,因为A和B没有清除他们的内容,他们可以接受更少的错误)。现在找到更多错误并修复。重复直到没有错误或“达到最大重复次数”并且只是快速修复错误=这样它实际上根据规则不能按预期工作。 问题是,我认为它会因某些设置而陷入困境而且可能会中断。
选项C:从OUT元素开始并尝试移出包。如果引入循环或没有OUT元素的区域会出现问题。
判决
我被困住了,甚至不知道谷歌是为了什么,所以欢迎所有的想法:) 我认为这是一个图形问题,但也许还有其他方法。
答案 0 :(得分:0)
只要您不需要问题的最佳解决方案,我认为您可以:
1. At the beginning, use a topological sort order of the graph, and "tag"
each node with its position in that order so you have a criteria as to
which node is better than others. The final node has the maximum "tag"
(check link to learn more about topological sort, not hard)
2. Mark all nodes as not visited
3. Get the *node A* with max(tag) still not visited:
3.a. Get each *node B* that is a target from *node A*
(i.e. at the end of the arrow) starting from the one with maximum tag
and finishing with the one with minimum tag:
3.a.a. push all packages from *node A* to *node B* until it is filled or
*node A* is empty.
您可以在https://en.wikipedia.org/wiki/Topological_sorting
中找到拓扑排序定义和一堆算法祝你好运:)