1
1
一种可能性是将识别最近元素(每组一个)的问题表述为混合整数规划。我们可以为是否选择每个点i定义决策变量y_i,以及为是否同时选择点i和j定义x_{ij}(x_{ij}=y_iy_j)。我们需要从每个组中选择一个元素。
在示例数据集中,这可以计算最接近的3个点,每个簇一个:
它还可以计算具有更多点和组的数据集的最佳可能解决方案。以下是数据集的运行时,每个数据集有7个组,分别有100和200个点:
这远非瞬时的——100点7组数据集需要15秒,200点7组数据集需要323秒。不过,它比遍历100点数据集中的所有9200万个7元组或200点数据集中的所有138亿个7元组要快得多。您可以使用类似于Rglpk包中的解算器设置运行时限制,以获得在该限制内获得的最佳解。 |
2
1
所以我想你必须做一个 分支和边界 优化方法。
现在做一些简单的优化:对于每个标签,尝试是否有一些点可以用来代替当前点来改善结果。当你找不到任何进一步的改进时停止。 对于这个初始猜测,计算距离。这将给你一个上限,允许你提前停止搜索。您还可以计算下限,即所有最佳两个标签解的总和。
然后,您可以开始枚举解(可能首先从最小的标签开始),但只要当前解+剩余的下限大于最著名的解(分支和界限),就停止递归。 您也可以尝试对点进行排序,例如按与剩余标签的最小距离排序,以期快速找到更好的边界。
|
3
0
|
4
0
我开发了一个简单的算法来快速解决这个问题。第一步是在整个点区域上覆盖网格。第一步是将每组中的每个点分配到其所在的单元或单位正方形。接下来我们转到图的左下角,遍历一个单元格,然后向上遍历一个单元格。这是起始单元格。然后,我们定义一个感兴趣的区域,该区域由该单元及其所有8个相邻单元组成。然后进行测试,以确定每个组的至少一个点是否在这9个单元格区域内。如果是这样,则计算从该区域中表示的每个点到所有其他组中所有其他点的距离。换句话说,该9单元区域中的所有点组合用于获得总距离,其中用于距离计算的成对点从不来自同一组。从这些计算中,将涉及每组单个点的最小距离保存为可能的解。然后,通过右边的一个单元格重复整个过程。当中心单元向右移动时,计算每个9单元区域。这是从右端一个单元格停止的。当第一行完成时,该过程继续进行,向上移动一行,然后从左侧的一个单元格重新开始。因此,在完成顶行时,已考虑每个单元格。解决方案是根据每个9单元区域的所有测试计算出的最小距离。 我们考虑9单元区域而不仅仅是逐个单元的原因是,我们可能会错过位于单元角部的不同组的密集点。 选择正确的单元格或网格大小很重要。如果单元太小,则将找不到可能的解决方案,因为没有任何区域将包含每个组中的至少一个点。如果单元格太大,则每组将有许多点,计算时间将过长。幸运的是,通过反复试验可以很快找到这种最佳单元大小。
|
MadelineJC · group_by在R中按顺序排列数字 2 年前 |
John Doe · 循环遍历数组并分配新数组的键 6 年前 |
Pavel · 按键对XML元素分组 6 年前 |
RBrook · 如何利用C#(linq)生成困难的组? 6 年前 |
user · 使用LAG、FIRST\U值等构建组 6 年前 |
sinDizzy · 正则表达式将文本块与中间的关键短语匹配 6 年前 |
HT121 · 根据条件更新分组数据中的行并删除几行 6 年前 |
JY078 · python在列表中分组字符串 6 年前 |
artek · 基于公共密钥将多个json对象分组 6 年前 |