Sorting 订购一组数字以最大化相邻差异

Sorting 订购一组数字以最大化相邻差异,sorting,mathematical-optimization,Sorting,Mathematical Optimization,给定一组N个数字x1,x2,…,xN,您如何找到它们的顺序以最大化相邻数字之间的最小绝对差?这可能是一个NP难问题,所以任何有效的近似方法都可以。假设您已将i=1,…,n的数据定义为x_i。我们可以为i=1,…,n和j=1,…,n定义二进制变量p_{ij},如果数字i的排序顺序为j,则为1,否则为0。添加一个变量e,我们的优化模型如下: 具有绝对值的约束确保e(我们的最小间隙)不会超过排序序列中每对相邻元素之间的间隙。但是,绝对值在线性优化模型中是不允许的,通常需要添加一个二进制变量来建模绝对

给定一组N个数字
x1
x2
,…,
xN
,您如何找到它们的顺序以最大化相邻数字之间的最小绝对差?这可能是一个NP难问题,所以任何有效的近似方法都可以。

假设您已将i=1,…,n的数据定义为x_i。我们可以为i=1,…,n和j=1,…,n定义二进制变量p_{ij},如果数字i的排序顺序为j,则为1,否则为0。添加一个变量e,我们的优化模型如下:

具有绝对值的约束确保e(我们的最小间隙)不会超过排序序列中每对相邻元素之间的间隙。但是,绝对值在线性优化模型中是不允许的,通常需要添加一个二进制变量来建模绝对值大于或等于其他值的模型。因此,让我们添加二进制变量r_j,j=2,…,n,并替换有问题的约束:

这里M是一个大数;2(最大(x)-最小(x))应足够大。现在,我们已经准备好实际实现这个模型。您可以使用任何MIP解算器;我将在R中使用
lpSolveAPI
,因为它是免费的,易于访问。p_{ij}存储在变量1到n^2中;r_j存储在变量n^2+1到n^2+n-1中;e存储在变量n^2+n中

x = 1:5
n = length(x)
M = 2*(max(x) - min(x))
library(lpSolveAPI)
mod = make.lp(0, n^2+n)
set.type(mod, 1:(n^2+n-1), "binary")
set.objfn(mod, c(rep(0, n^2+n-1), 1))
lp.control(mod, sense="max")
for (j in 2:n) {
  base.cons <- rep(0, n^2+n)
  base.cons[seq(j-1, by=n, length.out=n)] = x
  base.cons[seq(j, by=n, length.out=n)] = -x
  base.cons[n^2+j-1] = M
  first.cons = base.cons
  first.cons[n^2+n] = -1
  add.constraint(mod, first.cons, ">=", 0)
  second.cons = -base.cons
  second.cons[n^2+n] = -1
  add.constraint(mod, second.cons, ">=", -M)
}

for (j in 1:n) {
  this.cons = rep(0, n^2+n)
  this.cons[seq(j, by=n, length.out=n)] = 1
  add.constraint(mod, this.cons, "=", 1)
}

for (i in 1:n) {
  this.cons = rep(0, n^2+n)
  this.cons[seq((i-1)*n+1, i*n)] = 1
  add.constraint(mod, this.cons, "=", 1) 
}
最后,我们可以使用x_i和p_{ij}变量提取排序列表:

sapply(1:n, function(j) sum(get.variables(mod)[seq(j, by=n, length.out=n)]*x))
# [1] 1 3 5 2 4

从最低到最高或从最高到最低排序不是最好的解决方案吗?您在寻找哪种语言的解决方案?看看这些排序:)不,排序顺序实际上是最差的。对于数字1-5,排序1,3,5,2,4更好,因为任意两个相邻数字之间的最小差值为2。好的,对不起,我没有解释您所说的“最小差值最大化”的意思。(我建议删除你问题中的“最小值”一词)这很重要,因为我想在L无穷大范数中进行优化,而不是其他任何东西(如L2)。
sapply(1:n, function(j) sum(get.variables(mod)[seq(j, by=n, length.out=n)]*x))
# [1] 1 3 5 2 4