我试图找到我可以放置在给定曲面中的最大点数,因为这些点之间必须存在一定的距离。
我曾想过以小分辨率离散表面并尝试所有组合。不幸的是,这种方法非常慢。另一种解决方案可能是搜索有效点,并使用递归函数从每个有效位置搜索新的有效点。尽管这种方法更快,但其计算时间随表面呈指数增长。
所以,我想知道是否存在允许更快解决方案的其他算法。
我在C中的代码如下:
int locatePoints(int p_valids, int achieved, int points[][2]){
int row_ini;
int row_end;
int points_max[N][2];
int points_act[N][2];
int valids_act;
int quantity_max;
int valid;
int point_to5;
int SquaredDistance;
int i,j,k,l;
if (p_valids==0){
row_ini = 0;
}
else{
row_ini = points[p_valids-1][0];
}
row_end = row_ini+6;
if (row_end>ROW_LIMIT){
row_end = ROW_LIMIT;
}
for(i=0;i<p_valids;i++){
points_act[i][0] = points[i][0];
points_act[i][1] = points[i][1];
points_max[i][0]=points[i][0];
points_max[i][1]=points[i][1];
}
quantity_max = p_valids;
for(i=row_ini;i<row_end;i++){
for(j=0;j<COL_LIMIT;j++){
valid = 1;
point_to5 = 0;
for (k=0;k<p_valids && valid;k++){
SquaredDistance = (points[k][0]-i)*(points[k][0]-i)+(points[k][1]-j)*(points[k][1]-j);
if (SquaredDistance<25){
if (SquaredDistance<16){
valid = 0;
}
else{
point_to5++;
if (point_to5>1){
valid = 0;
}
}
}
}
if (valid){
points_act[p_valids][0] = i;
points_act[p_valids][1] = j;
valids_act = locatePoints(p_valids+1, quantity_max, points_act);
if (valids_act>quantity_max){
quantity_max = valids_act;
for(k=0;k<quantity_max;k++){
points_max[k][0]=points_act[k][0];
points_max[k][1]=points_act[k][1];
}
}
}
}
}
for(k=0;k<quantity_max;k++){
points[k][0]= points_max[k][0];
points[k][1]= points_max[k][1];
}
return quantity_max;
}