复杂的输送机容量计算(图表) - 有趣的游戏算法

时间:2015-12-15 23:09:44

标签: algorithm graph graph-algorithm

我正在开发一个Javascript游戏,人们可以在这里创建输送线。想象一下邮政服务,包裹进来,旅行输送机,加工和卡车结束。这些输送机可以是任何复杂的,可以包含环路等。

相当复杂(且效率低)的输送机的示例 Example conveyor with bad graphics

Example conveyor with bad graphics

输送机示例图: Conveyor example

Conveyor example

圆圈中的数字表示当前情况 - 该传送带上的包裹数量“部分”。

规则:

  • IN组件生成放入皮带组件的邮政包裹。
  • 皮带组件将邮政包裹推送到OUT组件。 OUT从图表中删除包。
  • 每个组件都具有可在任何给定时刻保持的最大容量。
  • 可以有0..N IN组件。 (如果为0,传送带上已有包装)
  • 可以有0..N OUT组件。 (如果为0,表示整个输送机将满载)
  • 计算是基于刻度的,这意味着“包裹组”一次只能走一步。
  • 每个合并均匀分配包。 (所以,如果两个出线,那么每个得到包/ 2)
  • 每个加入均匀接受包。 (因此,如果有两条输入线,每条输入线可以提供最大最大值/ 2个包裹。)
  • 包裹没有身份,它们只是总数。
  • 可以拆分包,因此1个包可以成为0.5和0.5包。 (所以浮动数字类型)

问题:

如何通过两个步骤快速解决这样的图表:

  1. 生成必要的数据结构/图形(缓存)(性能:< 200ms,1000个元素)。实际上,如果在下次行程计算行程计算之前设置发生变化,则只需要重新计算。

  2. 计算包裹旅行。 (性能:< 20ms,1000个元素)

  3. 一些有问题的解决方案

    选项A:解决每个组件。 (for循环每个组件并根据当前情况求解)不起作用,因为循环,连接,合并会导致它不会根据需要均匀地移动包。它也不遵守规则,“包”只能从一个组件传送到另一个组件。基于循环次序,可能是包立即结束)。此外,它可能始终只选择一个输入,另一个将始终被阻止。

    选项B:计算每个组件他们想要做什么并发现冲突。 (例如A和B想要推送到C 10包EACH,但C总共只能接受12个。修复错误,所以A和B都只能移动6个,这意味着它们的库存至少每个4个下一个滴答这可能会导致更多的错误,因为A和B没有清除他们的内容,他们可以接受更少的错误)。现在找到更多错误并修复。重复直到没有错误或“达到最大重复次数”并且只是快速修复错误=这样它实际上根据规则不能按预期工作。 问题是,我认为它会因某些设置而陷入困境而且可能会中断。

    选项C:从OUT元素开始并尝试移出包。如果引入循环或没有OUT元素的区域会出现问题。

    判决

    我被困住了,甚至不知道谷歌是为了什么,所以欢迎所有的想法:) 我认为这是一个图形问题,但也许还有其他方法。

1 个答案:

答案 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

中找到拓扑排序定义和一堆算法

祝你好运:)