哪种算法适用于此?遍历一系列互连的节点,以最小的重复次数覆盖它们

时间:2011-03-04 17:59:21

标签: algorithm delphi traversal

我正在帮朋友,给他写一个程序。他正在为旧的Lucasarts游戏Tie Fighter重新录制配乐。该游戏使用了iMuse系统 - 每个'轨道'都由许多小音频提示组成。游戏结合起来制作了一个随着情况而变化的动态配乐。

对于每个“轨道”,有一组规则可以控制哪个提示移动到下一个。这有一个随机元素,例如:

SUCC CUES
SUCC-01转移到SUCC-02
SUCC-02转移到SUCC-03或SUCC-04
SUCC-03转移到SUCC-01或SUCC-04
SUCC-04转移到SUCC-05
SUCC-05移至SUCC-01或SUCC-06或SUCC-08
SUCC-06转移到SUCC-04或SUCC-07
SUCC-07转移到SUCC-01或SUCC-02或SUCC-04或SUCC-08
SUCC-08转移到SUCC-02或SUCC-06
SUCC-IN转移到SUCC-01

还有很多其他类似的曲目,还有更多的提示。基本上每个轨道都是互连节点的网格。他希望程序解析提示并为满足2个条件的每个轨道创建播放列表:

  • 使用轨道中的所有提示
  • 提示的重复次数最少

我对算法的经验很少,所以我不确定哪种算法适合这个问题。从阅读中我猜是某种旅行推销员类型。

此外,如果有人能指出我可能会有帮助的代码示例(请记住我对这类问题的普遍忽视),我们将非常感激。

1 个答案:

答案 0 :(得分:1)

我建议您尝试一种基于先呼吸搜索的简单的强力启发式解决方案:

在搜索“优先级”提示的每个级别上,这些提示不属于当前解决方案的一部分。计算解决方案中唯一的提示数量(这可能很棘手,但并不难:只记住你来自的线索链(从开头到当前的提示)并且你拥有所需的所有信息)并终止一旦找到使用所有提示的解决方案(它应该是安静的,那么)。

这种“算法”远非完美或高效,但除非你有数千个线索构建的轨道,否则应该没问题。

请注意,如果您的曲目列表包含无法从您的开始提示访问的提示,则此“算法”将陷入无限循环。使用计数器终止,例如如果您的搜索结果超过了提示数量的十倍或类似的话。

我没有delphi代码,但找到一个用于先呼吸搜索的代码并不难。