2017-10-02 13 views
2

私は混合整数プログラミングの問題があります。目的関数は、ベクトル内の最大変数値の最小化です。変数は上限が5です。この問題は次のようになります。最大変数を最小にする

m = Model(solver = GLPKSolverMIP()) 
@objective(m, Min, max(x[i] for i=1:12)) 
@variable(m, 0 <= x[i] <= 5, Int) 
@constraint(m, sum(x[i] for i=1:12) == 12) 
status = solve(m) 

最大変数はjulia JuMP構文の一部ではありません。だから私は、このソリューションは1で、変数の上限を起動するための反復的な問題を解くことによって仕事をしていませんし、solutoinが可能になるまで1ずつ増加

t=1 
while t<=5 && (status == :NotSolved || status == :Infeasible) 
    m = Model(solver = GLPKSolverMIP()) 
    i = 1:12 

    @objective(m, Min, max(x[i] for i=1:12)) 
    @variable(m, 0 <= x[i] <= t, Int) 
    @constraint(m, sum(x[i] for i=1:12) == 12) 

    status = solve(m) 
    t += 1 
end 

に問題を修正しました。これは本当にこれを行うための最善の方法ですか?

+1

私がよく理解していれば、元の問題は線形ではなく(最大のために)。 JuMPでは、NLP最適化のためにIpoptを使うことができます(しかし、IPOPTが混合整数非線形プログラミングをサポートしているかどうかわかりません) – Antonello

答えて

0

この問題は、最大値を最小にすることを望んでいます。この最大値を補助変数に保持してから最小値にします。これを行うには、制約を追加して、新しい変数が実際にはxの上限になるようにします。コードでは、次のとおりです。

julia> getValue(t) 
4.0 

julia> getValue(x) 
3-element Array{Float64,1}: 
4.0 
4.0 
4.0 

ポスターが解決したかった実際の問題は、おそらくこのことより複雑であるが、それは上の変動によって解決することができます。

using GLPKMathProgInterface 
using JuMP 

m = Model(solver = GLPKSolverMIP()) 

@variable(m, 0 <= x[i=1:3] <= 5, Int) # define variables 
@variable(m, 0 <= t <= 12)    # define auxiliary variable 
@constraint(m, t .>= x)    # constrain t to be the max 

@constraint(m, sum(x[i] for i=1:3) == 12) # the meat of the constraints 

@objective(m, Min, t)     # we wish to minimize the max 

status = solve(m) 

は、今、私たちは解決策を検査することができますこのフレームワーク。

関連する問題