Matemaattinen optimointi I, demo 3 29.1.2015 Demo 3 järjestetään Quantumin mikroluokassa normaaleina demoaikoina. Tavoitteena on harjoitella kurssilla tarvittavien optimointiohjelmistojen käyttöä. Demopisteet saat tulemalla paikalle ja olemalla aktiivinen eli tehtäviä ei tarvitse ratkaista etukäteen. Vaihtoehtoisesti (jos uskot, ettet tarvitse apua ohjelmistojen käytössä) voit tulla keskustelemaan asiasta Napsun kanssa (reilusti) ennen demotilaisuutta huoneeseen 206.2. Huom! Kurssiin kuuluva harjoitustyö tullaan ratkaisemaan jollain valmisohjelmalla (esim. LINDO, LINGO tai CPLEX). Yliopistolla on käytössään hyvin vanhat versiot sekä LINDOsta että LINGOsta. Uudet versiot kotikoneelle voi ladata sivuilta www.lindo.com/ (LINDO ja LINGO) ja www.ilog/products/cplex/ (CPLEX). Mikroluokan tilaisuudessa opetellaan käyttämään kahta valmisohjelmistoa yllämainituista. Näissä ohjeissa on ensin annettu ohjeet LINDOn käyttöön ja hakasulkeissa vastaavat komennot CPLEXin käyttämiseksi. Jäljempänä on annettu ohjeet LINGOn käyttämiseksi. Voit valita käyttämäsi ohjelmistot vapaasti. Kirjoita muistiin vastaukset kursiivilla esitettyihin kysymyksiin. Avaa yhteys tietokoneeseen. Mikroluokan LINDO käynnistyy valikosta Start All Programs LINDO Solver Suite LINDO 5.3 for DOS [CPLEX löytyy valikosta Start All Programs ILOG CPLEX11.2 Content Folder bin x86 win32 cplex]. LINDOn [CPLEXn] tärkeimmät komennot ovat help [help], jonka avulla saa tietoa eri komennoista ja com [], joka tulostaa käytettävissä olevat komennot ruudulle. 1. Ratkaistaan optimointitehtävä max 30x 1 +40x 2, st 2x 1 +5x 2 50, 8x 1 +3x 2 130, Käynnistä LINDO [CPLEX]. Syötä tehtävä komennolla max [Aloita syöttö komennolla enter. Syötä tehtävä komennolla maximize]. Kohdefunktion jälkeen kirjoita st [subject to], jonka jälkeen voit syöttää rajoitteet [laatikkorajoitteet syötetään määreellä bounds]. Syöttö lopetetaan kirjoittamalla []. LINDOssa tehtävän pitäisi näyttää tältä max 30 x1 + 40 x2 st 2 x1 + 5 x2 <= 50 8 x1 + 3 x2 <= 130 x1>=0
x2>=0 ja CPLEXissä vastaava tehtävä esitetään muodossa maximize 30 x1 + 40 x2 subject to 2 x1 + 5 x2 <= 50 8 x1 + 3 x2 <= 130 bounds x1>=0 x2>=0 Tarkista komennolla look all [display problem all], että tehtävä on oikein syötetty. Jos huomaat virheitä korjaa ne komennolla alt [change] (tietoa alt [change]-komennon toiminnasta saa kirjoittamalla help alt [help change]). Ratkaise tehtävä komennolla go [primopt tai optimize]. Vastaa LINDOn esittämään kysymykseen DO RANGE...? kirjaimella y (pelkkä Returnnäppäimen painallus tarkoittaa samaa kuin n) [Aja herkkyysanalyysi komennolla display sensitivity obj *. Muuttujien arvot saat tulostettua komennolla display solution variables *]. Paljonko objektifunktion kerroin 30 voi muuttua ilman, että ratkaisu muuttuu? 2. Muutetaan optimointitehtävä muotoon max 30x 1 +40x 2, st 2x 1 +5x 2 50, 9x 1 +4x 2 120, x 1 +2x 2 5, rajoitetta muutettu rajoite lisätty Muokkaa ensin toinen rajoite yllä olevaan muotoon komennolla alt [change]. Lisää sitten kolmas rajoite komennolla ext [add]. Tarkista tehtävä komennolla look all [display problem all]. Ratkaise tehtävä komennolla go [primopt]. Tallenna tehtävä tiedostoon myöhempää käyttöä varten komennolla save [write]. Anna tiedostolle jokin sopiva nimi (esim. lindod1). Huom! LINDOn tiedosto tallentuu binäärimuodossa, joten sitä ei kannata esimerkiksi tulostaa näytölle tai paperille. Sen sijaan se voidaan lukea LINDOn komennolla retr (retrieve). [CPLEX kysyy
tallentaessa tiedoston nimen ja formaatin (lp = linear programming). Tiedosto on muokattavissa millä tahansa tekstieditorilla ja luettavissa komennolla read.] Seuraavaksi kirjoitetaan ratkaistava optimointitehtävä tekstitiedostoon ja luetaan se sieltä LINDOon. Tätä varten lopeta LINDO komennolla quit. 3. Kirjoita jollain editorilla (esimerkiksi xemacs tai notepad) tekstitiedosto, jossa on alla oleva sisältö. Anna tiedostolle jokin sopiva nimi (esim. lindod2) ja tallenna se m: -levyllesi (My Documents -kansioon). min 15 x1-25 x2-35 x3 st 4 x1 + 3 x2 - x3 < 40 - x1 + 6 x2 + 2 x3 < 60 2 x1 - x2 + 3 x3 < 80 leave Huomaa, että tiedoston lopussa on oltava komento leave. [CPLEXissä komentoa leave ei tarvita. Ei myöskään edellä ollutta enter-komentoa.] Käynnistä LINDO [CPLEX] uudestaan. Lue tekstitiedosto LINDOon komennolla take (edellisen tehtävän binääritiedoston luku ei onnistu take-komennolla) [read]. Tarkista tehtävä komennolla look all [display problem all]. Ratkaise tehtävä komennolla go [primopt]. 4. Jatketaan tehtävässä 2 käsitellyn optimointitehtävän muokkaamista. Lue tallennettu binääritiedosto LINDOon komennolla retr. Muunnetaan tehtävä muotoon max 30x 1 +40x 2, st 9x 1 +4x 2 120, 2x 1 +5x 2 10, rajoite poistettu rajoitetta muutettu Poista ensin ensimmäinen rajoite komennolla del. Muokkaa sitten jälkimäinen rajoite yllä olevaan muotoon komennolla alt. [CPLEXissä tämä onnistuu parhaiten muokkaamalla tekstitiedostoa ja lukemalla se read-komennolla uudelleen ohjelman muistiin muokkauksen jälkeen. Jos kuitenkin haluat tehdä tämän ohjelmasta käsin tarvittavat komennot ovat change delete ja change coefficient.]
Tarkista tehtävä komennolla look all [display problem all]. Ratkaise tehtävä komennolla go [primopt]. Paljonko jälkimmäisen rajoitteen vakio 10 voi muuttua ilman, että ratkaisu muuttuu? Jos unohdit vastata y kysymykseen DO RANGE...?, niin saman tulostuksen saa myös komennolla range [display sensitivity]. Tarvittaessa myös ratkaisu voidaan tulostaa uudelleen komennolla solution [display solution]. 5. Muuta edellinen optimointitehtävä binääriseksi sekalukuoptimointitehtäväksi rajoittamalla x 1 saamaan vain arvoja 0 tai 1. LINDOssa tämä tapahtuu komennolla int. Tässä tapauksessa saadaan aikaiseksi sama tulos sekä komennolla int x1, joka muuttaa muuttujan x 1 binääriseksi että komennolla int 1, joka muuttaa ensimmäisen muuttujan binääriseksi (tarkalleen ottaen komento int n muuttaa n ensimmäistä muuttujaa binäärisiksi). [CPLEXissä pitää lineaarinen optimointiongelma ensin muuttaa sekalukuoptimointiongelmaksi. Tämä tapahtuu komennolla change problem milp. Tämän jälkeen voidaan muuttuja x 1 muuttaa binääriseksi komennolla change type x1 b.] Tarkista tehtävä komennolla look all [display problem all]. Ratkaise tehtävä komennolla go[optimize(huom! komento primopt ei toimi, koska kyseessä on sekalukutehtävä)]. Huomioita LINDOn käytöstä: rajoitteita kirjoittaessa muuttujien pitää olla (epä)yhtälön vasemmalla ja vakioiden oikealla puolella; kertomerkkiä ei tarvitse kirjoittaa; epäyhtälöissä riittää kirjoittaa <, LINDO käsittää sen -merkkinä; muuttujat ovat aina ei-negatiivisiä, ellei niitä erikseen vapauteta komennolla free; komento edit antaa hieman vapaammat kädet mallin käsittelemiseen; komennolla divert voidaan tulostus ohjata haluttuun tiedostoon. Lopeta LINDO kirjoittamalla quit. Huomioita CPLEXin käytöstä: epäyhtälöissä riittää kirjoittaa <, CPLEX käsittää sen -merkkinä; muuttujat ovat aina ei-negatiivisiä, ellei niitä erikseen vapauteta, komennoissa riittää kirjoittaa komentoa niin pitkälle että se on yksikäsitteinen, esim. maximize = max. Jatkossa CPLEXin komentoja ei enää erikseen mainita. Tarvittavat komennot on jo esitelty edellä. LINGO käynnistyy valikosta Start All Programs LINDO Solver Suite LINGO 3.0 for Windows.
6. Ratkaistaan optimointitehtävä max 45x 1 +25x 2, st 3x 1 +5x 2 75, 4x 1 x 2 +45, Käynnistä LINGO. Mallin syöttö aloitetaan komennolla model:. Objektifunktion syöttö aloitetaan kirjoittamalla max= (tai min=). Rajoitteet syötetään suoraan ilman komentoa st. Jokaisen lauseen jälkeen (poislukien model ja ) tulee merkitä puolipiste ja kertomerkit pitää merkitä explisiittisesti (LINGO ratkaisee myös epälineaarisia tehtäviä eikä näin ollen osaa/halua tulkita vakioita ja muuttujia). Syöttö lopetetaan kirjoittamalla. Tarkista komennolla Ctrl l (tai LINGO-valikosta look), että tehtävä on oikein syötetty. Tarvittaessa voit editoida suoraan alkuperäistä muotoiluasi. Ratkaise tehtävä komennolla Ctrl s (tai LINGO-valikosta solve). Ratkaisu tulostuu Reports-ikkunaan. Tee vielä herkkyysanalyysi komennolla Ctrl r (tai LINGOvalikosta range). Millä välillä objektifunktion muuttujan x 2 kertoimen on oltava, jotta ratkaisu ei muuttuisi? 7. Muutetaan optimointitehtävä muotoon max 45x 1 +25x 2, st 2x 1 +7x 2 55, rajoitetta muutettu 4x 1 x 2 +45, 2x 1 3x 2 15, rajoite lisätty Tämä onnistuu helposti muokkaamalla alkuperäistä malliasi. Tarkista tehtävä komennolla Ctrl l ja ratkaise se komennolla Ctrl s. Tallenna tehtävä käyttämällä save -kuvaketta tai käskyä Save As... valikosta File. Anna tiedostolle jokin sopiva nimi (esim. lingod1) ja tallenna se m: -levylle. Seuraavaksi kirjoitetaan ratkaistava optimointitehtävä tekstitiedostoon ja luetaan se sieltä LINGOon. 8. Kirjoita jollain editorilla tekstitiedosto, jossa on alla oleva sisältö. Anna tiedostolle jokin sopiva nimi (esim. lingod2) ja tallenna se m: -levylle.
model: min= 20*x1 + 10*x2-30*x3; x1-4*x2 + 3*x3 < 15; 3*x1 + x2-3*x3 < 65; 3*x1 + 5*x2 - x3 < 35; Huomaa, että tiedoston lopuun ei tarvita mitään erityistä loppukomentoa (vrt. leave LINDOssa). Avaa tiedosto LINGOssa käyttämällä Window -valikosta löytyvää Command Windowsia ja siellä käskyä take. Tarkista tehtävä komennolla Ctrl l (tai kirjoita Command Windowsiin look all) ja ratkaise se komennolla Ctrl s. 9. Jatketaan tehtävässä 7 käsitellyn optimointitehtävän muokkaamista. Lue tallennettu tiedosto LINGOon käyttämällä open file -kuvaketta tai käskyä Open valikosta File. Muuta tehtävä binääriseksi sekalukuoptimointitehtäväksi rajoittamalla x 2 saamaan vain arvoja 0 tai 1. Tämä tapahtuu komennolla @bin(x2) (missä x2 on luonnollisestikin halutun binäärisen muuttujan nimi). Tarkista tehtävä ja ratkaise se. Huomioita LINGOn käytöstä: muuttujien ja vakioiden paikkoja (epä)yhtälöissä ei ole rajoitettu; kertomerkki pitää kirjoittaa näkyviin; epäyhtälöissä riittää kirjoittaa <, LINGO käsittää sen -merkkinä; muuttujat ovat aina ei-negatiivisiä, ellei niitä erikseen vapauteta komennolla @free(x), missä X on muuttujan nimi; muut lauseet paitsi model, sets, sets, data, data ja on lopetettava puolipisteeseen; kommentit alkavat huutomerkillä (ja loppuvat puolipisteeseen). 10. Ratkaise luentomonisteen esimerkki 4.2 s.43 haluamallasi valmisohjelmalla(esim. LINDO, LINGO tai CPLEX). Aja myös herkkyysanalyysi. Millä välillä muuttujan x 1 yläraja (nykyinen arvo 75) voi muuttua ilman että optimikanta muuttuu?