我试图找到最佳算法,以尽可能降低成本为多个目标分配元素。
要激活目标(大写),您需要使用colour theory logic 1或2个特定元素(小写):
将问题视为必须使用一次性密钥打开的门。 所有门必须用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个键,因此无法成为最终解决方案的一部分)
在以下情况下,这可能是找到较低成本组合的最佳方式:
我在代码的另一部分使用A *,并且我已经针对此提议进行了调整,但我认为它不够有效(我需要使用此算法数千个时间解决迷宫)。我还探索了另一个combinational optimization solutions,但我不确定要使用的是谁。
任何帮助或方向将不胜感激。 谢谢!
答案 0 :(得分:0)
我提高速度的第一个尝试是坚持你已经拥有的分支和绑定解决方案(你的A *)。
与国际象棋或国际象棋相比,这个问题可以用蛮力的方式解决。搜索树中的节点数量足够小,您可以将它们全部保存在内存中。
因此,我的第一次尝试是向您的A *添加一个转置表,它存储已找到的节点值。
我曾写过一个程序来解决游戏(兔子抨击)。如果没有换位表,需要花费10秒来解决。使用换位表,它在35毫秒内完成。
然后,可能会添加修剪技术(alpha beta,mayhaps)。
此外,它可能会加速用在树上运行的搜索算法替换A *(在图上运行)。