我试图优化图遍历问题,但无法找出解决它的最佳方法。它似乎既不像A *搜索问题(因为我们想要最大化路径而不是最小化它),也不是旅行推销员问题(因为我们不必访问所有城市)。它的简化版本是这样的:
我们有一组节点和连接/边缘。连接是任意的,节点可以有一个或多个。 Connections还具有与之关联的接口/类型,并且接口不能支持多个连接。例如,如果节点A
可以通过接口B
连接到节点C
或alpha
,我们决定将其连接到节点B
,该接口节点A
上的节点无法再支持其他连接,因此C
无法再连接到A
。但是,我们可以将节点C
连接到节点D
,如果它恰好具有相同的alpha
接口。
我还应该提到这些界面的工作方式类似于锁定和密钥,因此A
可以连接到B
或C
,但是B
和{{1无法连接到彼此(界面就像一面镜子)。此外,C
无法再通过A
界面连接任何内容,因为alpha
使用了B
,如果恰好有另一个界面(bravo
)还有其他东西可以连接到bravo
,然后我们可以将多个节点连接到A
。目标是获得最大的连接节点组(丢弃所有较小的组)。
我考虑过一些启发式方法:
以上两条规则可用于优先考虑哪个节点尝试连接到下一个(现在我将它们天真地分组为一个等级 - 可连接节点的总数),但我的直觉告诉我我可以做得更好。此外,我不认为这有利于最佳解决方案。
我试图找出是否可以以某种方式反转启发式以创建A* Search
的变体,以便A *'乐观的启发式成本'规则仍然适用(即启发式成本=丢弃的节点数,但这会打破实际的成本计算 - 因为我们将从除了一个节点之外的所有节点开始)。
我的另一个想法是计算从起始节点到每个节点的距离(中间节点的数量),并使用其平均值作为启发式,目标是连接所有节点。但是,我不保证所有节点都会连接。
修改 这是一个例子
'
版本A
将B
连接到α
,我们就无法再将A
连接到C
,因为{{ 1}}不再有接口A
可用)