通用目标
假设我们有一个“小”10x10网格,其中一些固定节点@位于随机位置
. . . . . . . . . .
. . . . . . . . . .
. . . @ . . . . . .
. . . @ . . . . . .
. . . . . . . . . .
. . . . . @ . . . .
. . . . . . . . . .
. . . . . . . @ . .
. . . . . . . . . .
. . . . . . . . . .
并说我们有~30个节点,其值是它所邻接的节点的函数(邻接被定义为一个点周围的8个点中的任何一个)。也就是说,如果我们考虑放置在地图上的节点A和B
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . A @ . . B . . . . . A @ . . . . . .
. . . @ . . . . . . . B . @ . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . @ . . . . . . . . . @ . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . @ . . . . . . . . . @ . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
这两个地图中A和B的输出可能不同,因为A和B在第二个地图中相邻但在第一个地图中不相同。
我们的目标是将所有节点放置在地图上,使得所有节点的总和最大(或至少非常好)。
针对我的特定问题的其他限制
天真的贪婪方法
我现在正在做的是采用简单的贪婪方法,然后对结果进行微调。
我查看网格上的所有位置并考虑我尚未放置的所有节点,并选择我找到的最佳位置。如果有多个“最佳”位置,我会随机选择一个。我这样做直到放置了所有节点。
在这个初始过程之后,我随机选择一个节点,并通过查看所有开放点来尝试找到一个更好的位置。我认为移动节点对节点本身以及它的相邻邻居有影响,所以如果它已经处于最佳位置,我就不会移动它。我做了几千次来“微调”我的布局。
由于随机因素,在输入相同的情况下,我可以获得非常不同的输出,因此我会多次执行此过程并获得最佳结果。
问题
我怎么能比这种天真的贪婪方法做得更好?
我觉得应该有一个更好的解决方案,考虑到先验邻接信息,但它是在逃避我。任何想法,链接或提示将不胜感激!
答案 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;改变(价值和位置)
迭代。
错误的可能性:
我不知道这是否能完全解决您的问题,因为我无法知道是否需要先放置一个“更大”的值,但我想是的。
这个解决方案不是最完美的解决方案,但如果你的数值与周围孔隙的数量呈线性或几乎呈线性关系,那么这个解决方案应该是正确的。
我无法用英语找到一种说法,但在法语中我称这种算法为“前进算法算法”,类似于“前进算法”。 也许你可以找到基于此的东西,但我没有经过快速搜索。
我希望它对你有帮助。