确定表面中可放置的最大点数的算法

时间:2016-08-27 17:12:00

标签: algorithm optimization

我试图找到我可以放置在给定曲面中的最大点数,因为这些点之间必须存在一定的距离。

我曾想过以小分辨率离散表面并尝试所有组合。不幸的是,这种方法非常慢。另一种解决方案可能是搜索有效点,并使用递归函数从每个有效位置搜索新的有效点。尽管这种方法更快,但其计算时间随表面呈指数增长。

所以,我想知道是否存在允许更快解决方案的其他算法。

我在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;

}

0 个答案:

没有答案