Python 球面上点的均匀分布?
我正在寻找一种算法,在球面上优化分布N个点(不是随机分布的,我说的是最佳分布的概念)。 我想在C++中做这件事,但问题不是语言问题,而是算法问题。以下是我当前使用的算法(在python中):Python 球面上点的均匀分布?,python,c++,algorithm,math,geometry,Python,C++,Algorithm,Math,Geometry,我正在寻找一种算法,在球面上优化分布N个点(不是随机分布的,我说的是最佳分布的概念)。 我想在C++中做这件事,但问题不是语言问题,而是算法问题。以下是我当前使用的算法(在python中): 对于大量的点,视觉效果似乎相当好,但对于少量的点(2到10之间),结果似乎一点也不好(半球中有更多的点)。是否有一种方法可以增强算法,使其在低点数情况下也可以。。。(答案可以是C、C++或Python)。如果你所需要的只是点数少,则蛮力>蛮力很可能是有效的。< /强>我指的是预先计算 2…10代码>的解,然
对于大量的点,视觉效果似乎相当好,但对于少量的点(2到10之间),结果似乎一点也不好(半球中有更多的点)。是否有一种方法可以增强算法,使其在低点数情况下也可以。。。(答案可以是C、C++或Python)。如果你所需要的只是点数少,则蛮力>蛮力很可能是有效的。< /强>我指的是预先计算<代码> 2…10代码>的解,然后以数组的形式查找它们,如果<代码> n dBEST),{ 设dbest:=d; 对于{i in 1..N}{ 设xbest[i]:=x[i]; 让ybest[i]:=y[i]; 设zbest[i]:=z[i]; } } } 打印“@@@@”; printf“N=%d,最小距离%6f\N”,N,sqrt(dbest); 对于{i in 1..N} printf“(%9.6f,%9.6f,%9.6f)\n”、xbest[i]、ybest[i]、zbest[i]; } 在我的计算机上运行此脚本花了5分钟,解决方案如下: N=2, min distance 2.000000 ( 1.000000, 0.000000, 0.000000) (-1.000000, 0.000000, 0.000000) N=3, min distance 1.732051 ( 1.000000, 0.000000, 0.000000) (-0.500000, 0.866025, 0.000000) (-0.500000, -0.866025, 0.000000) N=4, min distance 1.632993 ( 1.000000, 0.000000, 0.000000) (-0.333333, -0.942809, 0.000000) (-0.333333, 0.471405, -0.816497) (-0.333333, 0.471405, 0.816497) N=5, min distance 1.414214 ( 1.000000, 0.000000, 0.000000) (-0.208840, 0.977950, 0.000000) (-0.000000, 0.000000, 1.000000) (-0.212683, -0.977121, 0.000000) ( 0.000000, 0.000000, -1.000000) N=6, min distance 1.414214 ( 1.000000, 0.000000, 0.000000) (-1.000000, 0.000000, 0.000000) ( 0.000000, -0.752754, -0.658302) ( 0.000000, 0.752754, 0.658302) ( 0.000000, 0.658302, -0.752754) ( 0.000000, -0.658302, 0.752754) N=7, min distance 1.256870 ( 1.000000, 0.000000, 0.000000) (-0.688059, -0.725655, 0.000000) ( 0.210138, -0.488836, -0.846689) ( 0.210138, -0.488836, 0.846688) (-0.688059, 0.362827, 0.628435) (-0.688059, 0.362827, -0.628435) ( 0.210138, 0.977672, 0.000000) N=8, min distance 1.215563 ( 1.000000, 0.000000, 0.000000) ( 0.261204, -0.965284, 0.000000) ( 0.261204, 0.565450, 0.782329) (-0.783612, -0.482642, -0.391165) ( 0.261204, -0.199917, -0.944355) ( 0.261204, 0.882475, -0.391165) (-0.783612, 0.599750, 0.162026) (-0.477592, -0.399834, 0.782329) N=9, min distance 1.154701 ( 1.000000, 0.000000, 0.000000) (-0.500000, -0.866025, 0.000000) ( 0.333333, -0.577350, -0.745356) (-0.500000, 0.866025, 0.000000) (-0.666667, -0.000000, 0.745356) (-0.666667, 0.000000, -0.745356) ( 0.333333, -0.577350, 0.745356) ( 0.333333, 0.577350, -0.745356) ( 0.333333, 0.577350, 0.745356) N=10, min distance 1.091426 ( 1.000000, 0.000000, 0.000000) (-0.605995, 0.795469, 0.000000) ( 0.404394, 0.816443, 0.412172) (-0.664045, -0.746251, -0.046407) ( 0.404394, -0.363508, -0.839242) (-0.664045, 0.002497, 0.747688) (-0.605995, 0.046721, -0.794096) ( 0.404394, -0.908368, 0.106452) ( 0.255933, 0.703344, -0.663179) ( 0.404394, -0.159620, 0.900548) N=2,最小距离2.000000 ( 1.000000, 0.000000, 0.000000) (-1.000000, 0.000000, 0.000000) N=3,最小距离1.732051 ( 1.000000, 0.000000, 0.000000) (-0.500000, 0.866025, 0.000000) (-0.500000, -0.866025, 0.000000) N=4,最小距离1.632993 ( 1.000000, 0.000000, 0.000000) (-0.333333, -0.942809, 0.000000) (-0.333333, 0.471405, -0.816497) (-0.333333, 0.471405, 0.816497) N=5,最小距离1.414214 ( 1.000000, 0.000000, 0.000000) (-0.208840, 0.977950, 0.000000) (-0.000000, 0.000000, 1.000000) (-0.212683, -0.977121, 0.000000) ( 0.000000, 0.000000, -1.000000) N=6,最小距离1.414214 ( 1.000000, 0.000000, 0.000000) (-1.000000, 0.000000, 0.000000) ( 0.000000, -0.752754, -0.658302) ( 0.000000, 0.752754, 0.658302) ( 0.000000, 0.658302, -0.752754) ( 0.000000, -0.658302, 0.752754) N=7,最小距离1.256870 ( 1.000000, 0.000000, 0.000000) (-0.688059, -0.725655, 0.000000) ( 0.210138, -0.488836, -0.846689) ( 0.210138, -0.488836, 0.846688) (-0.688059, 0.362827, 0.628435) (-0.688059, 0.362827, -0.628435) ( 0.210138, 0.977672, 0.000000) N=8,最小距离1.215563 ( 1.000000, 0.000000, 0.000000) ( 0.261204, -0.965284, 0.000000) ( 0.261204, 0.565450, 0.782329) (-0.783612, -0.482642, -0.391165) ( 0.261204, -0.199917, -0.944355) ( 0.261204, 0.882475, -0.391165) (-0.783612, 0.599750, 0.162026) (-0.477592, -0.399834, 0.782329) N=9,最小距离1.154701 ( 1.000000, 0.000000, 0.000000) (-0.500000, -0.866025, 0.000000) ( 0.333333, -0.577350, -0.745356) (-0.500000, 0.866025, 0.000000) (-0.666667, -0.000000, 0.745356) (-0.666667, 0.000000, -0.745356) ( 0.333333, -0.577350, 0.745356) ( 0.333333, 0.577350, -0.745356) ( 0.333333, 0.577350, 0.745356) N=10,最小距离1.091426 ( 1.000000, 0.000000, 0.000000) (-0.605995, 0.795469, 0.000000) ( 0.404394, 0.816443, 0.412172) (-0.664045, -0.746251, -0.046407) ( 0.404394, -0.363508, -0.839242) (-0.664045, 0.002497, 0.747688) (-0.605995, 0.046721, -0.794096) ( 0.404394, -0.908368, 0.106452) ( 0.255933, 0.703344, -0.663179) ( 0.404394, -0.159620, 0.900548) 通过观察这些数字,很明显,一些解可以通过解析计算得到(我认识sqrt(2)和sqrt(3),等等)。我相信对于N=2,4和6,解是直线([-1,0,0],[1,0,0]),四面体,八面体 无法有力地保证上述是点的最佳可能分布。非线性解算器可能陷入局部最优;随着
N
的增长,局部最优解的数量也在增长
你可以把上面的解决方案放在一个数组中,然后用Python、C++或你使用的任何语言使用它们。他希望
N@AliOP请求Tammes问题意义上的填充,所提供的链接将其定义为“在球体表面上填充给定数量的圆以使圆之间的最小距离最大化的问题”。“BlueRaja-Danny Pflughoeft”在我建议的帖子中的评论是重复的,它使用了几乎相同的措辞来描述海报所寻找的内容,然后给出了解决该特定问题的最高评分答案。@而且,我不同意:Vincent要求优化分发,这些答案将给出一些近似分布。请检查我的答案;我在别处找不到这些结果。@Ali你检查过所有答案了吗?@LukaRahne是的,我看不出我的错误。请提供一个明确的链接,该链接提供了与我的答案相同的信息,也就是说,它提供了一种获得小N的最佳分布的方法。这很接近,但我认为它对Vincent的情况没有太大帮助。
param N;
var x{1..N};
var y{1..N};
var z{1..N};
var d;
param xbest{1..N};
param ybest{1..N};
param zbest{1..N};
param dbest;
maximize obj: d;
all_points_on_the_sphere{i in 1..N}:
x[i]^2 + y[i]^2 + z[i]^2 = 1;
all_pairs{i in 1..N, j in 1..N : i<j}:
(x[i]-x[j])^2 + (y[i]-y[j])^2 + (z[i]-z[j])^2 >= d;
fix_first_x: x[1] = 1;
fix_first_y: y[1] = 0;
fix_first_z: z[1] = 0;
fix_second_z: z[2] = 0;
#############################################
option show_stats 1;
option presolve 10;
option substout 1;
option var_bounds 2;
#option nl_comments 0;
#option nl_permute 0;
option display_precision 0;
option solver "/home/ali/ampl/ipopt";
for {k in 2..10} {
let N := k;
solexpand _con;
let dbest := -1.0;
# Multistart
for {1..2000} {
for {j in 1.._snvars}
let _svar[j] := Uniform(-1, 1);
let d := N;
solve;
if (solve_result_num < 200 and d > dbest) then {
let dbest := d;
for {i in 1..N} {
let xbest[i] := x[i];
let ybest[i] := y[i];
let zbest[i] := z[i];
}
}
}
print "@@@";
printf "N=%d, min distance %6f\n", N, sqrt(dbest);
for {i in 1..N}
printf "(%9.6f, %9.6f, %9.6f)\n", xbest[i], ybest[i], zbest[i];
}
N=2, min distance 2.000000
( 1.000000, 0.000000, 0.000000)
(-1.000000, 0.000000, 0.000000)
N=3, min distance 1.732051
( 1.000000, 0.000000, 0.000000)
(-0.500000, 0.866025, 0.000000)
(-0.500000, -0.866025, 0.000000)
N=4, min distance 1.632993
( 1.000000, 0.000000, 0.000000)
(-0.333333, -0.942809, 0.000000)
(-0.333333, 0.471405, -0.816497)
(-0.333333, 0.471405, 0.816497)
N=5, min distance 1.414214
( 1.000000, 0.000000, 0.000000)
(-0.208840, 0.977950, 0.000000)
(-0.000000, 0.000000, 1.000000)
(-0.212683, -0.977121, 0.000000)
( 0.000000, 0.000000, -1.000000)
N=6, min distance 1.414214
( 1.000000, 0.000000, 0.000000)
(-1.000000, 0.000000, 0.000000)
( 0.000000, -0.752754, -0.658302)
( 0.000000, 0.752754, 0.658302)
( 0.000000, 0.658302, -0.752754)
( 0.000000, -0.658302, 0.752754)
N=7, min distance 1.256870
( 1.000000, 0.000000, 0.000000)
(-0.688059, -0.725655, 0.000000)
( 0.210138, -0.488836, -0.846689)
( 0.210138, -0.488836, 0.846688)
(-0.688059, 0.362827, 0.628435)
(-0.688059, 0.362827, -0.628435)
( 0.210138, 0.977672, 0.000000)
N=8, min distance 1.215563
( 1.000000, 0.000000, 0.000000)
( 0.261204, -0.965284, 0.000000)
( 0.261204, 0.565450, 0.782329)
(-0.783612, -0.482642, -0.391165)
( 0.261204, -0.199917, -0.944355)
( 0.261204, 0.882475, -0.391165)
(-0.783612, 0.599750, 0.162026)
(-0.477592, -0.399834, 0.782329)
N=9, min distance 1.154701
( 1.000000, 0.000000, 0.000000)
(-0.500000, -0.866025, 0.000000)
( 0.333333, -0.577350, -0.745356)
(-0.500000, 0.866025, 0.000000)
(-0.666667, -0.000000, 0.745356)
(-0.666667, 0.000000, -0.745356)
( 0.333333, -0.577350, 0.745356)
( 0.333333, 0.577350, -0.745356)
( 0.333333, 0.577350, 0.745356)
N=10, min distance 1.091426
( 1.000000, 0.000000, 0.000000)
(-0.605995, 0.795469, 0.000000)
( 0.404394, 0.816443, 0.412172)
(-0.664045, -0.746251, -0.046407)
( 0.404394, -0.363508, -0.839242)
(-0.664045, 0.002497, 0.747688)
(-0.605995, 0.046721, -0.794096)
( 0.404394, -0.908368, 0.106452)
( 0.255933, 0.703344, -0.663179)
( 0.404394, -0.159620, 0.900548)