如何从一组 N 个对象中选择 n 个对象,最大化它们之间的成对距离之和

2024-04-08

您有一组 N=400 个对象,每个对象在 19 维空间中都有自己的坐标。

您计算(欧几里德)距离矩阵(所有成对距离)。

现在您想要选择 n=50 个对象,使得所选对象之间所有成对距离的总和最大。

我设计了一种通过线性编程来解决这个问题的方法(下面的代码,用于较小的示例),但对我来说似乎效率低下,因为我使用的是 N*(N-1)/2 二进制变量,对应于所有非冗余距离矩阵的元素,然后很多约束来保证解向量的自洽。

我怀疑一定有一种更简单的方法,只使用 N 个变量,但我无法立即想到一个。

这个帖子 https://stackoverflow.com/questions/16696033/select-n-locations-from-list-to-maximize-sum-with-min-distance-constraint简要提到了一些“Bron-Kerbosch”算法,该算法显然解决了距离总和部分。
但在该示例中,距离总和是一个特定的数字,因此我看不到对我的案例的直接应用。

我简要了解了二次规划,但我再次看不到与我的情况直接平行的情况,尽管“b %*% bT”矩阵(其中 b 是(列)二元解向量)理论上可以用于乘以距离矩阵等;但我真的不熟悉这项技术。

任何人都可以请建议(/给我指出其他解释的帖子)是否以及如何通过仅使用 N 个二进制变量的线性编程来解决此类问题?
或者就如何更有效地解决问题提供任何其他建议?

Thanks!

PS:这是我上面提到的代码。

require(Matrix)

#distmat defined manually for this example as a sparseMatrix
distmat <- sparseMatrix(i=c(rep(1,4),rep(2,3),rep(3,2),rep(4,1)),j=c(2:5,3:5,4:5,5:5),x=c(0.3,0.2,0.9,0.5,0.1,0.8,0.75,0.6,0.6,0.15))

N = 5
n = 3

distmat_summary <- summary(distmat)
distmat_summary["ID"] <- 1:NROW(distmat_summary)
i.mat <- xtabs(~i+ID,distmat_summary,sparse=T)
j.mat <- xtabs(~j+ID,distmat_summary,sparse=T)
ij.mat <- rbind(i.mat,"5"=rep(0,10))+rbind("1"=rep(0,10),j.mat)
ij.mat.rowSums <- rowSums(ij.mat)
ij.diag.mat <- .sparseDiagonal(n=length(ij.mat.rowSums),-ij.mat.rowSums)
colnames(ij.diag.mat) <- dimnames(ij.mat)[[1]]
mat <- rbind(cbind(ij.mat,ij.diag.mat),cbind(ij.mat,ij.diag.mat),c(rep(0,NCOL(ij.mat)),rep(1,NROW(ij.mat)) ))

dir <- c(rep("<=",NROW(ij.mat)),rep(">=",NROW(ij.mat)),"==")
rhs <- c(rep(0,NROW(ij.mat)),1-unname(ij.mat.rowSums),n)

obj <- xtabs(x~ID,distmat_summary)
obj <- c(obj,setNames(rep(0, NROW(ij.mat)), dimnames(ij.mat)[[1]]))

if (length(find.package(package="Rsymphony",quiet=TRUE))==0) install.packages("Rsymphony")
require(Rsymphony)
LP.sol <- Rsymphony_solve_LP(obj,mat,dir,rhs,types="B",max=TRUE)
items.sol <- (names(obj)[(1+NCOL(ij.mat)):(NCOL(ij.mat)+NROW(ij.mat))])[as.logical(LP.sol$solution[(1+NCOL(ij.mat)):(NCOL(ij.mat)+NROW(ij.mat))])]
items.sol
ID.sol <- names(obj)[1:NCOL(ij.mat)][as.logical(LP.sol$solution[1:NCOL(ij.mat)])]
as.data.frame(distmat_summary[distmat_summary$ID %in% ID.sol,])

这个问题被称为p-色散和问题。它可以用公式表示为N二元变量,但使用二次项。据我所知,仅用它是不可能的Na 中的二进制变量linear程序。

皮辛格的这篇论文 https://pdfs.semanticscholar.org/1eb3/810077c0af9d46ed5ff2b0819d954c97dcae.pdf给出二次公式并讨论边界和分支定界算法。

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从一组 N 个对象中选择 n 个对象,最大化它们之间的成对距离之和 的相关文章

  • 如何使用 sprintf 函数在字符中添加前导“0”而不是空格?

    我正在尝试使用sprintf函数为字符添加前导 0 并使所有字符长度相同 然而我得到的是领先空间 My code a lt c 12 123 1234 sprintf 04s a 1 12 123 1234 我试图得到什么 1 0012 0
  • 聚合日期时间以总结在特定条件下花费的时间

    我很困惑我应该如何继续 我下面有一些虚拟数据 Date lt as POSIXct c 2018 03 20 11 52 25 2018 03 22 12 01 44 2018 03 20 12 05 25 2018 03 20 12 10
  • R闪亮主面板显示样式和字体

    我正在学习闪亮的应用程序 并且有一些关于调整布局的基本问题 特别是样式和字体 希望得到指点或明确的答案 谢谢 考虑一个基本的输入输出应用程序 用户在 sidebarPanel 中输入数据 然后在 mainPanel 中反应性地输出结果 如何
  • 如何使用autoconf重新生成配置文件?

    我使用 autoconf 重新生成配置文件 它有效 但是当我执行生成的配置文件时 configure 有一些错误消息 例如 configure line 3713 syntax error near unexpected token bla
  • R:ifelse 中的字符串列表

    我正在寻找与 MySQL 中的 where var in 语句类似的东西 我的代码如下 data lt data frame id 10001 10030 cc1 rep c a b c 10 attach data data new lt
  • 根据 row_number() 过滤 data.frame

    更新 自从提出这个问题以来 dplyr 已经更新 现在按照 OP 的要求执行 我正在尝试获取第二行到第七行data frame using dplyr 我正在这样做 require dplyr df lt data frame id 1 1
  • zsh:未找到命令:使用 Big Sur Mac 的终端上的 R

    我从官方 cran 网站安装了 R 我可以从 Rstudio 运行 R 但是当我尝试从终端使用 R 时 我得到以下结果 base ege Eges MBP R zsh command not found R base ege Eges MB
  • 在 R 中使用逻辑 grep 抓取文本

    下午好 谢谢你帮我解答这个问题 我有兴趣抓取一组超过 5000 个 URL 的列表 我使用 lapply 和 readLines 使用下面的示例代码提取这些网页的文本 multipleURL lt c http dailymed nlm n
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • 通过 Shiny 中的串扰将 Plotly 与 DT 结合使用

    我正在编写一个应用程序来将 csv 文件读取为闪亮的并将散点图与 DT 表链接起来 我几乎遵循了 Plotly 网站上 DT 数据表上的示例 https plot ly r datatable https plot ly r datatab
  • R Leaflet Legend:colorBin-删除中断之间的小数

    我正在使用 Leaflet 库在 R 中创建交互式 HTML 地图 传说中采用的是colorBin用于创建将数据分为 6 个类别的方法 使用min values and max values 我已经定义了美国社区调查收入数据的特定范围可能落
  • 通过 R 中的数据子集执行计算

    我想对数据框的 PERMNO 列中的每个公司编号进行计算 其摘要可以在此处查看 gt summary companydataRETS PERMNO RET Min 10000 Min 0 971698 1st Qu 32716 1st Qu
  • rvest 和 NHL 统计数据的 CSS 选择器问题

    我想从 hockey reference com 中抓取数据 特别是从以下链接中抓取数据 https www hockey reference com leagues NHL 1991 html https www hockey refer
  • 使用 ggplot 构面时增加闪亮的绘图大小

    有没有办法增加绘图窗口的大小shiny取决于在一个中使用的面的数量ggplot图 也许使用垂直滚动 例如 使用下面的示例 当输入为 A 有三个方面 情节看起来不错 当选项 B 选择绘图数量会增加 但绘图窗口保持相同大小 导致绘图太小 是否有
  • R 中的龙卷风图

    我正在尝试在 R 中绘制龙卷风图 又名敏感性图 目标是可视化某些变量增加 10 和减少 10 的效果 到目前为止我已经得到这个结果 这是我正在使用的代码 Tornado plot data lt matrix c 0 02 0 02 0 0
  • 如何在 R 中绘制一列与其余列的关系图

    我有一个数据集 其中 1 是时间 接下来的 14 个是幅度 我想在一张图表上散布所有大小与时间的关系 其中每个不同的列都是网格化的 分层在另一个之上 我想使用原始数据来制作这些图表 并单独制作它们 但只想执行此过程一次 数据集A 唯一的自变
  • 如何在 R 中将字符串解析为层次结构或树

    有没有办法将表示组的字符串解析为 R 中的层次结构 假设我的小组结构如下 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 3 1 1 3 1 1 1 3 2 1 1 3 3 1 2 1 2 1 1 2 1 1 1 2 1 2 1
  • 读取R中打开的Excel文件

    有没有办法将打开的Excel文件读入R 当Excel中打开一个excel文件时 Excel会对文件加锁 比如R中的read方法无法访问该文件 你能绕过这个锁吗 Thanks 编辑 这发生在带有原始 Excel 的 Windows 下 发生错
  • 当有很多列时,使用 readr::read_csv() 导入数据时覆盖列类型

    我正在尝试使用 R 中的 readr read csv 读取 csv 文件 我导入的 csv 文件大约有 150 列 我只包含示例的前几列 我希望将第二列从默认类型 我执行 read csv 时为日期 覆盖为字符或其他日期格式 GIS Jo
  • RStudio 如何确定控制台宽度,为什么它似乎总是出错?

    我刚刚发现wid lt options width在 RStudio 中 它似乎是我日常控制台使用中令人烦恼的根源 或者更确切地说 更接近根源 我应该先说一下 我目前使用的是 R 3 2 2 RStudio 0 99 491 Linux M

随机推荐

  • BreakIterator 在 Android 中如何工作?

    我正在 Android 中制作自己的文本处理器 蒙古语的自定义垂直脚本 TextView 我以为我必须自己找到所有换行位置 以便我可以实现换行 但后来我发现BreakIterator https developer android com
  • 如何根据另一个字段的值禁止 TFS 要求工作项中的状态从“建议”更改为“活动”?

    I ve added department approvals to the standard CMMI Template Requirement work item I d like to limit the System State f
  • iOS 通知服务扩展会从设备中删除附加文件吗?

    我遇到了一个奇怪的问题 iOS 通知服务扩展将从设备中删除附件 我使用 SDWebImage 来显示和缓存图像 并实现了通知服务扩展以在通知警报视图中显示图像 就我而言 图像已在本地缓存 然后 我单击主页按钮 我的应用程序在后台运行 应用程
  • 如何将远程 Git 存储库添加到 Ubuntu 服务器?

    我在我的桌面计算机 Windows 7 上创建了一个 Git 存储库 git init git add
  • 如何运行 Flutter 脚本

    我正在尝试对 flutter 库进行一些基准测试 但是我不知道如何运行需要 flutter 库的脚本 我能够做到这一点的唯一方法是将其作为测试代码运行 但是我没有找到在测试模式下禁用断言的方法 Works flutter test mySc
  • 如何实现 Gmail 风格的标签选择器?

    实现 类似 Gmail 标签邮件界面的最简单方法是什么 有没有 JavaScript 库有这样的小部件 http img294 imageshack us img294 7097 36698396 png http img294 image
  • 在没有游标的情况下合并单个 SQL 表中的数据

    我有一个包含 ID 列的表和另一个包含数字的列 一个ID可以有多个号码 例如 ID Number 1 25 1 26 1 30 1 24 2 4 2 8 2 5 现在根据这些数据 在一个新表中 我想要这个 ID Low High 1 24
  • 在没有按钮连接的情况下以编程方式执行 Segue?

    我的故事板中有两个视图控制器 我需要从视图 1 推送到视图 2 我需要在不直接从故事板中的按钮连接转场的情况下执行此操作 我需要以编程方式执行此操作 我怎么能够 Thanks 当您单击按钮时调用 self performSegueWithI
  • VBScript 宏 getParentFolder 名称

    我正在尝试创建一个 vbscript 宏 它将获取存储宏的文件夹位置并将输出文件创建到同一文件夹中 我正在使用下面的代码 但它没有获得正确的位置 Set obj1FSO CreateObject Scripting FileSystemOb
  • 跨包模块设置日志记录的有效方法

    我有一个包 其中包含多个组件 这些组件将从使用日志记录和输出有用信息中受益匪浅 我不想做的是为每个文件 设置 正确的日志记录 并在以下位置进行 import logging logging basicConfig level DEBUG m
  • Boost:为什么 ~/user-config.jam 中列出的工具集不可用于 ./b2?

    在我试图回答我自己的问题时Clang 链接器报告 未找到符号 尽管 nm m 显示该名称存在于正在链接的库中 https stackoverflow com questions 20599721 clang linker reports s
  • window.onbeforeunload 执行查询

    我试图在用户离开页面时执行后查询 我正在使用的代码是 我在这里做的事情有什么问题吗 我在 FF 错误控制台中得到的结果只是说其他不相关的函数 变量未定义 因为它们正在卸载 对于我需要修复的问题有什么提示或指示吗 简单的答案是你不能在中进行异
  • 使用 sql 通过 csv 将产品导入到 woocommerce

    当sql表post meta不断增长时 通过插件wp all import导入产品会花费太多时间 目前有200 000种产品进口 有没有办法直接在sql中通过csv导入产品而不需要wordpress 我不需要导入任何图像 只需导入标题和描述
  • 应用程序图标创建叠加信息(数字)?

    如何在 Android 应用程序上克隆此行为 iOS 从技术上讲 这绝对是可能的 因为我在 Android 手机上有一个自己的应用程序 它是一个电子邮件应用程序 图标上有一个非常相似的指示器 显示未读邮件数量 是的 你可以像 ios 一样实
  • 用户输入-DOS批处理文件

    我得到一个bat文件 如下所示 ECHO Executing scripts PAUSE for X in SQL do SQLCMD S localhost d CTL I i X gt gt ResultScript txt pause
  • 以编程方式更改滑动时的 ViewPager 动画持续时间

    我正在使用以下代码更改幻灯片 viewPager setCurrentItem index true 但变化太快了 有没有办法手动设置动画速度 I ve wanted to do myself and have achieved a sol
  • 我可以在全局范围内只安装 Gulp 吗?

    我一直致力于新的网络开发项目 这些项目在实践中并不需要他们的node modules部署时的文件夹 如果我能够创建一个小的 它会更适合我gulpfile js对于每个项目 而不是包含在 6000 多个文件node modules每个项目的文
  • 在 Restful Web 服务中下载文件

    我的要求是 我应该通过restful服务向客户端发送一个10MB的zip文件 我在论坛中找到了发送StreamingOutput对象是更好的方法 但是我如何创建一个StreamingOutput以下代码中的对象 Path PDF file
  • 使用“Object.create”而不是“new”

    Javascript 1 9 3 ECMAScript 5 介绍Object create 其中道格拉斯 克罗克福德 Douglas Crockford 等人提倡 http javascript crockford com prototyp
  • 如何从一组 N 个对象中选择 n 个对象,最大化它们之间的成对距离之和

    您有一组 N 400 个对象 每个对象在 19 维空间中都有自己的坐标 您计算 欧几里德 距离矩阵 所有成对距离 现在您想要选择 n 50 个对象 使得所选对象之间所有成对距离的总和最大 我设计了一种通过线性编程来解决这个问题的方法 下面的