Simplex-menetelm menetelmän laskennalliset tekniikat 3. luento: Suuret LP-tehtävät sekä operaatiot harvoilla vektoreilla ja matriiseilla Matemaattisten algoritmien ohjelmointi Kevät 28 / 1 Suuret LP-teht tehtävät sekä operaatiot harvoilla vektoreilla ja matriiseilla Suuret LP-tehtävät Harvat vektorit Harvat matriisit Linkitetty lista Matemaattisten algoritmien ohjelmointi Kevät 28 / 2 1
Suuret LP-teht tehtävät Realistiset ongelmat helposti suuria Suuri muuttunut ajan kuluessa: Nykyään > 1 rajoitetta 196-luvulla muutama sata rajoitetta 195-luvulla suuri TSP 49 kaupunkia Algoritmisuunnittelun haaste: luotettavuus ja tehokkuus Suuret LP-tehtävät ajaneet ratkaisumenetelmien kehitystä eteenpäin Matemaattisten algoritmien ohjelmointi Kevät 28 / 3 LP-teht tehtävän n muistintarve LP-tehtävän koko matriisin A mukaan: mn Tyypillisesti matriisin alkiot tallennetaan 8 tavun (64 bitin) liukulukuina Matriisin A tallentamiseen tarvitaan 8mn tavua Jos A:ssa 1 riviä ja 2 saraketta, muistia tarvitaan 1.6 GB! Matemaattisten algoritmien ohjelmointi Kevät 28 / 4 2
Harvuus Tyypillisesti vain muutamia nollasta poikkeavia alkioita (keskimäärin 5-1 saraketta kohden) Merkitään: ν = nollasta poikkeavien alkioiden lukumäärä Matriisin (vektorin) tiheys: ( A) ν A ρ = mn 1 rajoitetta => tiheys <.1% Super harvuus: nollasta poikkeavilla alkioilla ainoastaan muutamia arvoja, esim. ±1 Matemaattisten algoritmien ohjelmointi Kevät 28 / 5 Adlittle.mps (56 riviä,, 97 saraketta) Nonzero pattern of Adlittle (56 rows, 97 columns) Column 1 2 3 4 5 6 7 8 9 1 1 2 Row 3 4 5 6 Matemaattisten algoritmien ohjelmointi Kevät 28 / 6 3
Greenpea.mps (2392 riviä,, 545 saraketta) Nonzero pattern of Greenbea (2392 rows, 545 columns) Column 5 1 15 2 25 3 35 4 45 5 55 5 1 Row 15 2 25 3 Matemaattisten algoritmien ohjelmointi Kevät 28 / 7 Kannan kääk äänteismatriisin päivittp ivittäminen Kannan vaihdon yhteydessä matriisi A kerrotaan matriisilla E (Elementary Transformation Matrix) Suurissa tehtävissä harvat matriisit, mutta näillä on taipumus täyttyä 1 O 1 η M p η M m η O a M a M a 1 p m 1 a 1 + a pη M = p a pη M m am + a pη Matemaattisten algoritmien ohjelmointi Kevät 28 / 8 4
Täyttyminen p x = η a Matemaattisten algoritmien ohjelmointi Kevät 28 / 9 Numeeriset ongelmat Liukulukujen tarkkuudesta voi seurata numeerisia ongelmia: pyöristysvirheet virheet matriisin/vektorin alkioiden kumoutumisessa Seurauksia: Epätarkka ratkaisu Väärä optimaalinen kanta Väärä vastaus koko tehtävään Singulaarinen kanta Käyvästä ratkaisusta epäkäypään Matemaattisten algoritmien ohjelmointi Kevät 28 / 1 5
Numeeristen ongelmien ratkaisuja Kannan käänteismatriisi lasketaan ajoittain uudestaan Kannan käänteismatriisin esitys: tulomuodossa (PFI) LU-hajotelmana Kaikki suuret LP-tehtävät eivät ole numeerisesti ongelmallisia! Matemaattisten algoritmien ohjelmointi Kevät 28 / 11 Simplexin tietorakenteet Harvojen vektorien ja matriisien tallennus ja käyttö ratkaisee Simplex-toteutuksen onnistumisen Staattiset tietorakenteet: Tarvittava muistin määrä tiedetään etukäteen Tieto ei muutu Esim. matriisi A Dynaamiset tietorakenteet: Koko ja tiedot muuttuvat jatkuvasti Muistin määrää ei voi ennustaa Esim. kannan kääntäminen tai hajottaminen Matemaattisten algoritmien ohjelmointi Kevät 28 / 12 6
Harvojen vektorien tallentaminen Voidaan tallentaa täysimittaisina vektoreina Pakattu muoto: tallennetaan ainoastaan nollasta poikkeavat alkiot (indeksi, arvo)-pareina: ( i, vi ), i Ζ Erilliset kokonaisluku- ja liukulukutaulukot T Esim. v = [ 1,,, 3,1 ] Ζ = { 1,4,5 }, Ζ = 3 Length 3 Index 1 4 5 Value 1, -3, 1, Tietorakenne voi olla järjestetty tai järjestämätön Matemaattisten algoritmien ohjelmointi Kevät 28 / 13 Perusoperaatiot harvoilla vektoreilla Kokoaminen (gather): täysimittainen (eksplisiittinen) vektori kootaan pakattuun muotoon Hajottaminen (scatter): pakattu vektori puretaan eksplisiittiseen muotoon Yleensä yksi harva vektori hajautetaan väliaikaiseen työtaulukkoon w w:n alkiot alustetaan nolliksi vain kerran w:n nollasta poikkeavat alkiot palautetaan operaation suorittamisen jälkeen nolliksi Siis: vältetään suurten työtaulukoiden alustamista! Matemaattisten algoritmien ohjelmointi Kevät 28 / 14 7
Harvan vektorin kerryttäminen Tyypillinen operaatio Simplex-menetelmässä: m u : = u + λv, u, v R Operaatio voitaisiin suorittaa suoraan järjestämättömillä pakatuilla vektoreilla Tehokkaampaa on hajottaa toinen vektori työtaulukkoon w Oletetaan täysimittainen työtaulukko alustettuna nollaksi m w R w:n alkioita muutetaan operaation aikana, mutta lopuksi se palautetaan nollaksi Matemaattisten algoritmien ohjelmointi Kevät 28 / 15 Harvojen vektorien kerryttäminen: menetelmä 1 1. Hajota vektori v työtaulukkoon w. 2. Jokaiselle u:n nollasta poikkeavalle u i :lle, tarkista vastaava w i. Jos wi poikkeaa nollasta, päivitä u i := u i + λw i. Aseta w i =. 3. Jokaiselle v:n nollasta poikkeavalle v i :lle, tarkista vastaava w i. Jos w i poikkeaa nollasta, u i := λv i. Lisää uusi alkio u:n tietorakenteeseen. Aseta w i =. Matemaattisten algoritmien ohjelmointi Kevät 28 / 16 8
Harvojen vektorien kerryttäminen: menetelmä 2 1. Hajota vektori u työtaulukkoon w. 2. Jokaiselle v:n nollasta poikkeavalle v i :lle, tarkista w i. Jos w i poikkeaa nollasta, päivitä w i := w i + λv i, muuten aseta w i := λv i. Lisää i u:n tietorakenteeseen. 3. Käy läpi muuttunut u:n tietorakenne ja aseta u i := w i. Aseta w i =. Matemaattisten algoritmien ohjelmointi Kevät 28 / 17 Menetelmien vertailua Jos vektorit ovat järjestetyssä tietorakenteessa, näiden skannaus voidaan tehdä ilman hajotusta Tällöin uuden alkion lisääminen vektoriin u voi tuhota järjestyksen Menetelmä 1 on tehokkaampi kuin menetelmä 2, jos vektoriin u lisätään vain yksi vektori Menetelmä 2 on tehokkaampi, jos vektoriin u lisätään useita vektoreita Operaatioiden lukumäärä riippuu vain nollasta poikkeavien alkioiden lukumäärästä, ei vektoreiden todellisesta koosta (m)! Matemaattisten algoritmien ohjelmointi Kevät 28 / 18 9
Pistetulo harvoilla vektoreilla Kahden vektorin u ja v pistetulo: u Oletetaan jälleen nollaksi alustettu työtaulukko w Alustetaan tulos dotprod := 1. Hajota vektori u työtaulukkoon w. 2. Jokaiselle vektorin v nollasta poikkeavalle alkiolle v i, päivitä dotprod := dotprod + v i w i. 3. Jokaiselle vektorin u nollasta poikkeavalle alkiolle u i, aseta w i =. T v = m i= 1 u v i i Matemaattisten algoritmien ohjelmointi Kevät 28 / 19 Harvojen matriisien tallentaminen Helppo tapa: kokoelma harvoja pysty- (tai vaaka-) vektoreita Sarakkeiden nollasta poikkeavat alkiot tallennetaan samaan taulukkoon peräkkäin Jokaisen sarakkeen alkukohta tallennetaan erikseen Jos sarakkeita ei tallenneta peräkkäin, pitää jokaisen sarakkeen pituus tallentaa erikseen Staattinen tietorakenne, pääasiallinen käyttökohde matriisin A tallentaminen (vain rakenteelliset muuttujat!) Matemaattisten algoritmien ohjelmointi Kevät 28 / 2 1
Esimerkki harvan matriisin tallentamisesta 1 A = 1 1 1 2 4 3 2 1 1 Index 1 2 3 4 5 6 7 8 9 1 Column begin 1 3 4 5 8 Column length 2 1 1 3 3 Row index 3 1 3 2 4 1 5 3 4 5 Value 1, -1, -1, -1, 4, 2, -3, 2, -1, 1, Matemaattisten algoritmien ohjelmointi Kevät 28 / 21 Linkitetty lista Dynaaminen tietorakenne Tarkoituksena välttää turhat etsimisoperaatiot Jokaiseen listan alkioon liitetään linkki (tai osoitin) seuraavaan alkioon Listan viimeisestä alkiosta lähtevä linkki on väärä Linkki listan alkuun (header) tallennetaan erikseen Matriisi voidaan tallentaa harvojen linkitettyjen pystyvektorien kokoelmana Matemaattisten algoritmien ohjelmointi Kevät 28 / 22 11
Esimerkki linkitetystä listasta 1 A = 1 1 1 2 4 3 2 1 1 Index 1 2 3 4 5 6 7 8 9 1 Column header 9 1 1 2 7 Row index 3 1 5 4 3 4 3 5 1 2 Value -1, 2, -3, 4, 1, -1, 2, 1, -1, -1, Row link 4 3 8 6 5 Matemaattisten algoritmien ohjelmointi Kevät 28 / 23 Alkion lisää ääminen linkitettyyn listaan Vektori v = [3,,, 7,, 4, 2,, ] T, muutetaan v 9 = 3 Index 1 2 3 4 Header 1 Row index 4 6 1 7 Value 7, 4, 3, 2, Row link 3 4 2 Index 1 2 3 4 5 6 Header 6 Row index 4 6 1 7 * 9 Value 7, 4, 3, 2, * 3, Row link 3 4 2 * 1 Matemaattisten algoritmien ohjelmointi Kevät 28 / 24 12
Alkion poistaminen linkitetystä listasta Vektori v = [3,,, 7,, 4, 2,, 3] T, muutetaan v 1 = Index 1 2 3 4 5 6 Header 6 Row index 4 6 1 7 * 9 Value 7, 4, 3, 2, * 3, Row link 3 4 2 * 1 Index 1 2 3 4 5 6 Header 6 Row index 4 6 * 7 * 9 Value 7, 4, * 2, * 3, Row link 2 4 * * 1 Matemaattisten algoritmien ohjelmointi Kevät 28 / 25 Kahteen suuntaan linkitetty lista 1 A = 1 1 1 3 2 1 1 Index 1 2 3 4 5 6 7 8 9 1 CF header 9 1 1 2 7 CB header 5 1 1 3 8 Row index 3 1 5 4 3 4 3 5 1 2 Value -1, 2, -3, 4, 1, -1, 2, 1, -1, -1, RF link 4 3 8 6 5 RB link 4 2 9 7 6 2 4 Matemaattisten algoritmien ohjelmointi Kevät 28 / 26 13
Kun pystyvektorit eivät t riitä Esim. kannan kääntämisessä pitää tietää vaakavektorit, joissa on yhtä monta nollasta poikkeavaa alkiota Kannan kääntäminen hidastuu, jos joudutaan tutkimaan koko matriisi Tarvitaan siis tietorakenne, joka linkittää matriisin A vaakavektorit sopivasti toisiinsa Matemaattisten algoritmien ohjelmointi Kevät 28 / 27 Vaakavektoreiden joukot Muodostetaan joukot vaakavektoreista, joilla sama määrä nollasta poikkeavia alkioita Jokaiselle joukolle muodostetaan oma linkitetty lista Vaakavektoreiden linkitettyjen listojen kokonaispituus voi olla enintään m Kaikki linkitetyt listat samaan taulukkoon Osoittimet erottelevat listat toisistaan Matemaattisten algoritmien ohjelmointi Kevät 28 / 28 14
Eteen- ja taaksepäin linkitetty lista Olkoon n nollasta poikkeavien alkioiden maksimimäärä riviä kohden Matriisissa on m riviä, jotka täytyy jakaa listoihin Muodostetaan kaksi taulukkoa kooltaan m+n, sekä eteen- että taaksepäin linkeille Ensimmäiset m paikkaa taulukossa on varattu vaakavektoreiden linkeille Paikat m+1 n ovat vaakavektorilistojen alkuosat Listaan m+i linkitetään kaikki vaakavektorit, joissa i kpl nollasta poikkeavia alkioita, m+1 m+i m+ n Matemaattisten algoritmien ohjelmointi Kevät 28 / 29 Listan alustus Kaikkien listojen alkuosat osoittavat itseensä Tyhjät rivit on poistettu flink blink Matemaattisten algoritmien ohjelmointi Kevät 28 / 3 15
Alkion lisäys listaan Aluksi vaakavektori 7 lisätään listaan 5, eli vaakavektorissa 7 on 5 nollasta poikkeavaa alkiota flink blink Matemaattisten algoritmien ohjelmointi Kevät 28 / 31 Toisen alkion lisäys listaan Vaaka vektori 1 lisätään listaan 5 flink blink Matemaattisten algoritmien ohjelmointi Kevät 28 / 32 16
Alkion poistaminen listasta Poistetaan vaakavektori 7 flink blink Matemaattisten algoritmien ohjelmointi Kevät 28 / 33 Paluu alkutilaan Poistetaan vaakavektori 1 Nyt kaikkien listojen alkuosat osoittavat itseensä flink blink Matemaattisten algoritmien ohjelmointi Kevät 28 / 34 17
Yhteenveto Tietorakenteiden suunnittelussa joskus kannattaa säästää muistia ja joskus tuhlata Minkä tahansa algoritmin tärkein ominaisuus harvoilla matriiseilla ja vektoreilla: laskentaoperaatioiden lukumäärä ei riipu matriisin tai vektorin todellisesta koosta vaan nollasta poikkeavien alkioiden lukumäärästä. Linkitettyä listaa voidaan käyttää useisiin eri tarkoituksiin Simplexissä: Matriisin/vektorin tallennus staattisesti/dynaamisesti Nollasta poikkeavien alkioiden määrä rivillä nopeasti Matemaattisten algoritmien ohjelmointi Kevät 28 / 35 Kirjallisuutta Adler, I. et al (1989). Data Structures and Programming Techniques for the Implementation of Karmarkar s Algorithm. ORSA Journal on Computing 1, 84-16. Duff, I. et al (1986). Direct Methods for Sparse Matrices. Oxford Science Publications. Clarendon Press, Oxford. Gay, D. (1985). Electronic mail distribution of linear programming test problems. COAL Newsletter 13, 1-12. http://www.netlib.org Matemaattisten algoritmien ohjelmointi Kevät 28 / 36 18
Kirjallisuutta George, A. and Liu, W.-H. (1981). Computing Solution of Large Sparse Positive Definite Systems. Prentice-Hall, Englewood Cliffs, N.J. Greenberg, H., editor (1978). Design and Implementation of Optimization Software, NATO ASI. Sijthoff and Nordhoff. Gustavson, F. (1972). Some basic techniques for solving sparse systems of linear equations, in Sparse Matrices and Their Applications, Plenum Press. Kalan, J. (1971). Aspects of Large-Scale In-Core Linear Programming, in Proceedings of the 1971 annual conference of the ACM, pp. 34-313. ACM. Matemaattisten algoritmien ohjelmointi Kevät 28 / 37 19