对角扫描和点到对角线的正交距离

时间:2015-02-11 09:20:47

标签: c# algorithm geometry brute-force

我有一个问题,我需要找到小于或等于给定距离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;

1 个答案:

答案 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
  • 想法是最大化包含点的总和,使得每个包含点在期望的范围内。这由约束表示,如果x_i = 0 - 对点p_i没有限制,因为总是满足约束。否则,x_i = 1,你需要距离线的距离(让它为d)满足1* d/MAX_DISTANCE <= 1 - 这正是你想要的。

虽然我不认为这个优化问题有一个最佳有效的解决方案,但您可能想尝试一些启发式解决方案来实现此优化 - 例如Genetic AlgorithmsHill Climbing


作为旁注,我的直觉说这个问题是NP-Complete,虽然我还没有证据 - 如果我(或其他人)可以提出减少/多项式,它会更新这部分答案溶液