2

我正在做空间优化。我有大约 20 000 个细胞,它们的“所有者”有机会达到最佳状态。细胞的大小和形状各不相同。我需要做的任务是计算当地社区业主之间的线路长度。(这只是如何确定单元格的新所有者的一种选择。)

我有三个矩阵。第一个具有表示:Line_id、Left_cell_neighbour、right_cell_neighbour、length_of_line 的列。线是单元格的边界线之一。两个单元格之间可能不仅仅是一条线。

      Line_ID  LEFT_ID  RIGHT_ID     Lenght
[1,]        1        5         1  31.648135
[2,]        2       15         2  38.229177
[3,]        3        9        65   2.707813
[4,]        4        5         4   2.139000
[5,]        5        1      1279   1.660400
[6,]        6        6         1  25.000000

第二个有代表:Cell_id、Neightbour_cell_1_id、Neighbour_cell_2_id..等等的列。相邻小区的数量因小区而异,但都少于 10 个相邻小区。-1 仅用于填充空白空间。如果有帮助,我可以把它带到 NA。

      Cell_Id N_1_Id N_2_Id N_3_Id N_4_Id N_5_Id N_6_Id N_7_Id N_8_Id   
[1,]        1     31      6      2     -1     -1     -1     -1     -1
[2,]        2      1     67      7      3     -1     -1     -1     -1
[3,]        3      2     43      8      4      7      6     -1     -1
[4,]        4      3      9     75     -1     -1     -1     -1     -1
[5,]        5     44     11      6     -1     -1     -1     -1     -1

第三个有代表:Cell_id、所有者和变量的列。

     Cell_Id Owner Variable_1 Variable_2 Variable_3
[1,]  1       22      1.77579        565        399
[2,]  2       22    284.08909        427        228
[3,]  3       22    367.90390        464        269
[4,]  4       22      0.01670        231         67
[5,]  5       22     33.89463        241         73
[6,]  6       22    422.15516        620        481

我需要在大约一半的迭代中计算不同所有者的邻居之间的线长度。迭代次数可能会很大,因此计算应该很快。

此消息中链接的图片中显示了一个示例。标有问号的单元格的所有者将是已经与单元格有大部分共同边界线的人。不同的所有者以不同的颜色显示。您可以看到此单元格的所有者将与拥有单元格 3 和 5 的所有者相同。

应计算长度的线用红色标记。在邻居中(在这种情况下)有 4 个不同的所有者,一个用于单元 1,一个用于单元 4,一个用于单元 2,一个用于单元 3 和 5。

然后我应该能够得到长度在列中的矩阵:所有者,lenght_of_borderline。然后我选择与 max(lenght_of_borderline) 对应的所有者作为新所有者。

但是如何有效地计算呢?欢迎其他有关此任务的高效结构等建议。

谢谢你的帮助!

图片链接(我希望它有效)http://imageshack.us/photo/my-images/641/situationn.png/

更新:矩阵示例。

4

1 回答 1

0

您应该能够使用模拟退火来有效地解决这个问题。

http://en.wikipedia.org/wiki/Simulated_annealing

这是另一个示例的视频。

http://www.youtube.com/watch?v=-cr6wbZOqOU

GNU 科学图书馆为此提供了一套工具。

http://www.gnu.org/software/gsl/manual/html_node/Traveling-Salesman-Problem.html

有可用的 R 绑定。

http://cran.r-project.org/web/packages/gsl/index.html

于 2012-05-25T13:43:30.167 回答