【发布时间】:2019-01-13 22:21:08
【问题描述】:
这是原始表格:
Column1 Column2
Row1 4 (x1) 6(x3)
Row2 5 (x2) 4(x4)
x1,x2,x3,x4表示交换后的新值
原来每一列的方差是:
Var(column1)= var(c(4,5))=0.5
Var(column2)= var(c(6,4))=2
交换原表中小于10的值后,两列的新方差分别为:
New_Var(column1)=(x1-(x1+x2)/2)^2+(x2-(x1+x2)/2)^2
New_Var(column2)=(x3-(x3+x4)/2)^2+(x4-(x3+x4)/2)^2
我的目标是
Minimize | New_Var(column1) – 0.5 | + | New_Var(column2) – 2 |
这里的符号‘| |' 表示绝对。
约束是x1、x2、x3、x4只能分别从一个固定的域中获取一个值,这里说{4, 5, 4, 6}。并且所有四个变量都需要交换为不同的值,比如x1 不能为 4,x3 不能为 6,依此类推。
请注意,这里原始表中的所有值都大于 10,因为我只是想让问题看起来很简单。
实际上,表格是6000*10,非常大。所以输出所有唯一的排列和测试不是一个合适的方法。
我已经阅读了 R 中的task view of optimization。那里有很多优化包。所以我需要更具体的指导。
下面是可以将小于 10 的值分别交换为小于 10 的不同值的函数。希望对您有所帮助。
derangement <- function(x){
if(max(table(x)) > length(x)/2) return(NA)
while(TRUE){
y <- sample(x)
if(all(y != x)) return(y)
}
}
swapFun <- function(x, n = 10){
inx <- which(x < n)
y <- derangement(x[inx])
if(length(y) == 1) return(NA)
x[inx] <- y
x
}
set.seed(10)
swapFun(c(1,2,3,10,4,11,2,12))
#[1] 2 4 10 2 11 1 12
我该如何解决? 谢谢。
【问题讨论】:
-
我不明白为什么这个问题被认为过于宽泛。这肯定只是一个优化问题。你能告诉我这个问题有什么问题吗?
-
我在另一个问题中再次编辑它。
标签: python r optimization