我在帮助一个朋友,给他写一个程序。他正在重新录制旧卢卡斯艺术比赛平手的配乐游戏使用了iMuse系统——每个“音轨”都由一些小的音频提示组成游戏将这些结合起来,形成了一个动态的配乐,随着形势的变化而变化。
对于每个“音轨”,都有一组规则来控制下一个音轨的移动方向。这是一个随机因素,例如:
成功提示
成功-01移动到成功-02
suc-02移动到suc-03或suc-04
suc-03移动到suc-01或suc-04
成功-04移动到成功-05
SUC-05移动到SUC-01、SUC-06或SUC-08
suc-06移动到suc-04或suc-07
suc-07移动到suc-01或suc-02或suc-04或suc-08
成功-08移动到成功-02或成功-06
成功移动到成功-01
像这样的曲目还有很多,还有更多的线索。本质上,每条轨迹都是由相互连接的节点组成的网格。他希望程序分析提示,并为每个曲目创建满足两个条件的播放列表:
一条赛道上的所有线索都被使用
线索的重复性很小
我对算法的经验很少,所以我不确定哪种算法适合这个问题。从我周围的阅读来看,可能是某种旅行推销员的类型。
另外,如果有人能告诉我一些可能有用的代码示例(考虑到我对这类问题的普遍无知),我将非常感激。

最佳答案

我建议你尝试一个简单的基于呼吸优先搜索的蛮力启发式解决方案:
在每一级的搜索“priorizie”提示不属于当前解决方案的一部分。数一数你的解决方案中唯一的提示数(这可能很难,但也不是那么难:只要记住你从一开始到现在的提示链,你就有了你需要的所有信息),一旦你找到一个使用所有提示的解决方案,就立即终止(那应该是安静的最小值)。
这个“算法”远不是完美的或性能良好的,但是除非你有一个由数千个线索组成的轨迹,否则应该没有问题。
注意,如果你的轨迹列表包含了从你的开始提示无法到达的提示,那么这个“算法”将被捕获在一个无限循环中使用计数器终止,例如,如果搜索结果的提示数超过10倍,或类似的情况。
我没有delphi代码,但应该不难找到一个呼吸优先搜索。

07-28 00:39