4

我试图在二次不等式约束和线性等式约束以及下限和上限下实现简单的最小化。我的问题如下:

最小值:x1*(-0.00498) + x2*0.05656

uc:

  • x1^2 * 0.00001048 + 2*x1*x2*0.001431 + x2^2*0.6737996 <= 0.0084050
  • x1 + x2 = 1.0
  • 0 < x1 < 0.9
  • 0 < x2 < 0.9

一旦使用 Alglib 在 F# 中实现,似乎就没有遵守约束。和 x1+x2 都不等于 1.0,方差也不低于 0.0084。尽管考虑了下限和上限,但我使用 x2 的目标函数比使用 x0 得到了改进(低于)。我相信我对约束的表述有问题,但我看不出是哪一个。

l

let nsfunc2_jac(x:float[]) (fi:float[])(jac:float[,])=
   fi.[0] <- -(x.[0]*-0.00498+x.[1]*0.05656)
   fi.[2] <- x.[0]+x.[1]+x.[2]-1.0
   fi.[1] <- x.[0]*x.[0]*0.00001048 + 2.0*x.[0]+x.[1]*0.001431 + x.[1]*x.[1]*0.6737996-0.0084050
   jac.[0,0] <- -0.00498
   jac.[0,1] <- 0.05656
   jac.[2,0] <- 1.0
   jac.[2,1] <- 1.0
   jac.[1,0] <- 2*x.[0]*0.00001048 + 2*x[1]*0.001431
   jac.[1,1] <- 2*x.[0]*0.001431 + 2+x[1]*0.6737996

let mutable state2 = new alglib.minnlcstate()
let mutable rep2 = new alglib.minnlcreport()
let mutable nrep = new alglib.ndimesional_rep(func2)
let x0 = [|0.8999, 0.1001|]
alglib.minnlccreate(2,x0, &state2)
alglib.minnlcsetalgoaul(state2, 1000.0, 15.0)
alglib.minnlsetcond(state2, 0.000001,10.0)
alglib.minnlcsetscale(state2, [|1.0,1.0|])
alglib.minnlcsetprecexactlowrank(state2, 5.0)
alglib.minnlcsetnlc(state2, 1,1)
alglib.minnlcsetbc(state2, [|0.0,0.0|], [|0.9,0.9|])

alglib.minnlcoptimize(state2, jac, nrep, None)
let x2, rep = alglib.minnlcresults(state2)
let var = x2.[0]*x2.[0]*0.00001048 + 2.0*x2.[0]+x2.[1]*0.001431 + x2.[1]*x2.[1]*0.6737996
printfn "Variance: %s" var.ToString()

我得到 Var = 0.53 远高于 0.0084050 目标。事实上,在第一次迭代之后,我的等式和我的不等式约束都被打破了,算法永远不会回到这个范围内。

更令人担忧的是,我收到一个答案 TerminationType = 1 -> OK

4

0 回答 0