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

R 如何从一组n个对象中选择n个对象,使它们之间的成对距离之和最大化,r,optimization,linear-programming,euclidean-distance,R,Optimization,Linear Programming,Euclidean Distance,有一组N=400个对象,每个对象在19维空间中都有自己的坐标 计算所有成对距离的欧几里德距离矩阵 现在,您希望选择n=50个对象,以便选定对象之间的所有成对距离之和最大 我设计了一种方法,通过下面的线性规划代码来解决这个问题,这是一个较小的例子,但对我来说似乎效率很低,因为我使用了N*N-1/2二进制变量,对应于距离矩阵的所有非冗余元素,然后使用大量约束来确保解向量的自一致性 我怀疑一定有一种更简单的方法,只使用N个变量,但我不能马上想到一个 简要提及一些“Bron–Kerbosch”算法,该算

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

计算所有成对距离的欧几里德距离矩阵

现在,您希望选择n=50个对象,以便选定对象之间的所有成对距离之和最大

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

我怀疑一定有一种更简单的方法,只使用N个变量,但我不能马上想到一个

简要提及一些“Bron–Kerbosch”算法,该算法显然解决了距离和部分。 但在这个例子中,距离之和是一个特定的数字,所以我看不到直接应用于我的案例

我简单地看了一下二次规划,但是我还是看不到与我的例子的直接相似之处,尽管“b%*%bT”矩阵,其中b是列二元解向量,理论上可以用来乘以距离矩阵,等等。;但我真的不熟悉这种技术

有没有人能给我建议/指给我看其他的帖子,解释这种问题是否以及如何通过只使用N个二进制变量的线性规划来解决? 或者就如何更有效地解决问题提供任何其他建议

谢谢

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个二元变量来表示,但要用二次项。据我所知,在一个线性规划中,用N个二元变量来表示它是不可能的

给出了二次公式,讨论了边界和分枝定界算法


希望这有帮助。

太好了,谢谢!对于在R中使用什么样的二次解算器,您有什么建议吗?看起来R没有免费的MIQP解算器。Rcplex只是一个接口,需要单独安装cplex。线性化似乎是我目前唯一可行的解决方案。。。许多文章喜欢并描述了提高线性化方法计算效率的技术,但我不希望自己编写这些技术……Cplex和Gurobi为您提供了自动线性化二次问题的选项;事实上,在进一步阅读之后,我计划购买Cplex。首先,我将评估免费版本,如果它解决了以二次形式表示的问题,我甚至不需要线性化。但它可能不是,在任何情况下,二次问题的线性化是一个有趣的话题;事实上,我要问另一个问题。OP已经发布了一个相关的问题,其答案可能适用于这个问题。