KeyTo9_Fans 发表于 2010-11-17 12:57:46

本帖最后由 KeyTo9_Fans 于 2010-11-17 13:12 编辑

要否定四边界共点是最优的,那么就应该仔细考察$N=4$和$N=9$的情况。

当$N=4$时,最短田埂问题的答案不是分成$4$个小正方形,而是将田埂拉成三叉状。

对于此问题,参考最短田埂问题的答案,$4$个点摆成菱形状就可以避免四边界共点,形成三叉状。

如下图所示:



然而凭感觉看,这个答案并不是最优的。

离中心较远的$2$个点有向中心靠拢的趋势,而离中心较近的$2$个点有远离中心的趋势。

当$4$个点与中心的距离相等时稳定下来,形成$4$个小正方形。

mathe 发表于 2010-11-17 14:58:57

利用我前面想到的迭代方法写了个随机算法的程序,不过发现迭代收敛速度还是挺慢的。
函数
genCenters(K,N,ERR)
用来产生一个随机解,其中K是火车站数目,N是迭代次数,ERR是使用的误差(需要注意的是如果计算精度不够高,而是用误差ERR很小,可能会出现除0错误,这时可以降低迭代次数或增加误差或提高计算精度)
对于计算出来的解,可以调用函数getTotalT(..)来计算这个解的平均距离。

mathe 发表于 2010-11-17 15:00:11

部分计算过程:
? \p
   realprecision = 38 significant digits (20 digits displayed)
? genCenters(3,100,1e-10)
%173 =






? genCenters(3,1000,1e-10)
%174 =






? \p 14
   realprecision = 19 significant digits (14 digits displayed)
? genCenters(4,500,1e-10)
*** for: division by zero
? genCenters(4,500,1e-10)
*** for: division by zero
? \p 20
   realprecision = 38 significant digits (20 digits displayed)
? genCenters(4,500,1e-10)
*** for: division by zero
? \p 30
   realprecision = 38 significant digits (30 digits displayed)
? genCenters(4,50,1e-10)
%175 =








? genCenters(4,50,1e-10)
%176 =








? genCenters(5,50,1e-10)
%177 =










? genCenters(5,50,1e-10)
%178 =










? genCenters(5,50,1e-10)
%179 =










? genCenters(5,500,1e-10)
%180 =










? setrand(1000)
%181 = 1000
? genCenters(5,500,1e-10)
%182 =










? \r train
? getTotalT(%182)
%183 = 0.174786180973170660322941393138
? getTotalT(%180)
%184 = 0.175660708263854388172181275707
? genCenters(5,500,1e-10)
%185 =










? getTotalT(%185)
%186 = 0.174786180973170660322941393138
? genCenters(6,500,1e-10)
%187 =












? getTotalT(%187)
%188 = 0.160771534476707546590248210081
? genCenters(7,200,1e-10)
%189 =














? getTotalT(%189)
%190 = 0.148592718737155249948954581302
? genCenters(7,200,1e-10)
%191 =














? getTotalT(%191)
%192 = 0.148592718737155249948954618912
? genCenters(7,200,1e-10)
%193 =














? getTotalT(%191)
%194 = 0.148592718737155249948954618912
? getTotalT(%193)
%195 = 0.148810411888737275049524820469
? genCenters(7,200,1e-10)
%196 =














? getTotalT(%196)
%197 = 0.148107927307609628274837275884

mathe 发表于 2010-11-18 07:07:16

上面迭代的方法由于收敛速度比较慢,只能得出一个近似解。
在得出一个近似解以后,我们可以假设真正的解的模式和这个近似解相同。此后我们可以通过假设所有Fans心的坐标和各个区域顶点的坐标为未知数。由此,每个Fans心对应两个未知数,每个内部的区域顶点两个未知数,边界上的区域顶点一个未知数。
而根据Fans心的条件,可以得出两条方程(也就是40#中的$T_x=0,T_y=0$)。而对于区域每条非边界的边,必然有两个Fans心关于它对称,由此,又可以得出两条方程(Fans心的连线和这条边垂直,中点在这条边上)。
而解这个超越方程必然可以得出解。而由于我们已经有一个不错的近似解,可以再次采用牛顿迭代法来计算(当然需要实现计算处这些方程的导函数,最后还需要对矩阵求逆)

mathe 发表于 2010-11-18 07:12:48

同样,对于那个田埂问题,在已经拥有近似解的模式下,也可以采用类似的方法,只是对于那个问题,采用变量略微不同,出了各个区域顶点的坐标以外,另外的变量可以采用每条边的曲率(半径的倒数)和长度作为变量
页: 1 2 3 4 5 6 [7]
查看完整版本: 火车站的最佳位置