我有一个全局优化问题,包括平等和不平等约束,我正在努力找到一个令人满意的解决方案。
我正在尝试优化通过将3个概率P(A),P(B),P(C)组合成一组优势比目标而产生的重叠的划分。 3个概率的重叠产生7个段v1到v7,其中v1到v3对应于solus概率(所以v1是P(A solus)等...),v4到v6对应于涉及2个特征的概率(所以v4是P((A AND B)NOT C)等。)和v7对应于所有3个特征,即P(A AND B和C)。
我正在尝试找到一种优化某些目标优势比的解决方案:
例如,如果我的概率是P(A)= 14%,P(B)= 1%,P(C)= 8%,我的目标优势比是{2,3,4,2}那么我想要最小化的函数是我的目标比值比与我的解决方案给出的比值比之间差异的平方和:
objective.fc<-function(x){
f<-rep(NA,4)
f[1]<-((v4+v6+v7)*(1-(v1+v2+v3+v4+v5+v6+v7))/(v1*(v2+v3+v5))-2
f[2]<-((v4+v5+v7)*(1-(v1+v2+v3+v4+v5+v6+v7))/(v2*(v1+v3+v6))-3
f[3]<-((v5+v6+v7)*(1-(v1+v2+v3+v4+v5+v6+v7))/(v3*(v1+v2+v4))-4
f[4]<-((v4+v5+v6)*(1-(v1+v2+v3+v4+v5+v6+v7))/(v7*(v1+v2+v3))-2
f<-drop(t(f)%*%f) # sum of squares
return(f)
}
我的平等约束是:
v1+v4+v6+v7=0.14 # P(A)=14%
v2+v4+v5+v7=0.01 # P(B)=1%
v3+v5+v6+v7=0.08 # P(C)=8%
我的不等式约束是Vi必须在0和1之间,它们的总和不能超过1。
我使用了DEoptimR包中的JDEoptim函数,但我并不总是收敛。此外,当我得到收敛时,如果我不止一次运行优化器,我可以得到不同的解决方案,但如果我用各种解决方案计算目标函数,有些明显优于其他解决方案...
有没有办法可以解析分析而不是依赖迭代优化器?
答案 0 :(得分:1)
这不是一个难以解决的难度模型。我稍微重新表述(基本上用乘法替换除法并替换了一些常用表达式)并用全局求解器求解BARON:
我的结果是
---- VAR v
LOWER LEVEL UPPER
1 . 0.1319 1.0000
2 . 0.0052 1.0000
3 . 0.0719 1.0000
4 . . 1.0000
5 . . 1.0000
6 . 0.0033 1.0000
7 . 0.0048 1.0000
LOWER LEVEL UPPER
---- VAR w . 0.7829 1.0000
---- VAR f
LOWER LEVEL UPPER
1 -INF -1.3769 +INF
2 -INF 0.5244 +INF
3 -INF -3.3572 +INF
4 -INF 0.5346 +INF
LOWER LEVEL UPPER
---- VAR z -INF 13.7274 +INF
你可以自己尝试男爵here。我也相信其他NLP求解器工作正常。我尝试了一些本地NLP解算器,如CONOPT和MINOS,他们也给出了相同的结果。
答案 1 :(得分:0)
我使用JDEoptim()获得了与BARON基本相同的解决方案(参见下面的代码)。
> fn <- function(v) {
v1 <- v[1]; v2 <- v[2]; v3 <- v[3]
v4 <- v[4]; v5 <- v[5]; v6 <- v[6]
v7 <- v[7]
w <- 1 - (v1+v2+v3+v4+v5+v6+v7)
f <- c( (v4+v6+v7)*w / (v1*(v2+v3+v5)),
(v4+v5+v7)*w / (v2*(v1+v3+v6)),
(v5+v6+v7)*w / (v3*(v1+v2+v4)),
(v4+v5+v6)*w / (v7*(v1+v2+v3)) )
crossprod(f - c(2, 3, 4, 2))
}
> con <- function(v) {
v1 <- v[1]; v2 <- v[2]; v3 <- v[3]
v4 <- v[4]; v5 <- v[5]; v6 <- v[6]
v7 <- v[7]
c( v1+v4+v6+v7 - 0.14,
v2+v4+v5+v7 - 0.01,
v3+v5+v6+v7 - 0.08 )
}
> soln <- JDEoptim(rep(0, 7), rep(1, 7), fn, con, meq = 3, tol = 1e-7)
> round(soln$par, 4); soln$value
[1] 0.1319 0.0052 0.0719 0.0000 0.0000 0.0033 0.0048
[1] 13.72325
答案 2 :(得分:0)
由于差分进化(DE)是一种随机算法,因此JDEoptim()应该在每次运行时给出稍微不同的答案。 如果手头的问题有很多局部最小值,这意味着JDEoptim()有时可能会达到本地值,而不是全局最小值,以用于不同的复制运行。 诸如COBYLA之类的确定性算法将在不同的起始猜测的单独运行中表现出相同的行为。
对于诸如DE之类的进化算法,平等约束比不等式更难处理。因此,可能使用等式约束重新制定以明确地计算原始变量的子集(注意,那些变量的边界0 <= v <= 1必须作为约束明确地给出)将是更强大,更容易处理。这样做的另一个好处是可以将决策变量的数量减少到4而不是7。
答案 3 :(得分:0)
为了完整起见,我还要提到除了{2,3,4,2}之外我尝试了几个随机生成的目标优势比(runif(4, 0, 10)
)。 JDEoptim()在每个案例中找到了一个解决方案,在重复运行中可以忽略不计。
我还尝试用相同的发现随机地(runif(3)
)改变概率P(A),P(B)和P(C)。 (注意,这里的不等式约束v1+v2+v3+v4+v5+v6+v7 <= 1
不一定是多余的,就像原始值一样。)
当然,只有在生成的问题实例有意义的情况下,这才有意义。