MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

〇〇大 数学科の問題をJuliaの最適化ツールで解いてみた

目次

はじめに

この記事はJulia Advent Calendar 2017の18日目の記事です.

qiita.com

 

今回は下記の記事と同じことをJuliaでやってみました。

qiita.com

上記の記事はすべてPythonで書かれていますが、

今回はプログラミング言語としてJuliaを、

myenigma.hatenablog.com

最適化ライブラリとしては、JuMPを使いました。

myenigma.hatenablog.com

 

各問題の詳細については、前述の元の記事を参照ください。

 

割り当て問題

#
# 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

github.com

 

上記のコードを実行すると、

下記のような同じ結果が得られます。

f:id:meison_amsl:20171121154958p:plain

 

集合場所問題

#
# 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

github.com

こちらも結果が同じになりました。

f:id:meison_amsl:20171122113951p:plain

 

カックロ

#
# 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

github.com

 

こちらも結果が同じになりました。

f:id:meison_amsl:20171126115642p:plain

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com