Lineáris belsőpontos Newton-iteráció

Hasonló dokumentumok
Programozás burritokkal

Tulajdonságalapú tesztelés

Lineáris programozás belsőpontos

Konjugált gradiens módszer

11. Előadás. 1. Lineáris egyenlőség feltételek melletti minimalizálás

Diszkrét Matematika MSc hallgatók számára. 4. Előadás

Nemlineáris programozás: algoritmusok

Tisztán funkcionális adatszerkezetek

2016, Funkcionális programozás

4. Előadás: Erős dualitás

2019, Funkcionális programozás. 5. el adás. MÁRTON Gyöngyvér

Tisztán funkcionális adatszerkezetek (folytatás)

Numerikus matematika vizsga

FUNKCIONÁLIS PROGRAMOZÁS ELŐADÁS JEGYZET

Optimalizálás alapfeladata Legmeredekebb lejtő Lagrange függvény Log-barrier módszer Büntetőfüggvény módszer 2017/

Diszkrét Matematika. zöld könyv ): XIII. fejezet: 1583, 1587, 1588, 1590, Matematikai feladatgyűjtemény II. (

2018, Funkcionális programozás

Diszkrét Matematika MSc hallgatók számára. 14. Előadás

Funkcionális Nyelvek 2 (MSc)

1 Lebegőpontos számábrázolás

Az ellipszoid algoritmus

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

Matematikai geodéziai számítások 5.

Amortizációs költségelemzés

Tisztán funkcionális adatszerkezetek (folytatás)

szimplex algoritmust ellipszoid módszerét, projektív skálázású primál algo- ritmusát,

FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET

A szimplex tábla. p. 1

11. Előadás. 11. előadás Bevezetés a lineáris programozásba

17. előadás: Vektorok a térben

Numerikus módszerek I. zárthelyi dolgozat, 2009/10. I. félév, A. csoport, MEGOLDÁSOK

Matematikai alapok. Dr. Iványi Péter

Nemlineáris programozás 2.

Matematika (mesterképzés)

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

A Farkas lemmától az EP-tételekig

Gauss-Seidel iteráció

Kronecker-modulusok kombinatorikája és alkalmazások

10. Előadás. 1. Feltétel nélküli optimalizálás: Az eljárás alapjai

Példa Hajtsuk végre az 1 pontból a Dijkstra algoritmust az alábbi gráfra. (A mátrixban a c i j érték az (i, j) él hossza, ha nincs él.

Molnár Bence. 1.Tétel: Intervallumon értelmezett folytonos függvény értékkészlete intervallum. 0,ami ellentmondás uis. f (x n ) f (y n ) ε > 0

Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók

Numerikus matematika. Irodalom: Stoyan Gisbert, Numerikus matematika mérnököknek és programozóknak, Typotex, Lebegőpontos számok

Lin.Alg.Zh.1 feladatok

Optimalizálási eljárások MSc hallgatók számára Előadás

értékel függvény: rátermettségi függvény (tness function)

NUMERIKUS MÓDSZEREK I. TÉTELEK

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Lineáris algebra mérnököknek

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Denavit-Hartenberg konvenció alkalmazása térbeli 3DoF nyílt kinematikai láncú hengerkoordinátás és gömbi koordinátás robotra

2018, Funkcionális programozás

Problémás regressziók

Gazdasági matematika II. vizsgadolgozat megoldása, június 10

Felhasználó által definiált adattípus

Intergrált Intenzív Matematika Érettségi

A félév során előkerülő témakörök

Programozási módszertan. Függvények rekurzív megadása "Oszd meg és uralkodj" elv, helyettesítő módszer, rekurziós fa módszer, mester módszer

2016, Funkcionális programozás

Általánosan, bármilyen mérés annyit jelent, mint meghatározni, hányszor van meg

Algoritmusok Tervezése. 4. Előadás Visual Basic 1. Dr. Bécsi Tamás

illetve a n 3 illetve a 2n 5

Lin.Alg.Zh.1 feladatok

Numerikus módszerek beugró kérdések

Tartalom. 1. Állapotegyenletek megoldása 2. Állapot visszacsatolás (pólusallokáció)

Bevezetés az algebrába 2 Differencia- és differenciálegyenlet-rendszerek

Totális Unimodularitás és LP dualitás. Tapolcai János

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

A KroneckerCapelli-tételb l következik, hogy egy Bx = 0 homogén lineáris egyenletrendszernek

Numerikus módszerek I. zárthelyi dolgozat (2017/18. I., A. csoport) Megoldások

Matematikai alapok. Dr. Iványi Péter

2. SZÉLSŽÉRTÉKSZÁMÍTÁS. 2.1 A széls érték fogalma, létezése

Gráfok, definíciók. Gráfok ábrázolása. Az adott probléma megoldásához ténylegesen mely műveletek szükségesek. Ábrázolások. Példa:

Miért fontos számunkra az előző gyakorlaton tárgyalt lineáris algebrai ismeretek

Dualitás Dualitási tételek Általános LP feladat Komplementáris lazaság 2017/ Szegedi Tudományegyetem Informatikai Intézet

Opkut deníciók és tételek

PROGRAMOZÁS tantárgy. Gregorics Tibor egyetemi docens ELTE Informatikai Kar

Adatbányászati szemelvények MapReduce környezetben

2018, Funkcionális programozás

Számítógépes döntéstámogatás. Genetikus algoritmusok

1. Házi feladat. Határidő: I. Legyen f : R R, f(x) = x 2, valamint. d : R + 0 R+ 0

Számítógépes Grafika mintafeladatok

Programkonstrukciók A programkonstrukciók programfüggvényei Levezetési szabályok. 6. előadás. Programozás-elmélet. Programozás-elmélet 6.

Kifejezések. Kozsik Tamás. December 11, 2016

Alap-ötlet: Karl Friedrich Gauss ( ) valószínűségszámítási háttér: Andrej Markov ( )


2018, Funkcionális programozás

Norma Determináns, inverz Kondíciószám Direkt és inverz hibák Lin. egyenletrendszerek A Gauss-módszer. Lineáris algebra numerikus módszerei

Bevezetés az algebrába 2

értékel függvény: rátermettségi függvény (tness function)

2018, Funkcionális programozás

Károlyi Katalin Eötvös Loránd Tudományegyetem Alkalmazott Analízis Tanszék. Abstract

Gazdasági matematika II. vizsgadolgozat, megoldással,

Nem teljesen kitöltött páros összehasonlítás mátrixok sajátérték optimalizálása Newton-módszerrel p. 1/29. Ábele-Nagy Kristóf BCE, ELTE

Lineáris leképezések. 2. Lineáris-e az f : R 2 R 2 f(x, y) = (x + y, x 2 )

Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }

Numerikus módszerek II. zárthelyi dolgozat, megoldások, 2014/15. I. félév, A. csoport. x 2. c = 3 5, s = 4

Modellek és Algoritmusok - 2.ZH Elmélet

Matematikai geodéziai számítások 5.

Átírás:

Lineáris belsőpontos Newton-iteráció Implementáció Haskellben Dr. Érdi Gergő http://gergo.erdi.hu/ Az alábbiakban összeállítunk egy Haskell modult, amely a belsőpontos Newton-iteráció algoritmusával old meg lineáris programozási feladatokat. module InteriorNewton where 1. Reprezentáció A lineáris algebrai műveletek megvalósítását a HMatrix csomagból vesszük át: import Foreign.Storable import Data.Packed.Vector import Data.Packed.Matrix import Numeric.LinearAlgebra.Algorithms import Numeric.LinearAlgebra.Linear import Numeric.LinearAlgebra.Interface import Numeric.LinearAlgebra.Instances A megoldási folyamat naplózásához a Writer monádot használjuk: import qualified Control.Monad.Writer as W import Control.Monad.Loops (dropwhilem) import Control.Monad (liftm) Kétszeres pontosságú, lebegőpontos számábrázolást fogunk használni, ezért minden vektorunk és mátrixunk Double elemeket tárol. Az egyszerűség kedvéért bevezetjük az alábbi típusszinonímákat. A tovec segédfüggvényre azért van szükségünk, mert a HMatrix csomag megkülönbözteti a vektorokat és az egyoszlopos mátrixokat. type Vec = Vector Double type Mtx = Matrix Double tovec :: Mtx Vec tovec = head tocolumns A megoldandó lineáris programozási feladatot az alábbi formában várjuk el: min c T x A x = b x 0 1

Egy ilyen feladatot az alábbi algebrai adattípussal reprezentálunk: data Problem = Problem {prob A :: Mtx, prob b :: Vec, prob c :: Vec} deriving Show 2. ε-egyenlőség A lebegőpontos számábrázolás korlátai, illetve a numerikus hibák feltorlódása miatt számok, illetve vektorok egyenlőségét nem érdemes szigorúan néznünk, ezért bevezetjük az alábbi relációt: infix 4 class Approx a where ( ) :: a a Bool ε = 10 6 instance Approx Double where 2 x y x y = 1 + x + y < ε instance (Storable a, Approx a) Approx (Vector a) where x y = and $ zipwith ( ) (tolist x) (tolist y) 3. Naplózás data OptimizationStep = Infeasible (Vec, Vec, Vec) Double Feasible (Vec, Vec, Vec) deriving Show type Logging a = W.Writer [OptimizationStep] a writelog :: OptimizationStep Logging () writelog x = W.tell [x] iterateuntil :: (a Bool) (a OptimizationStep) (a a) a Logging a iterateuntil isfinished logger step initial = liftm head $ dropwhilem notfinished (iterate step initial) where notfinished x = do writelog (logger x) return ( (isfinished x)) 4. A feladat perturbálása Ahhoz, hogy kezdeti belső megoldásunk legyen, a feladatot az alábbi formában perturbáljuk, azzal a céllal, hogy ν = 1, ζ = 1 esetén választhassuk az (e, 0, e) vektor-hármast kezdeti megoldásnak, és ν 0 esetén az eredeti feladathoz tartsunk: ahol A x = b ν r b A T y + s = c ν r c 2

r b := b ζa e r c := c ζe A megvalósítás során a ζ paraméter értékét fixen 1-en tartjuk. perturbation :: Problem (Vec, Vec) perturbation (Problem A b c) = (r b, r c ) where r b = b (ζ Ae) r c = c ζ e ζ = 1 (n, m) = (cols A, rows A) e = constant 1 n 5. Centrális út A centrális utat az alábbi, µ-vel paraméterezett egyenletrendszer (x, y, s) megoldásaival definiáljuk: A x = b A T y + s = c xs = µ e 6. Haladás az eredeti feladatba, illetve a centrális úton Adott ν és (x, y, s) belső, perturbált megoldás esetén olyan (x, y, s ) belső megoldát keresünk, amelyre teljesülnek a feltételek valamilyen ν és µ paraméterek esetén: Ehhez az alábbi formában állítjuk elő őket: A x = b ν r b A T y + s = c ν r c x s = µ e x := x + α Δx y := y + α Δy s := s + α Δs Ahol α (0, 1]-et úgy választjuk, hogy a megengedettség és a pozitivitás megmaradjon, (Δx, Δy, Δs)-et pedig (x, y, s) megoldás-voltát kihasználva, az előjel-kötöttséget elhagyva kapjuk: A x = b ν r b A (x + Δx) = b ν r b A T y + s = c ν r c A T (y + Δy) + (s + Δs) = c ν r c (x + Δx)(s + Δs) = µ e Az egyenletrendszert átalakítva, a kvadratikus tagot elhagyva a következő lineáris egyenletrendszer alapján számítható ki (Δx, Δy, Δs): A Δx = (ν ν ) r b A T Δy + Δs = (ν ν ) r c s Δx + x Δs = µ e x s 3

Ennek az iterációs lépésnek az irányát számítja ki az alábbi függvény: dirnewton :: Problem Double Double (Vec, Vec, Vec) (Vec, Vec, Vec) dirnewton prob@(problem A b c) µ Δν (x, y, s) = (Δx, Δy, Δs) where Δx = subvector 0 n ξ Δy = subvector n m ξ Δs = subvector (n + m) n ξ ξ = tovec (linearsolve mtx (ascolumn λ)) mtx = fromblocks [[ A, 0, 0], [0, A T, I ], [ms, 0, mx]] where ms = diag s mx = diag x I = ident n λ = join [λ b, λ c, λ µ ] λ b = Δν r b λ c = Δν r c λ µ = µ e xs (r b, r c ) = perturbation prob (n, m) = (cols A, rows A) e = mapvector (const 1) x Az irány ismeretében már csak az α lépéshossz meghatározása van hátra. Ehhez hányadostesztet végzünk az irány alapján, az eredményt eltolva ε-nal a szigorú pozitivitás érdekében. αmaxf romratios :: (Vec, Vec, Vec) (Vec, Vec, Vec) Double αmaxf romratios (x, y, s) (Δx, Δy, Δs) = min 1 ((minimum ratios) ε) where ratios = ratiosx + ratioss ratiosx = filter (>0) $ zipwith ratio (tolist x) (tolist Δx) ratioss = filter (>0) $ zipwith ratio (tolist s) (tolist Δs) ratio z dz = z dz 7. Kezdő belső pont keresése Az optimalizálás első fázisában ν-t 1-ről 0-ra lenyomva keresünk olyan pontot, amely az eredeti feladatnak belső pontja. Ehhez a perturbált feladat (e, 0, e) belső kezdőpontjából indítjuk a fent definiált Newton-iterációt, úgy, hogy minden lépésben 0-ra próbáljuk csökkenteni ν -t (azaz Δν = ν). Az alábbi függvény az iteráció egy lépését számítja ki úgy, hogy a tényleges ν -t a Newton-lépés megtétele után, egyszerű behelyettesítéssel végzi. steptofeasible :: Problem Double ((Vec, Vec, Vec), Double) ((Vec, Vec, Vec), Double) steptofeasible prob@(problem A b c) µ ((x, y, s), ν) = ((x, y, s ), ν ) where (Δx, Δy, Δs) = dirnewton prob µ ν (x, y, s) α = αmaxf romratios (x, y, s) (Δx, Δy, Δs) x = x + α Δx y = y + α Δy s = s + α Δs 4

b = A(x + α Δx) (r b, ) = perturbation prob ν = (b b ) 0 r b0 Minden adott tehát, hogy elkészíthessük azt a kezdőpont-kereső függvényt, amelyik addig iterál, amíg az eredeti feladatnak egy (ε-)megengedett belső pontját kapja. A Writer monádot használjuk a számítási sorozat naplózásához. initialinfeasible :: Problem (Vec, Vec, Vec) initialinfeasible (Problem A b c) = (x, y, s) where x = constant 1 n y = constant 0 m s = constant 1 n (n, m) = (cols A, rows A) solvetofeasible :: Problem Logging (Vec, Vec, Vec) solvetofeasible prob@(problem A b c) = liftm fst $ iterateuntil isfeasible tolog (steptofeasible prob µ) ((x, y, s where (x, y, s) = initialinfeasible prob µ = 1 ν = 1 isfeasible ((x, y, s ), ν ) = Ax b tolog ((x, y, s), ν) = Infeasible (x, y, s) ν 8. Optimalizálás Egy (x, y, s) belső pont birtokában végre elkezdhetjük a tényleges belsőpontos optimalizálást, vagyis a centrális úton haladást µ csökkentésével. Lépésenként kiszámítjuk a javító irányt és lépéshosszt, és ha C(µ) megfelelő közelébe kerültünk, akkor µ-t is csökkentjük. A centrális úttól való távolságot az alábbi függvénnyel értelmezzük: δ(,, ) :: Vec Vec Double Double δ(x, s, µ) = 0.5 u recip u 2 where u = zipvector f x s ξ si f ξ s i = µ A lépéshosszt pedig úgy választjuk meg, hogy amellett, hogy az x, s > 0 feltétel teljesüljön, ne ugorjunk ki az optimális megoldáson átlépve a megengedett pontokból, vagyis a dualitási rés nemnegatív maradjon. target (Problem A b c) (x, y, s) = x T c shadow (Problem A b c) (x, y, s) = y T b gap prob (x, y, s) = target prob (x, y, s) shadow prob (x, y, s) stepnewton :: Problem ((Vec, Vec, Vec), Double) ((Vec, Vec, Vec), Double) stepnewton prob ((x, y, s), µ) = ((x, y, s ), µ ) where (Δx, Δy, Δs) = dirnewton prob µ 0 (x, y, s) x = x + α Δx y = y + α Δy s = s + α Δs 5

αmax = αmaxf romratios (x, y, s) (Δx, Δy, Δs) α = until isposgap ( 0.95) αmax where isposgap α = gap prob (x, y, s ) 0 where x = x + α Δx y = y + α Δy s = s + α Δs µ = if δ(x, s, µ) < τ then (1 θ) µ else µ τ = 0.1 θ = 0.8 Ezekután nincs más dolgunk, mint addig iterálni, amig optimális, azaz ε-nál kiesebb dualitási résű megoldást nem találunk: solvenewton :: Problem (Vec, Vec, Vec) Logging (Vec, Vec, Vec) solvenewton prob (x, y, s) = liftm fst $ iterateuntil optimal tolog (stepnewton prob) ((x, y, s), µ) where µ = xt s n n = fromintegral (dim x) optimal ((x, y, s ), µ ) = gap prob (x, y, s ) 0 tolog ((x, y, s), µ) = Feasible (x, y, s) optimize :: Problem Logging (Vec, Vec, Vec) optimize prob = do (x, y, s) solvetofeasible prob solvenewton prob (x, y, s) 6