目次
はじめに
この記事はJulia Advent Calendar 2017の18日目の記事です.
今回は下記の記事と同じことをJuliaでやってみました。
上記の記事はすべてPythonで書かれていますが、
今回はプログラミング言語としてJuliaを、
最適化ライブラリとしては、JuMPを使いました。
各問題の詳細については、前述の元の記事を参照ください。
割り当て問題
# # commadai q1 # # author: Atsushi Sakai # using JuMP using CPLEX solver = CplexSolver(CPX_PARAM_SCRIND=0) function main() println(PROGRAM_FILE," start!!") w = [6 5 6 5 6; 8 7 6 8 7; 4 5 4 4 5; 6 7 6 4 7; 10 8 10 7 10] # println(w) model = Model(solver=solver) @variable(model, x[1:5,1:5], Bin) @objective(model, Min, sum(w.*x)) for i in 1:5 @constraint(model, sum(x[:,i]) == 1) @constraint(model, sum(x[i,:]) == 1) end status = solve(model) range = [i for i in 1:5] mx = getvalue(x) name = ["A","B","C","D","E"] posi = ["1塁","2塁","3塁","SS","外野"] for i in 1:5 println(name[i], ",", posi[Int(sum(mx[i,:].*range))]) end println(PROGRAM_FILE," Done!!") end if contains(@__FILE__, PROGRAM_FILE) @time main() end
上記のコードを実行すると、
下記のような同じ結果が得られます。
集合場所問題
# # commadai q2 # # author: Atsushi Sakai # using JuMP using Ipopt solver=IpoptSolver(print_level=0) function main() println(PROGRAM_FILE," start!!") w = [1 2 1; 3 7 5; 5 3 2; 6 5 2; 7 1 3]# x,y,人数 println(w) model = Model(solver=solver) @variable(model, x[1:2]) obj = [] for i in 1:5 push!(obj, ((w[i,1]-x[1])^2+(w[i,2]-x[2])^2)*w[i,3]) end @objective(model, Min, sum(obj)) status = solve(model) println(getvalue(x)) println(PROGRAM_FILE," Done!!") end if contains(@__FILE__, PROGRAM_FILE) @time main() end
こちらも結果が同じになりました。
カックロ
# # commadai q3 # # author: Atsushi Sakai # using JuMP using CPLEX solver = CplexSolver(CPX_PARAM_SCRIND=0) function main() println(PROGRAM_FILE," start!!") hint_ind = [[1,2,3,4,5],[4,5,6,7,8],[3,6,7,9,10],[1,2,8,4,10],[1,7,3,9,5]] hint_sum = [19,20,35,11,31] model = Model(solver=solver) @variable(model, x[1:10,1:10], Bin) @objective(model, Min, sum(x[1,:])) for i in 1:10 @constraint(model, sum(x[:,i]) == 1) @constraint(model, sum(x[i,:]) == 1) end w = [i for i in 0:9] for i in 1:5 @constraint(model, sum(w.*x[:,hint_ind[i]]) == hint_sum[i]) end status = solve(model) mx = getvalue(x) println("omote") for i in 1:5 println(sum(w.*mx[:,i])) end println("ura") for i in 6:10 println(sum(w.*mx[:,i])) end println() println(PROGRAM_FILE," Done!!") end if contains(@__FILE__, PROGRAM_FILE) @time main() end
こちらも結果が同じになりました。
参考資料
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。