小网格中节点的最佳布局,其中节点输出是与其相邻的节点的函数

时间:2013-04-24 17:46:37

标签: algorithm graph-theory graph-algorithm mathematical-optimization

通用目标

假设我们有一个“小”10x10网格,其中一些固定节点@位于随机位置

. . . . . . . . . . 
. . . . . . . . . . 
. . . @ . . . . . . 
. . . @ . . . . . . 
. . . . . . . . . . 
. . . . . @ . . . . 
. . . . . . . . . . 
. . . . . . . @ . . 
. . . . . . . . . . 
. . . . . . . . . . 

并说我们有~30个节点,其值是它所邻接的节点的函数(邻接被定义为一个点周围的8个点中的任何一个)。也就是说,如果我们考虑放置在地图上的节点A和B

. . . . . . . . . .     . . . . . . . . . . 
. . . . . . . . . .     . . . . . . . . . . 
. . A @ . . B . . .     . . A @ . . . . . . 
. . . @ . . . . . .     . B . @ . . . . . . 
. . . . . . . . . .     . . . . . . . . . . 
. . . . . @ . . . .     . . . . . @ . . . . 
. . . . . . . . . .     . . . . . . . . . . 
. . . . . . . @ . .     . . . . . . . @ . . 
. . . . . . . . . .     . . . . . . . . . . 
. . . . . . . . . .     . . . . . . . . . . 

这两个地图中A和B的输出可能不同,因为A和B在第二个地图中相邻但在第一个地图中不相同。

我们的目标是将所有节点放置在地图上,使得所有节点的总和最大(或至少非常好)。

针对我的特定问题的其他限制

  1. 大约有8个“类”节点。每个类中的所有节点的行为都相同,因此可以用来减少搜索空间。
  2. 某些节点支配整体价值,因此了解这一点可以让我围绕这些核心节点进行优化。
  3. 每个节点通常只有两到三个其他类节点,当它们与这些类的节点相邻时,会增加它的值。
  4. 所有值均≥0。
  5. 我想在几秒钟内找到合适的位置..所以有一些计算空间,但是在5秒内一个非常好的解决方案比2天内的完美解决方案更好。
  6. 天真的贪婪方法

    我现在正在做的是采用简单的贪婪方法,然后对结果进行微调。

    我查看网格上的所有位置并考虑我尚未放置的所有节点,并选择我找到的最佳位置。如果有多个“最佳”位置,我会随机选择一个。我这样做直到放置了所有节点。

    在这个初始过程之后,我随机选择一个节点,并通过查看所有开放点来尝试找到一个更好的位置。我认为移动节点对节点本身以及它的相邻邻居有影响,所以如果它已经处于最佳位置,我就不会移动它。我做了几千次来“微调”我的布局。

    由于随机因素,在输入相同的情况下,我可以获得非常不同的输出,因此我会多次执行此过程并获得最佳结果。

    问题

    我怎么能比这种天真的贪婪方法做得更好?

    我觉得应该有一个更好的解决方案,考虑到先验邻接信息,但它是在逃避我。任何想法,链接或提示将不胜感激!

1 个答案:

答案 0 :(得分:0)

我最近在研究类似的算法。

想法:

我们想限制我们的选项以获得计算时间(这是我的问题,因为我已经用3D完成了它)

在您的情况下,您希望将节点放在已放置的节点旁边似乎是合乎逻辑的。 让我们来看看可能性。

. p . . . . .
p @ p p . . .
. p p @ p . .
. p @ p . . .
. p p . . . .
p @ @ p . p .
p p p . p @ p

<强>初始化

让我们将“Cluster”称为包含可能位置的数组。 这是所有p

的数组

对于您需要放置的每个节点,您可以在这些节点中找到最佳选项; 因此,对于每个新节点,您都会获得类似Node::( place&amp; value)

的内容

<强>迭代:

您放置了最佳节点,这将删除群集中的一种可能性并添加一些(取决于已经存在的节点)

现在您要更新最佳位置&amp;每个节点的值。 但是你可以在少数修改过的节点上工作,因为已经计算了所有其他的可能性:

. p . . . . .  A : recently placed
p @ p p . . .  C : new possibilities / possible changes
. p p @ p . .
. p @ p . . .
. C A C . . .
p @ @ p . p .
p p p . p @ p

这里举例说明,每个节点只需要进行2次计算。 如果新值更大=&gt;改变(价值和位置)

迭代。

错误的可能性:

我不知道这是否能完全解决您的问题,因为我无法知道是否需要先放置一个“更大”的值,但我想是的。

这个解决方案不是最完美的解决方案,但如果你的数值与周围孔隙的数量呈线性或几乎呈线性关系,那么这个解决方案应该是正确的。

我无法用英语找到一种说法,但在法语中我称这种算法为“前进算法算法”,类似于“前进算法”。 也许你可以找到基于此的东西,但我没有经过快速搜索。

我希望它对你有帮助。