Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Pécsi Tudományegyetem Pollack Mihály Műszaki Kar Műszaki Informatika Szak Data Mining
25. Előadás Dr. Pauler Gábor, Egyetemi Docens PTE-PMMFK Villamos Intézet Számítástechnika Tanszék Iroda: Boszorkány u., B épület 101 Tel: 72/ /3725
2
Egészértékű programozás A korlátozás-szétválasztás algoritmusa
Az előadás tartalma Egészértékű programozás A korlátozás-szétválasztás algoritmusa Nemlineáris programozás A nemlineáris modellek megoldásának bonyolultsága Nemlineáris modellek linearizálása Szakaszonként lineáris függvények linearizálása Egyszerű nemlináris függvények linearizálása HA-AKKOR szabályok kezelése lineáris modellben Logikai kapcsolatok leírása bináris változókkal Bonyolultabb nemlineáris célfüggvények linearizálása Hiperbolikus programozás Befektetési alap kezelési probléma Dinamikus programozás Szakirodalom
3
LP modellek egészértékű döntési változókkal 1
A gyakorlatban sok problémában fordulnak elő diszkrét értékű döntési változók (Discrete Variables), amelyeknek csak véges vagy végtelen számú diszkrét értéke értelmezett (pl. oszthatatlan termékek, nem gyárthatunk 23.5 db repülőgépet). Ezek a leggyakrabban egészértékű változóként (Integer Variable) jelennek meg, egészértékű LP modellt (Integer LP, ILP model) eredményezve Ezek speciális esete a bináris {0,1} változók (Binary LP, BLP model) használata, ezek általában nemlineáris modellek linearizálásakor kerülnek elő A simplex algoritmus viszont a sztenderd LP modellben csak folytonos változókat képes kezelni, és az optimális megoldás is bármikor lehet tört értékű Kézenfekvő dolognak látszik, hogy az egészértékű optimális megoldáshoz kerekítsük a folytonos optimális megoldást Ez azonban csak akkor működik jól, ha az egészértékű változó egy egysége csak elenyészően kis részét fogyasztja el a kapacitásoknak (pl. Fradi meccs elött a zacskóba töltendő szotyolamagok számát nyugodtan kerekíthetjük) Más a helyzet, ha az egészértékű változó egy egysége a kapacitások jelentős részét elfogyasztja (pl. az építendő óceánjárók számának optimalizálása). Itt a folytonos eredmény egyszerű kerekítése már lehet, hogy nem megengedett megoldás, vagy pedig, nagyon messze fog esni az optimálistól.
4
LP modellek egészértékű döntési változókkal 2
Erre látunk példát a következő ábrán: A folytonos feltételrendszer a sárga terület A fekete rácspontok az egészértékű megoldások A folytonos optimum kerekítésével kapott megengedett megoldás célfüggvényértéke jóval alacsonyabb, mint egy teljesen máshol lévő rácspont célfüggvényértéke Mert NEM a folytonos feltételek jelentik a modell valódi feltételrendszerét, hanem ezeken belül a szélső rácspontokra épülő konvex burok (Convex Envelope) (lásd zöld terület)! ILP megoldási módszerek: Adott folytonos feltétlrendszerhez tartozó konvex burok meghatározására Gomory magyar származású amerikai matematikus alkotott algoritmust De a konvex burok számolgatása olyan hosszú ideig tart, hogy ez a megoldás a gyakorlatban nem hatékony Ezért az optimalizációs szoftverek más módszert alkalmaznak
5
ILP modellek megoldása korlátozás és szétválasztással(Branching and Bounding)1
Az egészértékű változók egész értékei mentén kisebb LP részfeladatokra bontja az eredeti ILP modellt, és ezeket oldja meg De mivel n változó esetén ezekből 2n darab van, és a számolásigény robbanásszerűen nő (NP Hard Problem), igyekszik kizárni a bontásból egy csomó olyan részfeladatot, ahol nem lehet optimum, az összes lehetséges LP részfeladat piciny töredékét oldva meg Algoritmusa: 1. Megoldja az ILP modellt LP feladatként (minden változót folytonosnak vesz), így megkapja a folytonos optimális megoldást, amiben lehetnek egész- és törtértékű változók is. 2. Kiválaszt egy olyan döntési változót az optimális megoldásban, aminek értéke tört : A tört optimális érték ALATTI egészértéket új FELSŐ korlátként alkalmazva, kap egy „kisebb mint” részfeladatot, az adott változó szerint „elfelezve” a feltételrendszert A tört optimális érték FELETTI egészértéket új ALSÓ korlátként alkalmazva, kap egy „nagyobb mint” részfeladatot , az adott változó szerint „elfelezve” a feltételrendszert x1 x2 Kisebb mint Nagyobb mint
6
ILP modellek megoldása korlátozás és szétválasztással(Branching and Bounding)2
3. Megoldja mindkét részfeladatot LP feladatként. Ezeknek négyféle kimenete lehet: Egészértékű optimális megoldást ad ha jobb, mint az eddig ismert legjobb egészértékű megoldás, feljegyzi Törtértékű optimális megoldást ad, ami jobb, mint az eddig ismert legjobb egészértékű megoldás a részfeladatot további részekre kell bontani, ugrás a 2.LÉPÉS-hez Törtértékű optimális megoldást ad, ami rosszabb, mint az eddig feljegyzett legjobb egészértékű megoldás nem foglalkozik a részfeladattal tovább, mert ennek bármely egészértékű megoldása még a törtértékűnél is rosszabb lenne Nincs megengedett megoldása nem foglalkozik a részfeladattal tovább 4. Visszatér a következő felsőbb szintű részfeladathoz, ha nincs több, akkor VÉGE Értékelése: +: Lehetővé teszi az ILP feladat megoldását a lehetséges LP részfeladatok kis részének megoldásával, ezért minden szoftver ezt használja -: A számolásigény erősen függ attól, mely tört értékű változó szerint kezd bontani, de ennek optimalizálására nincs egzakt módszer x1 x2 Kisebb mint Nagyobb mint Nagyobb mint Kisebb mint x1 x2
7
Egészértékű programozás A korlátozás-szétválasztás algoritmusa
Az előadás tartalma Egészértékű programozás A korlátozás-szétválasztás algoritmusa Nemlineáris programozás A nemlineáris modellek megoldásának bonyolultsága Nemlineáris modellek linearizálása Szakaszonként lineáris függvények linearizálása Egyszerű nemlináris függvények linearizálása HA-AKKOR szabályok kezelése lineáris modellben Logikai kapcsolatok leírása bináris változókkal Bonyolultabb nemlineáris célfüggvények linearizálása Hiperbolikus programozás Befektetési alap kezelési probléma Dinamikus programozás Szakirodalom
8
Nemlineáris Programozás
Nemlineáris programozás (Nonlinear Programming, NLP) esetén a célfüggvény vagy a feltételek linearitása nem teljesül Az NLP modell megoldásának a nehézségét a következők határozzák meg: A célfüggvény és a feltételek konkavitása/konvexitása: Konvex (Convex) egy függvény, ha a függvényfelület bármely két pontját összekötő szakasz a függvényfelületen vagy felette helyezkedik el Konkáv (Concave), ha alatta Ha egyik sem igaz a függvény teljes értelmezési tartományán, akkor az sem konkáv sem konvex (pl. y = x3, stb.) A szélsőérték fajtája konvex feltételrendszernél: Konvex célfüggvénynek csak egy globális minimuma lehet, de sok lokális maximuma Konkáv célfüggvénynek csak egy globális maximuma lehet, de sok lokális minimuma Konkáv feltételrendszer esetén több lokális szélsőérték lehetséges bármely célfüggvénynél A lokális szélsőértékek nehezítik a megoldást, mert az algoritmusok „beléjük ragadhatnak” Nemlineáris Programozás x y x y Maximalizálás Minimalizálás Konvex célfüggvény Konkáv célfüggvény A legnehezebben megoldható általános NLP modelleknél a célfüggvény vagy a feltételek sem konvexek sem konkávak
9
Szakaszonként lineáris függvények kezelése 1
Könnyen kezelhető esetek: Szakaszonként lineáris konvex összefüggés minimalizálása (pl. L túlóra emelkedő költségei: c1 ≤ c2 ≤ c3) Plussz változók bevezetése: L felbontása L1+L2+L3 szakasz változókra Szakasz-határ korlátok bevezetése: L1’, L2’, L3’ c1L1 + c2L2 + c3L3 = z → Min (25.1) L1 ≤ L1’ (25.2) L2 ≤ L2’ - L1’ (25.3) L3 ≤ L3’ - L2’ (25.4) L1 + L2 + L3 - L = 0 (25.5) L1, L2, L3, L ≥ 0 (25.6) Szakaszonként lineáris konkáv összefüggés maximalizálása (pl. Q értékesítés mennyiségi árengedménnyel: p1 ≥ p2 ≥ p3) Plussz változók bevezetése: Q felbontása Q1+Q2+Q3 szakasz változókra Szakasz-határ korlátok bevezetése: Q1’, Q2’, Q3’ p1Q1 + p2Q2 + p3Q3 = z → Max (25.7) Q1 ≤ Q1’ (25.8) Q2 ≤ Q2’ - Q1’ (25.9) Q3 ≤ Q3’ - Q2’ (25.10) Q1 + Q2 + Q3 - Q = 0 (25.11) Q1, Q2, Q3, Q ≥ 0 (25.12)
10
Szakaszonként lineáris függvények kezelése 2
Nehezen kezelhető esetek: Szakaszonként lineáris konvex függvény maximalizálása, konkáv minimalizálása, nem konkáv/konvex függvény kezelése (pl. sin(y), cos(y) közelítése): Kiszámítjuk az f(d0),..f(d4) függvényérték pontokat d0,..d4 tetszőleges osztópontokban Az eredeti y változót az osztópontok l0,..l4 ≥ 0 nemnegatív súly változókkal súlyozott összegeként írjuk fel: d0l0 + d1l1 + d2l2 + d3l3 + d4l4 – y = 0 (25.13) Az függvényértéket a függvényérték pontok hasonlóan súlyozott összegeként írjuk fel: f(d0)l0 + f(d1)l1 + f(d2)l2 + f(d3)l3 + f(d4)l4 (25.14) Hogy ne kelljen a súlyok összegével osztani, legyen az összegük 1: l0 + l1 + l2 + l3 + l4 = 1 (25.15) Hogy a súlyok CSAK a szomszédos függvénypontok közti szakaszokat ábrázolhassák, egyszerre csak két szomszédos súly kaphat nem 0 értéket Ezt úgy érjük el, hogy az x1,..x4 є {0,1} szomszédságot ábrázoló bináris változókat teszünk a súlyok felső korlátjává. Mivel a közbülső súlyoknak két szomszédja is lehet, ezért ezeknél két szomszédsági változó összege lesz a korlát: 0 x1 (25.16) - egy szomszédja van 1 x1+x2 (25.17) - két szomszédja van 2 x2+x3 (25.18) - két szomszédja van 3 x3+x4 (25.19) - két szomszédja van 4 x4 (25.20) - egy szomszédja van Egyszerre csak egy szomszédság „működhet”, ezért a szomsédság jelölő változók összege legyen 1: x1 +x2 +x3 + x4 = 1 (25.21)
11
Egészértékű programozás A korlátozás-szétválasztás algoritmusa
Az előadás tartalma Egészértékű programozás A korlátozás-szétválasztás algoritmusa Nemlineáris programozás A nemlineáris modellek megoldásának bonyolultsága Nemlineáris modellek linearizálása Szakaszonként lineáris függvények linearizálása Egyszerű nemlináris függvények linearizálása HA-AKKOR szabályok kezelése lineáris modellben Logikai kapcsolatok leírása bináris változókkal Bonyolultabb nemlineáris célfüggvények linearizálása Hiperbolikus programozás Befektetési alap kezelési probléma Dinamikus programozás Szakirodalom
12
Egyszerű nemlineáris függvények linearizálása
Bináris változók segítségével az egyszerűbb nemlineáris függvények is linearizálhatók: Függvény Linearizálás Minimum: c:= Min(a,b) c ≤ a, c ≤ b a ≤ b ×u b ≤ a ×u c ≥ a ×u c ≥ b ×u u є {0,1} Maximum: c:= Max(a,b) c ≥ a, c ≥ b c ≤ a ×u c ≤ b ×u u є {0,1} Két bináris változó szorzata: c:= a×b a + b – c ≤ a, b, c є {0,1} Előjel függvény: y:= sgn(x) y = b1 - b2 x = u1 – u2 b1 + b2 ≤ 1 u1 ≤ ×b u1, u2 ≥ 0, b1, b2 є {0,1} u2 ≤ ×b2 Abszolútérték függvény: y:= abs(x) y = u1 + u2 u1 ≤ ×b u1, u2 ≥ 0, b є {0,1} u2 ≤ ×b
13
HA-AKKOR szabályok kezelése lineáris modellben
A mindennapi életben gyakoriak a HA-AKKOR szabályok, emelyek általában nemlineáris modellhez vezetnek, ezeket bináris változókkal linearizáljuk: 1. HA-AKKOR szabály a célfüggvényben: Pl. A termelés fix költségei: Ha egy termék y termelése 0, akkor 0 költség merül fel, de ahhoz, hogy a termékből bármennyit tudjunk termelni, jelentős f fix költségre van szükség (termékfejlesztés, a gyártó gépsor költsége, stb.) c változó költség mellett: c×y + f×x = z min y ≤ ×x x є {0,1} – nem termelés/termelés változó 2. HA-AKKOR szabály döntési változó értékhatárában: Pl. Minimális termelési sorozatnagyság: egy termék y termelése vagy 0, vagy, legalább d sorozatnagyságot el kell érjen, különben a fejlesztés költségei nem térülnek meg (pl. az Airbus A380 super jumbó 10Md USD fejlesztési költsége legalább 350db termelése esetén térül meg): d – ×x ≤ y y ≤ ×x x є {0,1} – nem termel/termel 3. HA-AKKOR szabály korlátozó feltételben: Pl. Adójog:1996/9.86. „100 fő alatti foglalkoztatási létszámú (F) vállalkozás maximum 5 vállalati autó költségét számolhatja el (A), 100-as létszám felett maximum 10-et.„ A ×x1 A ×x2 F 100 – 100×x1 F ×x2 x1 + x2 =1 x1, x2 є {0,1} - feltételt ki/be kapcsoló változók, köz- tük NOT logikai kapcsolat van: ha az egyik bekapcsol egy konvex feltétel-részhalmazt, a másik kikapcsolja a saját konvex feltétel-részhalmazát, így mindig csak konvex feltételek jelennek meg a modellben!
14
Logikai kapcsolatok leírása bináris változókkal
Bináris változók segítségével bármilyen logikai kapcsolatot megjeleníthetünk linearizálható módon (pl. Csak egyben, nem osztható módon megvalósítható, egymáshoz kapcsolódó befektetések költségének modellezésénél) logikai kapcsolat 2 változóra x1, x2 є {0,1} 3 változóra (x3 az eredmény változó) és (and) x1 = x2 ha x1 = 1, x2 -nek is 1-nek kell lenni és fordítva x3 := x1×x2 x3 csak akkor 1, ha x1, x2 is 1 vagy (or) x1 + x2 1 x1 és x2 közül legalább az egyiknek 1-nek kell lennie x3 := x1 + x2 - x1×x2 x3 csak akkor 1, ha x1 és x2 közül legalább az egyik 1 kizáró vagy (xor) x1 + x2 1 x1 és x2 közül legfeljebb az egyik lehet 1 x3 := x1 + x2 - 2x1×x2 x3 csak akkor 1, ha x1 és x2 közül legfeljebb az egyik 1 tagadás (not) x1 + x2 =1 ha x1 = 1 x2 = 0 és fordítva Nem értelmezett
15
Egészértékű programozás A korlátozás-szétválasztás algoritmusa
Az előadás tartalma Egészértékű programozás A korlátozás-szétválasztás algoritmusa Nemlineáris programozás A nemlineáris modellek megoldásának bonyolultsága Nemlineáris modellek linearizálása Szakaszonként lineáris függvények linearizálása Egyszerű nemlináris függvények linearizálása HA-AKKOR szabályok kezelése lineáris modellben Logikai kapcsolatok leírása bináris változókkal Bonyolultabb nemlineáris célfüggvények linearizálása Hiperbolikus programozás Befektetési alap kezelési probléma Dinamikus programozás Szakirodalom
16
Bonyolultabb nemlineáris célfüggvények linearizálása 2
Hiperbolikus célfüggvény (Hyperbolic Programming, HP): pl. i = 1..n termékek xi termeléseinek Scixi összköltségre jutó Spixi összbevételét akarjuk maximalizálni (termelés profitabilitásának maximalizálása) a célfüggvény egy tört lesz: (25.30) Alapfeltételezések: a nevező pozitív, a kapcsolódó feltételrendszer lineáris, konvex: c1x1 + c2x2 + r > 0 a1x1 + a2x2 ≤ b (25.31) Linearizáció: mikor nem számít a célfüggvényt nem lineárissá tévő osztás? Ha pontosan 1-el osztunk. Legyen u≥0 egy változó, amivel a nevezőt megszorozva az értéke pontosan 1 lesz (ez implicite kizárja u = 0-át is): c1x1u + c2x2u + ru = 1 (25.32) Hogy a z célfüggvény ne változzon, u-val végigszorozzuk a számlálót is: p1x1u + p2x2u + qu = z Max (25.33) Ugyanezt megtehetjük a feltételeknél is, anélkül, hogy az értelmük megváltozna: a1x1u + a2x2u ≤ bu (25.34) Az eredeti xi i = 1..n változók u-val alkotott szorzatát lecseréljük yi = xi × u, i = 1..n változókra: p1y1 + p2y2 + qu = z Max (25.35) c1y1 + c2y2 + ru = 1 (25.36) a1y1 + a2y2 - bu ≤ 0 (25.37) y1,y2, u ≥ 0 (25.38) Megoldjuk a lineáris modellt, hogy megkapjuk az (yi* i = 1..n, u*) optimális megoldást. Majd u*-gal történő osztással megkapjuk az eredeti változók szerinti optimális megoldást: xi* = yi* / u*, i = 1..n (25.39) x1 x2 z (q,r) c p
17
Bonyolultabb nemlineáris célfüggvények linearizálása 3
Az exponenciális-, haranggörbe-, bevételi görbe-, logisztikus függvények linearizálását már tárgyaltuk a Session15 -ben. Lássunk ezek használatára egy példát: 25.1. PÉLDA: Befektetési alap kezelési modell (Found Management Model): Egy befektetési alapkezelő k nagyú tőkét kamatoztat t = 1..T időperióduson keresztül i = 1..n befektetési lehetőségben, amelyek éves szintű reálkamatlábai ri, si időperiódusoktól kezdve elérhetőek, lejárati időtartamuk di (ha a lejárati időt megszakítjuk, elvesztjük a kamatokat). Mely befektetési lehetőségeket válasszuk (bi {0,1}), hogy a T időperióduson keresztül elérhető z jövőbeli érték maximális legyen? Az ilyen modelleknél rendkívül hasznos, ha minden t kamatperiódusú (pl. t=1 éves, t=12 havi) rt reálkamatlábat átváltunk f folytonos kamatlábra (Continuos Interest Rate), amely egy valóságban sohasem létező, fiktív kamatláb: az eredeti befektetéssel egyenértékű olyan befektetés kamatlába, amely végtelenül rövid lejárati idejű és azonnal újrabefektethető: f = t × ln(1 + rt/t) (25.40) Így a modellben nem kell folyton átváltogatnunk a különböző kamatperiódusú kamatlábakat egymásba, és egy t időperiódusnyi lejáratú befektetés z jövőbeli értéke rendkívül egyszerűen, jól linearizálhatóan számolható: z = k × eft (25.41) Ha szükséges, az f folytonos kamatláb bármikor visszaváltható adott kamatperiódusú rt reálkamatlábba: rt = t × (ef/t - 1) (25.42)
18
Bonyolultabb nemlineáris célfüggvények linearizálása 4
k × e(Sifidibi) = z Max /Maximális jövőbeli érték (25.43) Subject to bi {0,1}, i = 1..n /Bináris befektetési változók (25.44) bi + bj ≤ 1, i,j = 1..n| ((si ≤ sj)AND(sj ≤ si+di))OR((sj ≤ si)AND(si ≤ sj+dj)) /Nem valósulhat meg egyszerre két beruházás, amelyek lejárati intervallumai átfedik egymást (25.45) A modell célfüggvénye nemlineáris, de rendkívül egyszerűen log-linearizálható egy ekvivalens lineáris célfüggvénybe: ln(k) + Sifidibi = ln(z) Max /Max. jövőbeli érték logaritmusa (25.46) A fentiekből láthattuk, hogy a lineáris programozásban nem a linearitás jelenti a fő gondot, mert szinte mindent linearizálni lehet Azonban, minél bonyolultabb egy linearizálás, annál inkább megtöbbszörözi a feltételek és a (gyakran egészértékű) változók számát a modellben 30-40 változós nemlineáris problémákból simán létrejöhetnek több változós, jelentős részben egészértékű modellek, ami olyan óriási számolásigényt jelent, ami – mégha szuperszámítógépi kapacitás és idő birtokában megoldható is – gazdaságtalanná teszi a probléma megoldását De van egy trükk, ami jelentősen csökkentheti a modellek méretét, és további linearizálási lehetőséget jelent:
19
Dinamikus programozás 1
A dinamikus programozás (Dynamic Programming, DP) olyan modellek optimalizálásával foglalkozik, amelyeknél a döntési változók és a korlátozó feltételek azonos szerkezetű csoportjai minden egymást követő időperiódusban megjelennek az időperiódusok láncszerűen hatnak egymásra: az előző periódus eredményei a következő periódus bemenetei lesznek A modellt egy időbeli ablakban (Time Window) írjuk fel Lássunk erre egy példát: 25.2 PÉLDA: A Kobe-i kikötőöbölben található a világ leghosszabb kétpilléres függőhídja, erősen ciklonveszélyes területen. Az erős szél hatására a hídpálya lengésbe jön, és az aktuális terheléstől is függő, időben szinuszos hullámmozgást ír le. A híd leszakadását egy automatika akadályozza meg, amely hatalmas hidraulikák segítségével periodikusan megfeszíti/ellazítja a híd tartókábeleit, csillapítva a hullámzást. Jelenítsük meg egy LP modellben korlátként a hullámmozgás at amplitúdóját t = 1..T időperiódusok és a w aktuális terhelés szerint (lásd a mellékelt függvényt), hogy a hidraulikák húzó/nyomó igénybevétele (h, n) tervezhető legyen!
20
Dinamikus programozás 2
Ha ezt a brutálisan nemlineáris, bonyolult függvényt az előzőekben mutatott szakaszonként lineáris felbontás módszerével szeretnénk megjeleníteni, folytonos súlyvátozók, szomszédsági változók és feltételek ezreire lenne szükség. Ha azonban a modellt dinamikusan írjuk fel, aszerint, hogy bizonyos előző időperiódusok hogyan hatnak a következő időperiódusban, akkor: Eleve változókat takaritunk meg, mert a függvényt nem a teljes időtartamban kell ábrázolni, hanem egy szűk időbeli ablakban A Session15-ben az autoregressziós modelleknél tanultak alapján kihasz- nálhatjuk, hogy egy szinuszos hullám- zást időszeletek szintjén lineárisan is közelíteni lehet, ezért a feltétel megje- lenítése egyszerűsödik: at = ×at-1 – 0.650×at-6, t = 7..T (25.47) a1 = -w, a2 = -w, a3 = -w (25.48) a4 = -w, a5 = -w, a6 = -w (25.49) h ≤ at, n ≥ - at , t = 1..T (25.50)
21
Szakirodalom 1 Egészértékű programozás:
Gömöry algoritmus: Korlátozás és szétválasztás: Nemlineáris programozás: Kvadratikus programozás: Hiperbolikus programozás: elsoevf/gazdmat/gazdmattetel.doc Dinamikus programozás: Lineáris programozás modell könyvtárak: Gams Inc.: Optimax Inc.: Frontline Inc.: Brunel: Áttekintés az optimalizációs algoritmusokról szoftverekről: Ingyenes lineáris optimalizációs szoftverek: Dream: HQP: OCC:
22
Szakirodalom 2 Kereskedelmi optimalizációs szoftverek:
Kiegészítések más rendszerekhez: Matlab: nincs shareware Önálló rendszerek: Gams: max változó/feltétel, GUI, 300 változóra/feltételre korlátozott időkorlát nélküli shareware: LINDO Inc. LINGO: max változó/feltétel, GUI, 300 változóra/feltétel korlátozott időkorlát nélküli shareware: Cplex: Gauss: Excel add-in solverek: LINDO Inc. What’s Best: max változó, 300 változóra korlátozott időkorlát nélküli shareware: Frontline Inc. Solver: max változó, 30 napos shareware:
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.