因此,以下代码的目的是查找具有整数标准差的小数据集的示例。这可以表示为二次约束的混合整数二次规划,所以我尝试使用Julia的Gurobin。以下是我的代码:
using JuMP
using Gurobi
m = Model(solver = GurobiSolver() )
@variable(m, 0<= x[1:20] <= 100, Int)
@variable(m, Gj, Int)
@constraint(m, Gj == sum(x[1:20])/20 )
@variable(m, Var, Int)
@constraint(m, Var == sum( (x[1:20]-Gj).^2/19) )
@variable(m, sd, Int)
@constraint(m, sd * sd == Var)
### We need some restrictions to avoid all equal, < or zero, solutions:
@constraint(m, sd >= 5)
@objective(m, Min, sd)
print(m)
status = solve(m)
println("Objective value: ", getobjectivevalue(m) )
x = getvalue(x)
运行此结果:
ERROR: Gurobi.GurobiError(10021, "Quadratic equality constraints")
Stacktrace:
[1] optimize(::Gurobi.Model) at /home/kjetil/.julia/v0.6/Gurobi/src/grb_solve.jl:7
[2] optimize!(::Gurobi.GurobiMathProgModel) at /home/kjetil/.julia/v0.6/Gurobi/src/GurobiSolverInterface.jl:294
[3] #solve#101(::Bool, ::Bool, ::Bool, ::Array{Any,1}, ::Function, ::JuMP.Model) at /home/kjetil/.julia/v0.6/JuMP/src/solvers.jl:173
[4] solve(::JuMP.Model) at /home/kjetil/.julia/v0.6/JuMP/src/solvers.jl:148
有什么想法吗?
答案 0 :(得分:1)
像Gurobi Optimizer这样的数学编程求解器无法求解具有二次等式约束的模型。 Here are the types of constraints that Gurobi Optimizer can solve。要使用Gurobi Optimizer求解模型,必须将约束转换为其中一种形式,例如二次不等式约束。
答案 1 :(得分:0)
主要问题是,通常,二次等式不是凸的,并且大多数求解器仅适用于凸问题(加上整数约束)。两个二进制变量的乘积很容易线性化(等效于逻辑与),一个二进制变量和一个连续变量的乘积也很容易;其余的并不是那么容易。
从Gurobi 9开始,您可以解决非凸双线性问题,尤其是具有二次等式约束的问题。 You just have to add the right parameter。对于Gurobi.jl,如果m
是JuMP模型,则可以执行以下操作:
set_optimizer_attribute(m, "NonConvex", 2)