Lineaarinen optimointi Julialla, ensiaskeleet

Tutustuessani Julia-yhteisöön huomasin nopeasti monien puhuvan minulle vieraista asioista kuiten numeerinen optimointi, Matlab, ja Fortran. Pakko myöntää, etten edes tiennyt Fortran-kielen olevan edelleen voimissaan. Päätin hieman tutustua aiheeseen, ainakin sen verran että tiedän mistä puhutaan, ja miksi Julian väitetään loistavan juuri näissä asioissa.

Löysin Courserasta kaksi lineaarisen optimoinnin kurssia. Molemmat olivat jo päättyneet, mutta toisesta oli materiaalit vielä saatavilla ja videot katseltavissa. Katsoin johdantoluennon läpi. Hämäriä muistikuvia jostain lukion matematiikan tunneilta… Ensimmäinen esimerkkitehtävä oli yksinkertainen kahden muuttujan optimointiongelma, joka oli ratkaistavissa kynällä ja paperilla - sopiva koekaniini matemaattiseen ohjelmointiin tarkoitetun JuMP-paketin testaukseen.

Tehtävä oli optimoida kahden juomasekoituksen (x ja y) tuotanto. Tehtävän kuvaus on seuraavanlainen:

  • juomilla on erilliset säilytysastiat joiden koko on rajallinen (5 ja 4)
  • juomat tuottavat eri määrän voittoa (100 ja 125)
  • juomiin tarvitaan kahta eri ainesosaa, joita on rajoitettu määrä (30 ja 44)
  • ainesosia juomiin kuluu eri määrä (3 ja 8, 6 ja 4)
  • optimoi voitto

Sain tehtävän ratkaistua suoraan Julian JuMP-paketin käyttöönotto-ohjeiden avulla:

# Pkg.add("JuMP")
# Pkg.add("Clp")
using JuMP

m = Model()

@defVar(m, 0 <= x <= 5 )
@defVar(m, 0 <= y <= 4 )

@setObjective(m, Max, 100x + 125y )
@addConstraint(m, 3x + 6y <= 30 ) 
@addConstraint(m, 8x + 4y <= 44 ) 

print(m)

status = solve(m)

println("Status: $status")
println("Objective value: ", getObjectiveValue(m))
println("x = ", getValue(x))
println("y = ", getValue(y))

JuMP hyödyntää Julian Lisp-tyyppisiä makroja (@-merkillä alkavat nimet), eikä ohjelma voisi juuri olla enää tämän yksinkertaisempi. Se on ongelman matemaattinen kuvaus, ilman riviäkään “tee-ensin-sitä-sitten-tee-tätä”-tyyppistä koodia.

Ajetaan ohjelma ja tulosteena on optimaalinen ratkaisu tuotannon järjestämiseen, 4 yksikköä x-tuotetta ja 3 yksikköä y-tuotetta, tuottaen voittoa 775.

Max 100 x + 125 y
Subject to 
3 x + 6 y <= 30
8 x + 4 y <= 44
0 ≤ x ≤ 5
0 ≤ y ≤ 4
Status: Optimal
Objective value: 775.0
x = 4.0
y = 3.0

Yllättävän helppoa.

Linkit

comments powered by Disqus
2014-10-4