【问题标题】:Diagonal sweep and orthogonal distance of a point to diagonal对角线扫掠和点到对角线的正交距离
【发布时间】:2015-04-11 14:25:40
【问题描述】:

我有一个问题,我需要找到小于或等于给定距离 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 到 180 度数循环,然后以该角度创建一条线......但是通过哪个原点?
  • 这是怎么回事?你在某处有很多点,必须通过它们回归一条线,然后选择距离它一定距离的所有点?因为 OP 文本和代码让我感到困惑(文本暗示你不知道点和代码是暴力破解点和线)所以什么是知道的,什么是未知的?如果点未知,它们是否在某个网格上? (我不是 C# 编码器,所以我可能会遗漏一些东西)
  • 顺便说一句:stackoverflow.com/a/20888844/2521214 可能会有所帮助
  • @Spektre 这些点是已知的。我首先使用变量 x1 和 x2 分别为 A 点和 B 点创建线段 AB。点 P 是我要测量的与线段 AB 的垂直距离的点。唯一没有显示的是点类和数组 X 和 Y,它们的点 P 的坐标为 x[i] 和 y[i]
  • 那么我上一条评论中的链接(从一组已知点中查找行)就是您所需要的。请注意,没有找到最佳解决方案,只是接近它。从中您可以添加关闭点选择...如果您想要最佳解决方案然后搜索线回归...

标签: c# algorithm geometry brute-force


【解决方案1】:

如果你想把这个问题定义为一个优化问题,你应该如下做,但在我看来这个优化问题并没有像现在这样有效地解决。

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 &lt;= 1 - 这正是您想要的。

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


作为旁注,我的直觉说这个问题是 NP-Complete,虽然我还没有证据 - 如果我(或其他人)能想出一个归约/多项式,我会更新这部分答案解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2019-03-21
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多