以较低成本将元素分配给多个目标的最佳方法是什么?

时间:2015-01-21 14:05:10

标签: algorithm colors combinations pseudocode

我试图找到最佳算法,以尽可能降低成本为多个目标分配元素。

要激活目标(大写),您需要使用colour theory logic 1或2个特定元素(小写):

  • 黄色需要:黄色
  • 蓝色需要:蓝色
  • RED需要:红色
  • 绿色需要:绿色或黄色+蓝色
  • ORANGE需要:橙色或黄色+红色
  • 紫罗兰需要:紫罗兰色或红色+蓝色

将问题视为必须使用一次性密钥打开的门。 所有门必须用1个相同颜色的钥匙或2个原色钥匙打开。钥匙在迷宫中,费用是从门到门的距离。

一旦你有一个包含所有可能组合的数组(非常简单的例子)并应用算法,你就有了这个:

//Doors: G (GREEN), B (BLUE), Y (YELLOW)
//Keys: b, (blue), y (yellow), g (green)
Input:
    [{Door: G,  Keys: [b,y], cost: 1},
     {Door: G,  Keys: [g],   cost: 10},
     {Door: B,  Keys: [b],   cost: 5},
     {Door: Y,  Keys: [y],   cost: 3}]

Output:
    [{Door: G,  Keys: [g],   cost: 10},
     {Door: B,  Keys: [b],   cost: 5},
     {Door: Y,  Keys: [y],   cost: 3}]
    Total cost: 18

(请注意,即使用蓝色+黄色键打开绿色门也会降低成本(1),它使用其他门所需的2个键,因此无法成为最终解决方案的一部分)

在以下情况下,这可能是找到较低成本组合的最佳方式:

  • 所有门需要1或2个成功的关键
  • 无需使用所有密钥
  • 密钥只能使用一次

我在代码的另一部分使用A *,并且我已经针对此提议进行了调整,但我认为它不够有效(我需要使用此算法数千个时间解决迷宫)。我还探索了另一个combinational optimization solutions,但我不确定要使用的是谁。

任何帮助或方向将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:0)

我提高速度的第一个尝试是坚持你已经拥有的分支和绑定解决方案(你的A *)。

与国际象棋或国际象棋相比,这个问题可以用蛮力的方式解决。搜索树中的节点数量足够小,您可以将它们全部保存在内存中。

因此,我的第一次尝试是向您的A *添加一个转置表,它存储已找到的节点值。

我曾写过一个程序来解决游戏(兔子抨击)。如果没有换位表,需要花费10秒来解决。使用换位表,它在35毫秒内完成。

然后,可能会添加修剪技术(alpha beta,mayhaps)。

此外,它可能会加速用在树上运行的搜索算法替换A *(在图上运行)。