当前位置: 首页 > 知识库问答 >
问题:

笛卡尔曲面项的包含算法

雷浩思
2023-03-14

是否有任何算法有助于最佳地找到包含分布在笛卡尔曲面上的一定数量的项目的最小矩形数(每个项目是一个具有x的点)

共有1个答案

西门品
2023-03-14

不是完整的解,只是问题的简化:假设所有点P都在大致位置,在x坐标上排序。

然后通过找出F个垂直栅栏(形式为x

然后,每个集合可以由一个轴对齐的矩形覆盖,其中集合中的第一个和最后一个点确定矩形的宽度,并且集合中具有最高y坐标的点确定高度,从而确定矩形的表面大小。

显然,现在的诀窍是选择栅栏,使栅栏的数量(以及此的矩形数)最小化,同时将所有矩形的总表面大小保持在允许的最大值以下。

编辑
可能是放置F栅栏的问题 可以使用动态规划解决。 这是我到目前为止想到的:

如果是,则最多有|P|-1个Geofence位置;这些可能会成为动态编程表中的列。动态规划表中的每一行都应该表示使用了一个额外的Geofence(请记住,我们试图找到Geofence数量最少的结果)。因此,每个单元(X,Y)将表示在前X个可用位置上精确分布Y个栅栏的最优解(就总矩形大小而言)。然而,我在看到表的相邻单元格如何(或是否)帮助确定特定单元格的值时遇到了一些问题。

编辑2:忘记这一点,我不认为动态编程方法是不可能的。这是因为我认为不可能以增量方式构建最佳解决方案(通过添加另一个点或栅栏,最佳解决方案配置可能会完全改变)。这也将排除贪婪的做法。

我能想到的唯一的想法,尽管从算法的角度来看不那么特别,是一种随机的方法,比如模拟退火来分配栅栏。它不能保证最优解,但是你应该能够非常接近最优解。

编辑3:为了回应这篇文章下的反应,我们不一定需要最好的解决方案,而是选择一个“相当好”的解决方案,并应用你现在学到的东西。

在任何情况下,您都可能需要从左到右对所有点进行排序。

一个贪婪的解决方案可能是定义第一个矩形,使其包含最左边的点。接下来,扩展矩形,使其包含右侧的点。继续添加下一个点,直到矩形超过其最大大小。在这种情况下,从一个新矩形开始,然后再次开始添加点,等等。

获得解决方案的分而治之的方法可以是从覆盖所有点的矩形开始。很明显,这个矩形超过了最大尺寸M,所以您根据某种启发法(例如,正好在中间,或者在两个后续点相距最远的点处)将它垂直分成两个更小的矩形Ml和Mr。以同样的方式递归地处理Ml和Mr,或者再次分割矩形,或者报告找到的矩形作为结果的一部分,如果它是

请注意,对于这两种方法,对于某些人为配置,结果可能会任意糟糕,但一般来说,解决方案应该是“ok”。

 类似资料:
  • 问题内容: 在学习了循环,数组,方法之后,…我开始玩图形游戏,但是遇到了一些问题。看到此示例时,我正在寻找一些示例:http : //javaceda.blogspot.ch/2010/06/draw- cartesian-coordinate-system-in.html 它提供了Java中笛卡尔平面的示例。我几乎可以理解该代码的所有内容(除了一些行,例如invokelater,SwingUti

  • 问题内容: 我有两个pandas数据框: 获得其笛卡尔积的最佳实践是什么(当然不用像我这样明确地编写它)? 问题答案: 如果每行都有一个重复的键,则可以使用merge生成笛卡尔乘积(就像在SQL中一样)。 输出:

  • 问题内容: 在Tensorflow中有什么简单的方法可以像itertools.product一样做笛卡尔积吗?我想获得两个张量(和)的元素组合,在Python中可以通过itertools作为。我正在Tensorflow中寻找替代方案。 问题答案: 我将在此假定和均为一维张量。 为了得到两者的笛卡尔积,我会用的组合和: 您使用LEN(一) LEN(B) 2张量,其中的元件的每个组合结束并且在最后一维

  • 本文向大家介绍javascript笛卡尔积算法实现方法,包括了javascript笛卡尔积算法实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript笛卡尔积算法实现方法。分享给大家供大家参考。具体分析如下: 这里可根据给的对象或者数组生成笛卡尔积 希望本文所述对大家的javascript程序设计有所帮助。

  • 本文向大家介绍PHP笛卡尔积实现算法示例,包括了PHP笛卡尔积实现算法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP笛卡尔积实现算法。分享给大家供大家参考,具体如下: 最终输出格式 Array (     [0] => 1,3,76     [1] => 1,3,6     [2] => 1,3,1     [3] => 1,3,0     [4] => 1,5,76    

  • 主要内容:Oracle CROSS JOIN子句简介,Oracle Cross Join示例在本教程中,您将学习如何使用Oracle 创建连接表的笛卡尔积。 Oracle CROSS JOIN子句简介 在数学中,给定两个集合和,的笛卡尔乘积是所有有序对(,)的集合,属于,属于。 要在Oracle中创建表的笛卡尔乘积,可以使用子句。 以下说明了子句的语法: 与其他连接(如或)不同,没有连接谓词的子句。 当执行两个没有关系的表的交叉连接时,将得到两个表的行和列的笛卡尔乘积。 当您想要生成大量