最大化遍历节点数的算法

时间:2015-03-31 16:00:18

标签: algorithm dynamic-programming graph-theory longest-path undirected-graph

我试图优化图遍历问题,但无法找出解决它的最佳方法。它似乎既不像A *搜索问题(因为我们想要最大化路径而不是最小化它),也不是旅行推销员问题(因为我们不必访问所有城市)。它的简化版本是这样的:

我们有一组节点和连接/边缘。连接是任意的,节点可以有一个或多个。 Connections还具有与之关联的接口/类型,并且接口不能支持多个连接。例如,如果节点A可以通过接口B连接到节点Calpha,我们决定将其连接到节点B,该接口节点A上的节点无法再支持其他连接,因此C无法再连接到A。但是,我们可以将节点C连接到节点D,如果它恰好具有相同的alpha接口。

我还应该提到这些界面的工作方式类似于锁定和密钥,因此A可以连接到BC,但是B和{{1无法连接到彼此(界面就像一面镜子)。此外,C无法再通过A界面连接任何内容,因为alpha使用了B,如果恰好有另一个界面(bravo)还有其他东西可以连接到bravo,然后我们可以将多个节点连接到A。目标是获得最大的连接节点组(丢弃所有较小的组)。

我考虑过一些启发式方法:

  • 更喜欢具有更多接口的节点(我已经丢弃了没有对的接口)
  • 更喜欢更受欢迎的界面

以上两条规则可用于优先考虑哪个节点尝试连接到下一个(现在我将它们天真地分组为一个等级 - 可连接节点的总数),但我的直觉告诉我我可以做得更好。此外,我不认为这有利于最佳解决方案。

我试图找出是否可以以某种方式反转启发式以创建A* Search的变体,以便A *'乐观的启发式成本'规则仍然适用(即启发式成本=丢弃的节点数,但这会打破实际的成本计算 - 因为我们将从除了一个节点之外的所有节点开始)。

我的另一个想法是计算从起始节点到每个节点的距离(中间节点的数量),并使用其平均值作为启发式,目标是连接所有节点。但是,我不保证所有节点都会连接。

修改 这是一个例子

  • 虚线表示允许(但未激活/已移动)连接
  • 接口不允许连接到名称相同的接口,但可以连接到自身的'版本
  • 界面只能使用一次(如果我们通过AB连接到α,我们就无法再将A连接到C,因为{{ 1}}不再有接口A可用)
  • 节点数是任意的(但在算法执行期间是恒定的),应该假设非常大
  • 每个节点的接口数量至少为1,如果问题更容易,我们可以假设一个上限 - 即3
  • 可能的连接数量只是接口兼容性的一个功能,接口定义了节点可以连接的内容,是否/如何使用该接口由您决定
  • 激活连接的方向/顺序并不重要
  • 目标是生成最大的连接节点集(我们不关心使用的连接数或接口数)。

Example

0 个答案:

没有答案