我有一个问题,我需要找到小于或等于给定距离D的最大点数到二维欧几里得平面中绘制的直线。为了解决这个问题,我编写了算法,如果线与x轴或y轴正交,则计算可能的最大值。我的问题是只有一条对角线才会产生最大点数。
考虑到x和y的最小值为-1000000且最大值为1000000的约束。我编写了以下算法来尝试找出最大值。我似乎没有得到正确的答案。有人可以指导我出错的地方。我也尝试绘制一条回归线但是使用的垂直距离对我的目的不起作用。也许我错了,这个问题可以解决为优化问题。不管怎么说'任何有关血统解释的帮助都非常感激。
// diagonal sweep
for (int degree = 1; degree < 180; degree++) if (degree % 90 != 0)
{
int k = 1, degrees = degree;
double x1 = -1000000, x2 = 1000000;
if (degree > 90 && degree < 180)
{
degrees = 180 - degrees;
k = -1;
}
//slope
double m1 = Math.Tan(Math.PI * degrees * k / 180.0);
//Point A
Point A = new Point(x1, m1 * x1);
//Point B
Point B = new Point(x2, m1 * x2);
for (int i = 0; i < x.Length; i++)
{
//Point P = household that needs power
Point P = new Point(x[i], y[i]);
double normalLength = Math.Sqrt((B.X - A.X) * (B.X - A.X) + (B.Y - A.Y) * (B.Y - A.Y));
double segmentLength = 1d * Math.Abs((P.X - A.X) * (B.Y - A.Y) - (P.Y - A.Y) * (B.X - A.X)) / normalLength;
if (segmentLength <= D)
tempCnt++;
}
maxConnections = Math.Max(maxConnections, tempCnt);
tempCnt = 0;
}
return maxConnections;
答案 0 :(得分:0)
如果您想将此问题定义为优化问题,您应该按照以下方式执行此操作,但在我看来,此优化问题无法按原样有效解决。
maximize: x_1 + x_2 + ... + x_n + 0*a + 0*b + 0*c
s.t.
x_i * d(p_i, line(a,b,c))/ MAX_DISTANCE <= 1
x_i is in {0,1}
<强>解释强>
x_i
是包含变量 - 可以得到0/1的值,它表示点p_i是否在距离该行所需的距离内。a,b,c
是该行的参数:ax + by + c = 0
d
)满足1* d/MAX_DISTANCE <= 1
- 这正是你想要的。虽然我不认为这个优化问题有一个最佳有效的解决方案,但您可能想尝试一些启发式解决方案来实现此优化 - 例如Genetic Algorithms或Hill Climbing
作为旁注,我的直觉说这个问题是NP-Complete,虽然我还没有证据 - 如果我(或其他人)可以提出减少/多项式,它会更新这部分答案溶液