szakdolgozat - phd.lib.uni-miskolc.huphd.lib.uni-miskolc.hu/document/28322/24015.pdf · 6 2. az...
TRANSCRIPT
SZAKDOLGOZAT Operációkutatási feladatokat megoldó,
oktatást támogató program készítése
Készítette: Kucsma Roland
Gazdaságinformatikus Bsc.
Témavezető: Dr. Házy Attila egyetemi docens
Miskolci Egyetem
2017
2
Tartalomjegyzék
1. Bevezetés .......................................................................................................................... 4
2. Az Operációkutatás ....................................................................................................... 6
2.1 Az operációkutatás fogalma .................................................................................................6
2.2 Történeti áttekintés, kialakulása .......................................................................................... 6
2.3 Az optimalizálási modellek ..................................................................................................9
3. Lineáris programozás................................................................................................... 11
3.1 Története ............................................................................................................................11
3.2 Az LP feladatok ekvivalens alakjai ....................................................................................11
3.3 Az LP feladat geometriai és algebrai háttere .....................................................................12
3.4 Az LP feladat gazdasági háttere .........................................................................................13
3.5 Megoldása egy termelésprogramozási feladatra ................................................................15
4. Szimplex-módszer: ....................................................................................................... 16
4.1 A név eredete ......................................................................................................................16
4.2 Szimplex módszer felépítése ..............................................................................................16
4.3 Szimplex-módszer menete .................................................................................................17
4.4 Bland-szabály .....................................................................................................................18
4.5 A szimplex módszer tulajdonságai .....................................................................................18
5. Érzékenységvizsgálat .................................................................................................... 19
5.1 Érzékenységvizsgálat célja a szimplex-módszerrel .............................................................19
5.2 Célja .....................................................................................................................................20
5.3 Feltétele ................................................................................................................................21
5.4 Jobb oldal változása .............................................................................................................20
5.5 Esetei ....................................................................................................................................21
3
6. A Gomory vágás............................................................................................................ 22
6.1 Az eljárás lényege ..............................................................................................................22
7. Nemlineáris programozás ............................................................................................ 23
7.1 A lineáris programozásnak alapvető feltétele ....................................................................23
7.2 Kialakulása .........................................................................................................................23
7.3 Feladatok osztályozása .......................................................................................................24
8. A programról ................................................................................................................ 25
8.1 C# Története .......................................................................................................................25
8.2 C# Jellemzői .......................................................................................................................26
8.3 A szimplex-módszert megoldó program ............................................................................ 28
8.3.1 A program használata és programkódjai .............................................................. 28
Összefoglaló ....................................................................................................................... 50
Summary ........................................................................................................................... 51
Adathordozó használata .................................................................................................. 52
Irodalomjegyzék ............................................................................................................... 53
Köszönetnyilvánítás .......................................................................................................... 54
4
1. Bevezetés
Az Operációkutatás I. című tantárgy kapcsán rengeteg különböző eddig még nem
feldolgozott algebrai feladattal találkozhattunk, amely során több matematikai probléma
merült fel, és ezeknek a megoldásának módszereit vizsgáltuk. Ezeknek az alapvető típusa a
feladatok szélsőértékének keresésével foglalkozik. A függvények jellegéből kifolyólag
többek között lineáris, egész értékű és nemlineáris optimalizálást különböztetünk meg. A
nemlineáris optimalizálás kiemelkedő közülük, amely a múltszázadban alakult ki és
nagyobb méretű problémák megoldására terjed ki.
A szakdolgozatom két fő részből fog összetevődni: az egyik az Operációkutatás, az
Optimalizálás elméleti háttere, fogalmak, definíciók; a második rész egy Operációkutatás
egyik fő ága, a szimplex módszer megoldására készítek és mutatok be egy programot C#
nyelven Microsoft Visual Studio fejlesztőkörnyezetben.
Azért választottam ezt a témát, mivel véleményem szerint nagyon fontos a mai
világban az optimalizálás, maga a matematika, a lineáris algebra egy programozó,
informatikus képzésben. Úgy gondolom, hogy a szakmai tudáshoz létfontosságú logika
kifejlesztését megkönnyíti, így egyszerűbben tanulhatóak a különböző programozási
nyelvek. Motivált az is, hogy viszonylag nagyszámú szakirodalom van a témával
kapcsolatban, aminek segítségével sikerült mélyebben körüljárnom az Operációkutatás,
mint tudományterület témakörét.
Véleményem az, hogy egy megfelelő oktatási program nem csak az oktató feladatát,
munkakörének a fejlődését segíti elő, hanem a diákok is önállóan feltudnak készülni, mivel
a program segítségével letudják ellenőrizni a házi feladataikat, hogy megfelelően
oldották-e meg, illetve ha mégsem, abban az esetben kitudják javítani magukat az aktuális
zárthelyi dolgozat, illetve vizsga előtt.
5
Tehát biztatom a diákokat is arra, hogy bátran használjanak online matematikai
programokat, hiszen ez az online tanulás, oktatás azért fejlődik ilyen nagy lépésekben,
hogy a diákok minél nagyobb tudással és minél egyszerűbb módon tudják leküzdeni az
oktatásban ért akadályokat.
6
2. Az Operációkutatás
2.1 Az operációkutatás fogalma
Az alkalmazott matematika azon ága, amely eljárások és bizonyos folyamatok
optimalizálásával foglalkozik. A feladatok célja, hogy az életből vett problémákat
matematikai modellekkel oldjuk meg, ezekre léteznek számtalan gyakorlati megoldó
programcsomagok. A feladatok megoldásában segítségül vehetjük a gráfelméletet és a
mátrixszámítást is.
Az optimalizálást legjobban így lehetne megfogalmazni: Olyan tudományosan
kialakított módszer, amely a gazdasági optimum problémák megoldásához, a döntések
előkészítéséhez általában valamilyen szélsőérték feladatokat alkalmaznak. Jellemző
eszközei a nemlineáris és a lineáris programozási modellek, hálótervezés és a
készletgazdálkodási modellek.
2.2 Történeti áttekintés, kialakulása
A tudományág a II. világháborúban alakult ki, amikor is hadműveleti, stratégiai,
tevékenységek megoldására alkalmazták, mint kiderült később eredményesen. A
szövetségesek vezérkarai alakítottak ki először olyan különböző szakemberekből álló
kutatócsoportot, akiknek az volt a legfontosabb feladata, hogy javaslatokat dolgozzanak ki,
különböző tudományos eszközök segítségével az eltérő hadműveleti döntések
megalapozásához. Az elnevezés is innen ered: az operáció szó alapjelentése: hadművelet,
katonai művelet.
Felmerültek olyan feladatok, amelyek nagyobb méretű hajókonvojok összeállítása,
aminél olyan problémák alakultak ki, mint például az, hogy melyik tengeri útvonalon
7
érdemes hadianyagokat, katonákat szállítani. Ezen felül több tényezőt is számításba kellett
venni, például: a szállítmány beérkezését az ellenség megakarja majd akadályozni,
nagyobb hajókonvoj esetén nagyobb védőerőt képviselhet az ellenséggel szemben, kisebb
hajókonvoj gyorsabban teszi meg ugyanazt a távolságot. Ezek tevékenységeknek a
legfontosabb tanulsága az, hogy az ismeretlen tényezők nagy száma, a problémák
összetettsége, és az egymásra közvetlenül ható tényezők bonyolult összefüggései miatt a
csoportos tevékenységeknek nagy jelentősége van, amelyek megközelítése a matematikai
eszközökkel egyszerűbben kiküszöbölhető a problémák helyreállítása is.
1938-ban a brit légierő alkalmazta egy radarfigyelő rendszer kiépítésére. A második
világháborúban az USA, Nagy-Britannia és Szovjetunió által alapított ’Operational
Research Sections’-ben többet között a hajók számának optimalizálása, ezen belül a hajó
konvojok védőkíséretének méretének nagysága vagy a szőnyegbombázás sűrűségének
értéke és kiterjedésének nagysága volt a legfontosabb nézőpont.
A háború befejeződését követően a hadiipar céljára kifejlesztett eljárások a gazdaság
helyreállítására, a közgazdasági tevékenységek megbízhatóbbá tételére kezdték
alkalmazni, az operáció kutatás más területek mellett áttevődött a közgazdasági
alkalmazások kialakítására. Természetesen a matematikai eljárások közgazdasági
alkalmazásának is régi múltra tekint vissza. A közgazdasági tevékenységnek a
matematikában való alkalmazása iránti érdeklődés a XVIII. században alakult ki. A lineáris
programozás modelljét legegyszerűbb példákkal megtalálhatjuk Francois Quesnay
közgazdasági táblázataiban, ezeket a feljegyzéseket Marx Károly német filozófus is
zseniálisnak tekintette.
A XIX. században kiemelkedő közgazdásznak számító N. G. Csernisevszkij, akinek
közgazdasági tanulmányait már Lenin és Marx is már nagyra értékelte a politikai
feladatoknak a megoldásánál, amelynek fontos elve volt az, hogy megmérhetőek és
megszámlálhatóak legyenek, illetve csak azokat mérés és számolás útján legyenek
8
elfogadhatóak. Marx is nagy figyelemmel tekintett a közgazdasági jelentésekre, illetve a
matematikai elemzéseknek. Ebből az okból született meg a ’Matematikai füzetei’ az
újratermelési sémák ismertetésére, Lenin ezt fejlesztette tovább, amelyben nagy
jelentőséggel bírt a jelenségek matematikai leírása és elemzése.
1928-ban a magyar származású, manapság mindenki által ismert Neumann János,
aki továbbfejlesztette az Emil Borel munkáját a ’Minimax’ tételében, amivel megalapozta a
lineáris egyenlőtlenségek elméletének matematikai alapját. Később több műve megjelent
még például Morganstern O.-val közösen a ’Theory of Games and Economic Behaviour’
1944-ben. Ezt követően a tudomány sok területén vezető szerepet játszott, különösen nagy
hatással volt az elektronikus számítástechnika fejlődésében és az atomenergiában. 1945-
ben az USA-ban megkezdték az elektronikus számítógépeknek a gyártását is, amelyet
George W. Bush készített el Neumann János közreműködésével.
A közgazdaságtan fejlődése a XX. században a megnövekedett rendelkezésre álló
információk mennyisége és a minőségének a javulása lehetővé tette, hogy az elméleti
modellekről áttérjenek az empirikus modellekre. A tudományok fejlődése nagyobb
differenciálódáshoz, több új tudományág kialakulásához vezetett. Nem vette át a vezetés
szerepét az operációkutatás csupán segíti a vezetői döntések megalapozását, ami szoros
kapcsolatban van a döntéselmélettel, egyes esetekben el sem lehet határolni a statisztika és
a tudomány egyes területeitől.
Az Angol Operációkutatási Társaság az Operációkutatás témakörét így fogalmazta
meg: Úgynevezett egzakt gondolkodásmódot jelent, ami a döntések megalapozásával
foglalkozik, ezáltal az optimális döntések előkészítését szolgálja. Az operációkutatás,
optimalizálás a döntéssel nem egyenlő, a vezetéssel sem, hanem a lehető legmegfelelőbb
döntés, az optimális eszköze a célszerű vezetésnek, ami során matematikai, tudományos
módszereket használja fel, amiatt hogy a döntési alternatívák lehető legjobbak legyenek.
9
Az operációkutatás - lényeges tulajdonságai:
- Az operáció, operációkutatás fogalma alatt általában valamilyen célirányos
operációt, tevékenységet, műveletet értünk.
- Olyan tudományosan kialakított gyakorlati tevékenységet tekinthetünk, amely
célja a döntések előkészítésének megalapozása.
- Az operációkutatás vizsgálatát tudományosan szemléltetett és módszerekkel
végzik, nagy szerepe van a vizsgálataiban a matematikai és a modellezési
eljárásoknak, és az optimumot számító módszereknek.
Az operációkutatás - jellegzetességei:
- tudományosan kialakított módszer használata,
- modern matematikai módszerek alkalmazása,
- az optimális megoldás kialakítására irányuló törekvés,
- egyszerűsíteni a döntés-előkészítését,
- kialakítani a team-munkát,
- nagyfokú alkalmazhatósága a számítástechnikán belül.
2.3 Az optimalizálási modellek
Korábban már többször említettem az úgynevezett operáció-kutatási modelleket, de
először tisztáznunk kell azt, hogy mi is az a modell? Az operációkutatási feladatok
lényeges munkafázisa a modellezés. Legrövidebben úgy fogalmazhatnánk meg, hogy a
rendszer modelljének megalkotására irányuló jellegzetes közelítési módja. Az ember által
megalkotott leegyszerűsített kép a valóságról. Tartalmazza az objektum alkotórészeit,
kapcsolatait, tulajdonságait.
10
A modellek a következő lépésekre oszthatóak:
- megfogalmazni a problémát,
- kiválasztani a matematikai módszereket és modelleket,
- meghatározni a modell paramétereit (változók, konstansok),
- számszerű felírása a modellnek,
- a modell megoldásának vizsgálata,
- a megoldás gyakorlati megvalósítása,
- korrekciók végrehajtása.
A matematikai modellek előnyei a verbális leírással szemben:
- a problémát tömören írja le,
- ok-okozati összefüggések könnyebben áttekinthetők,
- összes kapcsolatot ugyanazon időben lehet kezelni,
- láthatóvá válik az, hogy az elemzéshez milyen további adatok szükségesek,
- módosítás egyszerűbb,
- a számítógépes programcsomagok számára lehetővé teszi a közvetlen
használatot.
11
3. Lineáris programozás
3.1 Története
A lineáris algebra egyik ágának tekinthető a lineáris programozás, amely 1940 után
az elektronikus számítástechnikával együtt fejlődött ki. Fontos a közgazdaságtanban,
illetve a matematikusok számára is. Az elmélet megalkotóinak Neumann János és George
Dantzig-ot tekintjük.
A lineáris optimalizálás problémájának azt állítjuk, hogy a lineáris függvény
szélsőértékének mennyiségét kell meghatározni, abban az esetben, ha a lineáris
egyenlőtlenség lép fel mellékfeltételként, és csak nem negatív értékei jönnek számba a
keresett mennyiségek esetében. A gazdaságban, a haditudományban, az iparban
előfordulhatnak olyan problémák, amelyek kifejezhetőek optimalizálási feladatként. Ha
egy lineáris optimalizálási feladat csak két ismeretlent tartalmaz, akkor megoldható
grafikusan is. Ezek kiszámítására több eljárás ismert. A legelterjedtebb a szimplex
módszer, amely George Dantzig fedezett fel.
3.2 Az LP feladatok ekvivalens alakjai
Az LP feladatoknál két alakot különböztetünk meg: standard és a kanotikus alak.
Az LP feladatot standard alakúnak nevezzük, ha a feltételrendszere csak ≤ relációt
tartalmaz, a változók értékei csak nemnegatívak lehetnek, és a célfüggvénynek a
maximumát keressük. Minden LP feladatot standard alakra lehet hozni, mivel ha a
célfüggvény maximumát keressük, akkor ehelyett kereshetjük a célfüggvény maximumát a
(−1) -szeresének, mivel −𝑧 helye megegyezik a 𝑧 minimumhelyével, azaz ellentétes
előjelűek az optimális célfüggvény értékek.
12
Egy LP feladat akkor kanotikus alakú, ha a feltételrendszere csak = relációt
tartalmazhat, csak nemnegatív értékeket vehetnek fel a változók, maximumot keressük a
célfüggvénynek. A standard és kanotikus alak között különbség csak a feltételrendszerben
van.
3.3 Az LP feladat geometriai és algebrai háttere
Az 𝑥 lehetséges megoldást akkor tekintjük optimálisnak, ha annál nincs nagyobb –
kisebb minimum feladat esetén – lehetséges megoldása a célfüggvénynek. Nem minden
lineáris programozási feladatnak van optimális megoldása, mivel előfordulhat, hogy nincs
lehetséges megoldása, illetve előfordulhat olyan is, hogy a célfüggvény lehetséges
megoldások halmazán belül olyan értéket vesz fel, ami kiemelkedően magas, tehát
korlátos.
A döntési és a gazdasági problémák optimalizálásnak legjelentősebb részét lineáris
programozással oldhatjuk meg. A módszer lényege matematikai modellt veszünk fel az
adott feladathoz, ebben általában egyenlőtlenségek, egyenlőségek és lineáris formulák
szerepelnek. Majd kiszámoljuk az egyenletrendszerek megoldási algoritmusára kialakított
eljárásokkal az alábbi döntéshez legjobban tartozó változatokat. A megoldáshoz a
gyakorlatban számítógépeket használnak, a végső döntést leggyakrabban további
megfontolásokkal – politikai, gazdasági, stb. – kielemzésével és figyelembe vételével
hozzák meg.
13
3.4 Az LP feladat gazdasági háttere
Az operációkutatás gazdasági alkalmazása gyakorlatban igen hatékonyan bizonyult,
manapság olyan számítógépes eljárások alakultak ki, amelyek a felhasználótól nem
igényelnek nagyobb matematikai ismereteket, mivel a feladatok megoldásához a
matematikai modellt is a számítógép alakítja ki. Ebben az esetben a felhasználónak csupán
az alapadatokat kell megadni, és az eredmények értelmezése irányul a szakmai tudáshoz.
Mai világban a számítástechnikai alkalmazásoké a jövő akár az informatikában,
gazdaságban és a mindennapi életben is. A számítástechnika alkalmazása
elképzelhetetlennek tűnik anélkül, hogy a tervezésben, szervezésben,
döntésmegalapozásban, irányításban és a gazdasági elemzésben, azaz egy vállalat minden
területén alkalmazunk számítástechnikát. Ipari, gépészeti cégeknél pedig az
operációkutatásé a főszerep.
Az operációkutatás módszeri közül a gazdasági feladatok modellezése az
alkalmazott matematikai programozása leegyszerűsített módon történő bemutatását értjük,
amely analóg módon felfogható az optimalizálási módszerek alkalmazásának, a gazdasági
problémák és az alkalmazott matematikai módszerek sajátosságaival és azok
figyelembevételével.
Feltételezzük, hogy valamely gazdasági vállalat 𝑛-féle különböző tevékenységet
folytat, a tevékenységek jelenthetik a termékek termelését, szolgáltatások ellátását,
beruházási tevékenységet, stb. A tevékenység számunkra ismeretlen, 𝑥1, 𝑥2, … , 𝑥𝑛 -el
jelöljük, ezeket hívjuk a matematikai modellünk változóinak, tehát az 𝑥𝑗 azt
megfeleltethető a 𝑗 -edik tevékenységnek, ahol 𝑗 = 1,2, … , 𝑛 , azaz bármilyen pozitív
egész számot jelenthet a 𝑗 érték. A vállalatok a saját tevékenységüket bizonyos cél miatt
14
végzi. Különböző célok merülhetnek fel pl.: minél versenyképesebb jövedelem elérése,
export fokozása, import csökkentése stb.
Minél nagyobb jövedelem úgy érhető el, ha a realizálható és a megtermelhető
jövedelem függ a vállalat különböző tevékenységei milyen arányban és milyen szinten
folytatja, azaz ha a realizálható és a megtermelhető jövedelmet, amit 𝑧-vel jelölünk, annak
nagysága a változók függvénye lesz tehát 𝑥𝑗 . Ezt célfüggvénynek vagy hatékonysági
függvénynek nevezzük. Az 𝑥1, 𝑥2, 𝑥3, … , 𝑥𝑛 változók értékeit úgy határozzuk meg, hogy a
célfüggvény azok mellett a legkisebb vagy a legnagyobb legyen, azaz keressük a
célfüggvényünk minimumát vagy maximumát, azaz a szélső értékét.
A különböző tevékenységek különböző erőforrásokat igényelnek. Az erőforrások
könnyebb rendszerezésére a számvitelből már ismert mérleget írjuk elő. A mérlegünk egyik
oldalán szerepelnek az erőforrásokból felmerülő szükségletek (kereslet), másik oldalán
pedig a rendelkezésre álló mennyiségek (kínálat). Az 𝑥𝑗 függvény értéket úgy kell
megválasztanunk, hogy általunk előírt megfelelő reláció legyen a két oldal között és a
mennyiségek pontosan megegyezzenek, nem lehet több sem az egyik oldalon, sem a másik
oldalon. Az 𝑥 értékeknek ki kell elégíteni különböző mellékfeltételeket is, ami azt jelenti,
hogy kisebb egyenlő, nagyobb egyenlő vagy egyenlő lehet a 𝑏𝑥 értékével.
15
3.5 Megoldása egy termelésprogramozási feladatra
Feltételezzük, hogy van egy gyár, ami 𝑛-féle terméket gyárt. Feltételezzük, hogy
𝑚-féle erőforrás szükséges a termékek gyártásához.
A gyártási folyamat jellemzői:
𝑎𝑖𝑗 – Az 𝑖 -edik erőforrás 𝑗 -edik termék egysége, ami az előállításhoz szükséges
mennyiséget jelenti.
𝑏𝑖 – A rendelkezésre álló mennyiség az optimális időszak alatt az 𝑖-edik erőforrásból.
𝑐𝑖 – A gyártási haszna a 𝑗-edik termék egységének.
A termékösszetételek optimalizálása abból áll, hogy annyit akarunk gyártani az
egyes gyártható termékekből, amennyit lehetővé tesznek a rendelkezésre álló erőforrások,
mialatt a lehetőleg legnagyobb gyártási hasznot szeretnénk elérni. A megfogalmazott
probléma matematikai modelléhez be kell vezetni az 𝑥𝑗 döntési változót:
𝑥𝑗 – a gyártandó mennyiség az optimális időszak alatt a 𝑗-edik termékből.
Ezekben a felsorolásokban az 𝑖 indexű erőforrásegység 1-től 𝑚-ig tart, a 𝑗 pedig 1-től
𝑛-ig.
16
4. Szimplex módszer
4.1 A név eredete
Az 𝑚 dimenziós térben, ha nézünk egy 𝑚 + 1 pontot, akkor ezek egyike sincs a
többi konvex burkában benne, ezáltal az 𝑚 + 1 pontot konvex burka szerinti definíció egy
szimplexet alkot. Ez egy szakasz egy dimenzióban, háromszög két dimenzióban, tetraéder
három dimenzióban.
4.2 Szimplex módszer felépítése
1. Elkészítjük az induló táblázatot, amely az 𝑢1, 𝑢2, 𝑢3 és 𝑢4 szimbólummal a duális
változókat. A gyakorlati feladatoknál ezek az erőforrások számát fogják jelenteni.
2. A felső sorban az úgynevezett primál változók szerepelnek: 𝑥 vektor elemei.
3. Az alsó sorban a már említett optimális érték, azaz a célfüggvény fog szerepelni:
𝑐𝑇 vektor elemei.
4. A jobb szélső oszlopban pedig a készletvektor értékei fognak szerepelni, amelyet 𝑏-vel
jelöljük.
5. A táblázatot kikell egészítenünk azzal, hogy a célfüggvényünk sorának végére 0-t
teszünk, az elejére −𝑧-t írunk, azt kifejezve, hogy a célfüggvény értéke zérus, illetve a
célfüggvényünk értéke alapján maximumot kapunk.
17
4.3 Szimplex-módszer menete 1. Ha az LP feladat nem normalizált alakú és nem is kanotikus, akkor ezt át kell írni normál
alakúra. Ezután következik a 2. lépés.
2. Ha van lehetőségünk, keressük meg a lehetséges induló bázismegoldását a feladatnak. Ez
nagyon egyszerűen megtehetjük, mivel ha az eredeti feladatban csak ≤ relációs feltételek
szerepelnek, akkor a jobb oldalon található 𝑏 vektorban minden elemnek nem negatívnak
kell lennie. Ilyenkor bevezetünk az átalakításhoz mesterséges változókat: 𝑥𝑛+1 , ahol
𝑖 = 1,2, … 𝑚 értéket vehet fel, és ezeket használjuk bázisváltóként. Ha manuális előállítás
nem valósul meg az induló lehetséges bázismegoldásnak, akkor az erre legmegfelelőbb
módszert, a kétfázisú szimplex módszert kell használni. Miután az induló lehetséges bázis
megoldást előállítottuk folytatjuk a 3. ponttal.
3. Az aktuális lehetséges bázis megoldáshoz tartozó szimplex táblát elő kell állítani. 3.a Ha
az összes lehetséges nem bázis változóhoz tartozó nem negatív értékű redukált költség,
tehát ha optimális az összes lehetséges aktuális bázismegoldás. Akkor vége. 3.b Ha
található legalább egy nem negatív értékű , akkor ki kell választani a rendelkező nem bázis
megoldásokból egyet, ami a leírtak alapján befejezi ezt az eljárást, vagy áttér a 4. lépésre.
4. A megfelelő vektort és a kiválasztott változót a bázisba be kell vezetni, így előáll az új
lehetséges bázismegoldás, majd visszatér a 3. lépésre.
Ha a 3.a lépésben meg van oldva a feladat, akkor a feladat optimális megoldásának
tekinthető a lehetséges bázis megoldás. Abban az esetben, ha a 3.a pontban egy nulla értékű
is van, akkor feltételezhetjük, hogy több optimális megoldása is van lineáris programozási
feladatnak. Ilyenkor azt állítjuk, hogy alternatív megoldása van a lineáris programozási
feladatnak.
18
4.4 Bland-szabály
A szimplex-módszer esetén meg kell említeni még a Bland - szabályt, más néven
Legkisebb index szabály. 1977-ben Bland egy olyan szabályt fejlesztett ki a lineáris
programozási feladatokra, ami biztosítja a ciklizálás elkerülését a rendezett indexű
változók használata esetén.
- Ha a bázisba egynél több nem bázis változó is bevezethető, akkor a legkisebb
indexűt választjuk.
- Ha a bázisból egynél több változó került ki, akkor a legkisebb indexűt választjuk.
A szabály alkalmazása esetén nem ciklizálhat a szimplex módszer, emiatt véges
számú iterációs lépést követően véget ér, mivel ha véletlenszerűen választana, akkor nem
találná meg az optimum pontot.
4.5 A szimplex módszer tulajdonságai
- Primál bázisokon lépked;
- Egy oszlopot minden lépésben kicserélünk 𝑏-re;
- A primál célfüggvény értéke folyamatosan nő, azaz nem csökkenhet;
- Egy optimális bázismegoldáshoz véges sok lépésben jutunk el.
19
5. Érzékenységvizsgálat
5.1 Érzékenységvizsgálat kapcsolata a szimplex-módszerrel
Érzékenység vizsgálaton azt értjük, hogy milyen hatással lesz a szimplex módszer
által létrehozott feladat az optimális megoldásra az, ha a feladatunk paramétereit különböző
lehetséges értékeket vehet fel.
A gyakorlati példák alapján, amelyeket a programozási részben megoldottam azt
tapasztaltam, hogy van néhány olyan paraméter, amelyek számára bármilyen normális
értéket megadhatunk anélkül, hogy az optimális megoldásunknak befolyásolná, viszont
lehetnek olyan paramétereket, amelyek apró változtatása is új optimális megoldást alakít ki.
Az optimális megoldás esetén a változatlanság azt jelenti, hogy a bázisváltozók
megmaradnak, mint bázisváltozók. Ez azt jelenti egy termelésprogramozási feladat
esetében, hogy az eddig még nem gyártott termékeket továbbra se fogjuk gyártani és a már
gyártott termékeket más mennyiségekben gyártjuk, akkor a célfüggvény értéke változhat.
Különösebb problémát vett fel, ha a célfüggvény értéke kisebb lesz. Egy jövőbeni
döntések esetén csupán csak becsült adatokkal tudunk számolni, legtöbbször gyakorlatban
a célfüggvény értékei és a kapacitások változásainak hatását kell vizsgálni. Sok esetben a
paraméterek adatai becsült adat, emiatt az optimális tábla létrehozásához szükségünk van
arra, hogy ezeket feltehetjük, mi lett volna, ha egy-két adatot megváltoztatnánk, akár kis
mértékben is, az erőforrások növekedése megváltoztathatja a termelési szerkezetet, illetve
gazdasági szempontból a piac árainak változása mennyire befolyásolja az optimális
megoldást.
20
5.2 Célja
Az alapesetből kifolyólag az eltérés a legjobb becsléstől, illetve a különböző
eltérések bekövetkezésének valószínűségének lehetősége milyen hatással van a
termelésmutatók, teljesítménymutatók változása. Az érzékenységvizsgálat során meg kell
vizsgálni a különböző hatásokat, amelyekre a változók a teljesítménymutatókban változást
okozhatnak.
5.3 Feltétele
Hogyan változhat meg a feltétel jobboldala, hogy a táblánk optimális legyen. Az
érzékenység vizsgálat célja egy termelésprogramozási feladatban a maximális árbevétel
elérése, ami gazdaságosabb ebből a termékből, a többi termék rovására többet előállítani.
Felmerül egy olyan probléma, hogy mekkora ár esetén lesz gazdaságos az optimális
termelési program változása és legfeljebb mekkora árváltozás esetén lesz a jelenlegi
termelési program optimális.
5.4 Jobb oldal változása
Két különböző esetet különböztethetünk meg, hogy az optimális táblában
bázisváltozó-e a vizsgálandó kapacitáshoz tartozó kiegészítő változó. Az egyik feltevés,
hogy a változó nem bázisváltozó: tehát melyik 𝑏 értékre marad még optimális a megoldás.
Akkor marad optimális a bázismegoldás, ha teljesül a feltétel a 𝑡2 -re is. A kiegészítő
változó bázisváltozó: ebben az esetben a b változó nincs hatással az 𝑢1, … , 𝑢𝑛 értékekre.
21
5.5 Esetei
Alapvető célja a modell paramétereinek meghatározása, azon paramétereket között,
amelyek megváltoztatása után sem változik meg az optimális megoldás. Különösen
figyelni kell arra, hogy érzékenységvizsgálat során egyszerre egy értéket lehet változtatni,
mivel ha egynél több érték megváltozik, akkor az érzékenységvizsgálat nem feltétlenül
teljesül, mivel nem tudjuk, hogy melyik érték változása hozta meg a kívánt illetve a
megváltozott eredményt.
22
6. A Gomory vágás
A Gomory vágás szoros kapcsolatban van az Operációkutatás, a Lineáris
programozás és a Szimplex-módszerrel is, emiatt szeretnék néhány fontos információt
megosztani erről.
6.1 Az eljárás lényege
1. Előállítunk egy optimalizálási megoldást a szimplex táblázatban (ha létezik!). Ha
mégsem létezik, akkor nem létezik egyértékű optimális megoldás se.
2. Az optimális megoldásban a változók értéke egész, akkor a feladat egészértékű
optimumának értékét is megkapjuk.
3. Amennyiben a folytonos optimális megoldásban nem minden változó értéke egész,
akkor a tört értékű bázisváltozónak sorából feltételt készítünk, és az optimális táblázathoz
csatoljuk.
4. Előállítjuk emiatt az új optimális táblázatot a kiegészített táblázatban. Ezután folytatjuk a
2. és a 3. lépéssel.
23
7. Nemlineáris programozás
Eddig a lineáris programozás részleteit mutattam be, szeretném bemutatni a
nemlineáris programozás sajátosságait is.
7.1 A lineáris programozásnak alapvető feltétele
Az 𝑓(𝑥) célfüggvény, 𝑔(𝑥) kényszerfeltétel lineáris, amelyek sok gyakorlati
példában nem teljesülnek. A közgazdászok úgy gondolják, hogy a nemlinearitás tervezési
feladatok esetén szinte szabály. Példának lehet említeni az ár-keresleti görbét (𝑝(𝑥)),
amelyben a 𝑝(𝑥) az az érték, amelyet az 𝑥 egységből el lehet még adni. Ha a termeléshez
szükséges költség 𝑐 , akkor a 𝑃(𝑥) = 𝑥 × 𝑝(𝑥) − 𝑐 × 𝑥 nem lineáris célfüggvényt adja
meg.
Ha a cél összes termékének a hasznosságfüggvénye megegyezik, akkor az eredendő
célfüggvény a következő:
𝑛
𝑓(𝑥) = ∑ 𝑃𝑗 (𝑥𝑗), 𝑗=1
ahol 𝑗 = 1,2, … , 𝑛 , azaz nem lineáris függvények összege.
7.2 Kialakulása
Sokféle képen jönnek létre a nemlineáris programozási feladatok. Nem ismert
egyetlen közös algoritmus, amely által egzakt megoldást kapnánk, hanem egy-egy
feladatban előforduló speciális feladatok megoldására dolgoztak ki algoritmusokat.
24
Minden nemlineáris programozási feladatnál feltételezzük, hogy a kényszerfeltételek
megegyeznek a lineáris függvényekkel, így azt is állíthatjuk, hogy ezek a feladatok,
amelyek esetén csak a célfüggvény nemlineáris.
7.3 Feladatok osztályozása
Legfontosabb szempont: A célfüggvény milyen függvény valójában?
Abban az esetben, amikor a célfüggvény lineáris törtfüggvény, akkor beszélünk
hiperbolikus programozásról. Ha a célfüggvényünk másodfokú, akkor kvadratikus a
programozásunk.
25
8. A programról
8.1 C# Története
A nyelv túl hosszú múlttat nem tud felmutatni, de az elődjének a C++ nyelvet
tekintjük, amelynek szintaktikája és a szerkezeti felépítése megegyezik a C# programozás
nyelvével. A C# nyelv (ejtsd: szí-sárp) a .NET fő programozási nyelve a Visual Basic
mellett. A programnyelv fejlesztése 1999-ben kezdődött meg Anders Hejlsberg vezetése
mellett.
A C# programozási nyelv tisztán objektumorientáltnak nevezhető, emellett típus
biztos, illetve általános felhasználású nyelv. A tervezés kialakításánál a produktivitás
lehető legnagyobb elérését tekintették legfontosabb irányútnak, viszont szerették volna
megtartani a C++ hatékonyságát. Tehát a fejlesztéseket úgy próbálták kialakítani, hogy a jó
a C++ rossz tulajdonságait kijavítsa, viszont a jókat megőrizze.
A nyelv kezdetben plattform független volt (létezett Mac és Linux fordító is), de
napjainkban a Microsoft implementációja biztosítja a legnagyobb hatékonyságot. 2002-ben
jelent meg a Microsoftnak az új fejlesztési környezete, a Visual Studio.NET
programcsomag részeként.
A C#-ot tekintjük a .NET keretrendszer új bázisnyelvének, amelyet ehhez a
keretrendszerhez tervezték, tehát az sem véletlen, hogy a szabvány azonosítójuk egymástól
csak egy értékekkel tér el. A nyelv teljes mértékben komponens orientáltnak tekinthető. A
Visual Basic fejlesztési gyorsaságát és a C# hatékonyságát, ötvözték ebben az eszközben a
fejlesztők és a diákok számára.
26
8.2 C# Jellemzői
A C# programozási nyelvnek a legfontosabb elemeinek a következőket tekintjük:
- Neumann-elvű, Professzionális. Nagy programok és rendszerprogramok írására
alkalmasnak tekinthető.
- A programok több fordítási egységekből, fájlból, modulokból áll. Minden
fájlnak vagy modulnak a szerkezete azonos.
- Több utasítás is irható egy sorba. A pontosvessző (;) lezáró jele az utasításoknak.
Deklarálni kell minden egyes változót. Függvények és a változók nevében az
ékezetes karaktereket is lehet használni, a betűk esetén a kis- és nagybetű
különböző.
- Parancssorból a keretrendszer fordításának parancsa is meglehetősen egyszerűen
használhatóak.
(pl. css/out:körte.exe körte.cs).
- Összetett utasítások (blokkok) írhatóak az utasítások helyére. Az összetett
utasításokat definiálják kapcsos zárójelek közé írt {} utasításoknak.
- Érték (alaptípusok, struct, value, enum) illetve a referencia típusú (class)
változók.
- Mutatók használata nincs; vektorhasználat emiatt biztonságosnak tekinthető.
- Unboxing, boxing. Az object-et tekintjük minden típus ősének, így például az
egész típust (int) objektumból kicsomagolhatunk (unboxing) illetve
becsomagolhatunk (boxing).
- Nem ágyazhatóak egymásba a függvények definíciói, meghívhatja önmagát
(rekurzió). Tehát nincs blokkstruktúra egy függvénydefiníció esetén. Blokkon
belül dinamikus és statikus élettartamú változókat deklarálhatunk.
Függvény poliformizmus megengedett.
27
- Output (out) a függvényparaméterek, az érték és referencia a (ref).
- Változó paraméterszámú függvényeket deklarálhatunk, kezdő paraméterek
értékadással járnak.
- Események használata, delegáltak.
- Osztályok egy hierarchikusnak tekinthető névterekben használhatóak. Tehát
mivel minden osztály ilyen, emiatt a „program” Main függvény public static
hozzáférésű. Main függvényt több különböző osztály is tartalmazhat, de ebben
az esetben meg kell említeni fordításkor, hogy mikor melyik legyen az aktuális
induló Main függvény.
(/main:osztálynév)
- Új operátorok: az objektum típusát ellenőrzi az is operátor (y is Hajó), as
operátor pedig a jobb oldali típussá konvertálja a bal oldali operandusunkat
(Hajó 1 = y as Hajó;)
A konverziós operátortól abban tekintünk különbséget, hogy ez nem egy
generált kivétel!
- Léteznek privát konstruktorok (egy példányt sem akarunk), statikus konstruktor
(minden példányunk egy konstruktor előtt hívódik meg, statikus mezők
inicializálására, egy osztálybetöltő hívja meg a futási időben) használata.
- Nem létezik destruktor, ehelyett van a keretrendszerünk szemétgyűjtési
algoritmusa. Dispose metódusa újradefiniálható az osztálynak szükség esetén.
- Interface-ek használata, egyszeres öröklődés.
- Operátorok definiálására több lehetőségünk van, property, indexer definiálása.
- Kivételek megvalósítása.
- Párhuzamos végrehajtású szálaknak a definiálhatósága.
A .NET programozáshoz legmegfelelőbb választás a Microsoft saját fejlesztésű terméke, a
Microsoft Visual Studio. A fizetős változatok mellett természetesen léteznek ingyenes,
úgynevezett Express csomagok is, amely a felhasználó számára teljes kiszolgálást biztosít.
28
8.3 A szimplex-módszert megoldó program
8.3.1 A program használata és a forráskódok
A program működését a Microsoft Visual Studio Enterprise 2017-es verziójában fogom
bemutatni. Amelyet a következő linken bárki számára elérhető és letölthető:
https://www.visualstudio.com/vs/
A Start gomb megnyomásával indítjuk el a programunkat:
1. ÁBRA: WINDOWSFORMAPLLICATION65 FÁJL ELINDÍTÁSA
Amely ezt követően megmutatja a grafikus felületét a programnak. A grafikus felület
létrehozása a properties segítségével oldottam meg.
Négy különböző dolgot kellett létrehozni a program teljes felépítésének érdekében:
1) címke létrehozása: private System.Windows.Forms.Label label1;
2) szövegdoboz létrehozása: private System.Windows.Forms.TextBox textBox1;
3) gomb létrehozása: private System.Windows.Forms.Button button1;
4) táblázat létrehozása: private System.Windows.Forms.DataGridView dataGridView1;
A programot alkalmazásként is elindíthatjuk a WindowsFormApplication65 mappára
kattintva, ezután szintén erre kattintunk, ezután bin mappára, majd a Debug mappa
következik, itt pedig a .exe kiterjesztésű alkalmazást kell elindítani, a fájl típusa
alkalmazás.
29
A program kezdőképernyője a következő lesz:
2. ábra: A program grafikus felületének kezdőképernyője
A programot kétféle-módon lehet használni:
Már előre lementett feladatot hívunk a 𝑓𝑒𝑙𝑎𝑑𝑎𝑡. 𝑡𝑥𝑡 fájlból. A CD-n 1-től 5-ig, illetve a
Szakdolgozatomban szereplő 11-es feladat érthető el, a többi feladat esetében előre létre
kell hozni, illetve a feladat megírása során menteni kell az adott feladatot, a későbbi
visszakeresés és a hatékonyabb tanulás érdekében.
A Mentés gomb nagy előny abban az esetben is, ha több példát is át akarunk majd nézni a
későbbiekben.
.
30
A 𝑓𝑒𝑙𝑎𝑑𝑎𝑡11. 𝑡𝑥𝑡 fájlt használom a program tesztelésére és a működésére:
3. ÁBRA: A FELADAT11.TXT FÁJL BETÖLTÉSE
Fájlból beolvasás programkódja: if (textBox1.Text != null && textBox1.Text != "")
{
String fileName = @"Példaprogramok\feladat" + textBox1.Text + ".txt";
Console.WriteLine(fileName);
try
{
StreamReader streamReader = new StreamReader(fileName);
String meret = streamReader.ReadLine();
String[] meretek = meret.Split(' ');
int sor = Convert.ToInt32(meretek[0]);
int oszlop = Convert.ToInt32(meretek[1]);
textBox2.Text = sor.ToString();
31
textBox3.Text = oszlop.ToString();
double[,] matrix = new double[sor, oszlop];
for (int i = 0; i < sor; i++)
{
String sorSzoveg = streamReader.ReadLine();
String[] szamok = sorSzoveg.Split(' ');
for (int j = 0; j < oszlop; j++)
{
matrix[i, j] = Convert.ToDouble(szamok[j]);
}
}
AdatokFeltolt(sor, oszlop, matrix);
}
catch (Exception exp)
{
}
}
else
{
MessageBox.Show("Nem sikerült a fájlt beolvasni!");
Console.WriteLine(exp.StackTrace);
AdatokFeltolt(Convert.ToInt32(textBox2.Text),
Convert.ToInt32(textBox3.Text), null);
}
}
A 11-es fájl a sor és oszlop mezőkhöz társítja a már korábban definiált feladat adatait – sor
és az oszlop értékeket - és a Tábla feltöltés gomb megnyomásával pedig feltölti azokat. A
fájlban úgy történik a lementés és a feltöltés, hogy az első sorban a sor és az oszlop
32
nagyságainak értéke vannak egymástól szóközzel elválasztva, utána pedig a mátrix
sorainak és oszlopainak értékei:
4. ÁBRA: A FELADAT11.TXT JEGYZETTÖMB ELHELYEZKEDÉSE
A másik megoldás a program sor és oszlopvektorainak megadásával saját feladat készítése:
5. ÁBRA: A MÁTRIX FELTÖLTÉSE
33
Tehát megadtuk a sor(5) és az oszlop(3) értékeit a Tábla feltöltés mezőjére kattintással,
ezután pedig megkapjuk a feltölteni kívánt mátrixunknak, amelyet saját példafeladataink
alapján kitölthetünk a következő kép szerint:
6. ÁBRA: MÁTRIX FELTÖLTÉSE SAJÁT ADATOKKAL
A megadott értékeket a feladatszám megadását követően a Mentés gombra kattintva
lementhetjük és eltárolhatjuk, ha esetleg később is hasznát vehetnénk a feladat ellenőrzése
céljából.
7. ÁBRA: SIKERES MENTÉS KÉPABLAKA!
34
Sikeres mentés programkódja:
try
{
StreamWriter sw = new StreamWriter(fileName);
sw.WriteLine(sor + " " + oszlop);
for (int i = 0; i < sor; i++)
{
for (int j = 0; j < oszlop; j++)
{
if (j != oszlop - 1)
{
+ " ");
sw.Write(dataGridView1.Rows[i].Cells[j].Value
}
else
{
+ " ");
sw.Write(dataGridView1.Rows[i].Cells[j].Value
}
}
sw.WriteLine();
}
sw.Flush();
sw.Close();
MessageBox.Show("Sikeres mentés!");
}
catch (Exception exp)
{
MessageBox.Show("Nem sikerült a mentés!");
Console.WriteLine(exp.StackTrace);
}
}
}
35
Ha olyan feladatot akarunk betölteni, amelyet korábban nem mentettünk el, vagy nem
létezik, akkor a következő hibaüzenetet kaphatjuk:
Nem sikerült a fájlt beolvasni!
Ilyen esetekben egy másik fájlt kell választani a program sikeres futásának érdekében!
Tehát az ábrán a 𝑓𝑒𝑙𝑎𝑑𝑎𝑡6. 𝑡𝑥𝑡 fájlt szerettem volna beolvasni. Sor és oszlop értékei
minden esetben 0 lesz ilyen helyzetben mivel nem létezik a fájl, a tábla feltöltés nem is
valósul meg, mivel a mátrix nem létezik, esetleges sor és oszlop megadásával a tábla
feltöltésre kattintva feltölthető a mátrix, ami után a feladatszám mezőbe a 6-os értéket
beleírva, illetve a mentés gombra kattintva lementhető a fájl.
8. ÁBRA: SIKERTELEN FÁJL BEOLVASÁS KÉPABLAKA!
A sikertelen fájl beolvasásának programkódja:
try
{
StreamReader streamReader = new StreamReader(fileName);
String meret = streamReader.ReadLine();
String[] meretek = meret.Split(' ');
36
int sor = Convert.ToInt32(meretek[0]);
int oszlop = Convert.ToInt32(meretek[1]);
textBox2.Text = sor.ToString();
textBox3.Text = oszlop.ToString();
double[,] matrix = new double[sor, oszlop];
for (int i = 0; i < sor; i++)
{
String sorSzoveg = streamReader.ReadLine();
String[] szamok = sorSzoveg.Split(' ');
for (int j = 0; j < oszlop; j++)
{
matrix[i, j] = Convert.ToDouble(szamok[j]);
}
}
AdatokFeltolt(sor, oszlop, matrix);
}
catch (Exception exp)
{
MessageBox.Show("Nem sikerült a fájlt beolvasni!");
Console.WriteLine(exp.StackTrace);
}
A következő lépés a Szimplex-módszer lépéseinek a módszere, amelynek első lépése az,
hogy ki kell választanunk a helyes pivotelemet.
37
A pivotelem kiválasztásának sok feltétele van:
1. feltétel:
Nulla értékű elemet nem választhatunk pivotelemnek. Erre a program is figyelmeztet a
következő hibaüzenettel: A pivotelem nem lehet 0!
9. ÁBRA: A PIVOTELEM NEM LEHET 0!
if (pivotElem == 0)
{
MessageBox.Show("A pivotelem nem lehet 0!");
return;
}
2.feltétel:
Az utolsó sorból és az utolsó oszlopból nem választhatunk pivotelemet.
A hibaüzenet oka az, hogy míg az utolsó sor a célfüggvényünk értéke lesz, addig az utolsó
oszlop pedig a 𝑏 értékek lesznek, ami a kapacitás és a készletnek felel meg, emiatt azokat
sem lehet választani!
38
Ezután következő hibaüzenetet kapjuk: Nem választható pivotelem! Válasszon másikat!
10. ÁBRA: AZ UTOLSÓ SOR ÉS AZ UTOLSÓ OSZLOPBÓL NEM LEHET PIVOTLEMET VÁLASZTANI!
pivotSor = dataGridView1.SelectedCells[0].RowIndex;
pivotOszlop = dataGridView1.SelectedCells[0].ColumnIndex;
Válasszon
if(pivotSor==sor-1 || pivotOszlop==oszlop-1)
{
MessageBox.Show("Nem választható pivotelem!
másikat!");
}
return;
}
double celErtek =
Double.Parse((string)dataGridView1.Rows[sor-1].Cells[pivotOs
zlop].Value);
double pivotElem
=Double.Parse((string)dataGridView1.Rows[pivotSor].Cells[pivotOszlop].Value
);
39
3.feltétel:
A szűk keresztmetszet feltétele, tehát nevező(𝑏) és a pivotelem értékét el kell osztani és
megkapjuk a hányadost, amelyek közül a legkisebbet kell választanunk. Ennél a feltételnél
a hibaüzenetből kapunk egy kisebb segítséget, hogy honnan kell kiválasztanunk a jó
pivotelemet:
Hibaüzenet: Nem a legszűkebb keresztmetszet egyikét választotta! A 4 sor megfelelő
választás lenne.
11. ÁBRA: SZŰK KERESZTMETSZET VÁLASZTÁSÁNAK LEHETŐSÉGEINEK PROBÁLKOZÁSA if (celErtek>0)
{
Double szamlalo =
Double.Parse((string)dataGridView1.Rows[pivotSor].Cells[oszlop-1].Value);
double hanyados = szamlalo / pivotElem;
double minErtek = hanyados;
Console.WriteLine(hanyados);
Double minIndex = 0;
for (int i=0; i<sor-1; i++)
{
Double nevezo =
Double.Parse((string)dataGridView1.Rows[i].Cells[pivotOszlop].Value);
40
szamlalo =
Double.Parse((string)dataGridView1.Rows[i].Cells[oszlop - 1].Value);
if(nevezo==0)
{
continue;
}
Double ertek = szamlalo / nevezo;
if(ertek<minErtek)
{
minErtek = ertek;
minIndex = i;
}
Console.WriteLine(ertek + " " + minErtek);
}
if(hanyados==minErtek)
{
}
else
{
választotta! A "
}
} else
{
MessageBox.Show("Nem a legszűkebb keresztmetszet egyikét
+ (minIndex + 1) + " sor megfelelő választás lenne!");
return;
MessageBox.Show("Csak olyan oszlopból választhatunk
pivotelemet, ahol a célfüggvény érték nemnegatív!");
return;
}
41
Tekintsük az induló táblázatunkat – szűk keresztmetszet vizsgálata:
Mivel 5 > 3, ezért 𝑥2 oszlop értékével érdemes dolgozni, mivel a célfüggvényt minden
egysége 5-el növeli a célfüggvényünk értékét!
48 25 6 𝑚𝑖𝑛 = {
6 ;
3 ;
2 }
Ebből kiderül, hogy a legkisebb értéke a mátrixunknak a 6 2
, azaz a 3. Tehát a 2 lesz a
helyes pivotelem, de a hibaüzenetből: Nem a legszűkebb keresztmetszet egyikét
választotta! A 4 sor megfelelő választás lenne! Így kiderül, hogy a 0 és a 2 közül kell
választanunk, mert a 𝑏 oszlopból nem lehet választani, és korábban kikötöttük, hogy csak
pozitív szám lehet a pivotelem, ebből kiderül, hogy a 2 lesz a helyes megoldás.
12. ÁBRA: A HELYES PIVOTELEM KIVÁLASZTÁSA
Ami által meg is kaptuk az első pivotálás eredményét, illetve előtte láthatjuk az eredeti
mátrixunkat a bázisváltozókkal együtt!
42
Bázisváltozók létrehozása:
1,–z kiíratása:
for (int i = 0; i < ertek1 - 1; i++)
{
sorBazis[i] = "u" + (i + 1);
}
sorBazis[ertek1 - 1] = "-z";
}
2, x kiíratása:
for (int j = 0; j < ertek2-1; j++)
{
(j + 1);
}
oszlopBazis[j] = "x" +
3, b kiíratása:
oszlopBazis[ertek2 - 1] = "b";
A következő pivottábla kirajzolásának módja:
ujSorKezdet = (sor + sorKoz) * pivotalasSzam + 1;
Console.WriteLine("HOL " + ujSorKezdet);
for (int i = 0; i < sorKoz; i++)
{
dataGridView2.Rows.Add();
}
for (int j = 0; j < oszlop; j++)
{
dataGridView2.Rows[ujSorKezdet - 1].Cells[j +
oszlopEltolas].Value = oszlopBazis[j];
}
43
Ezt követően ki kell választanunk a következő helyes pivotelemet, a 2 nem helyes
megoldás, de a hibaüzenetből megtudjuk, hogy a 9. sorban található a helyes pivotelem.
Megnézzük a 9. sorban: a 6 és a −3 értékek vannak, ebből kiderül, hogy negatív érték sem
lehet pivotelem, illetve majd később kiderül, hogy a célfüggvény értéke negatív előjelű,
akkor az sem lehet pivotelemnek választani. A helyes választás a : 6.
13. ÁBRA: A 2 TÁBLÁBÓL A 3. TÁBLA LEPIVOTÁLÁSA
Szimplex-módszer algoritmusának lépései programkóddal:
1) sor és oszlop változók cseréje:
String t = oszlopBazis[pivotOszlop];
oszlopBazis[pivotOszlop] = sorBazis[pivotSor];
sorBazis[pivotSor] = t;
2) A pivotelem helyét a reciprokkal elosztjuk (1/pivotelem):
double eredetiPivotelem = elozoMatrix[pivotSor, pivotOszlop];
elozoMatrix[pivotSor, pivotOszlop] = 1 / elozoMatrix[pivotSor, pivotOszlop]
44
3) Pivotelem sorát elosztjuk a pivotelemmel (pivotelemet nem kell osztani, mivel a 2.
pontban vettük a reciprókát:
double[,] eredetiPivotSor = new double[1, oszlop];
for (int j = 0; j < oszlop; j++)
{
if (j != pivotOszlop)
{
eredetiPivotelem;
}
eredetiPivotSor[0, j] = elozoMatrix[pivotSor, j];
elozoMatrix[pivotSor, j] = elozoMatrix[pivotSor, j] /
}
4) A pivotelem oszlopát elosztjuk a pivotelem (−1) szeresével. Kivéve a pivotelemet
mivel azt már eloszottuk a pivotelem reciprokával (1/pivotelem):
double[,] eredetiPivotOszlop = new double[sor, 1];
for (int i = 0; i < sor; i++)
{
if (i != pivotSor)
{
eredetiPivotOszlop[i, 0] = elozoMatrix[i, pivotOszlop];
elozoMatrix[i, pivotOszlop] = elozoMatrix[i, pivotOszlop] /
(-eredetiPivotelem);
}
}
45
5) téglalapszabály
Képlete: 𝑑 = 𝑑 − 𝑏𝑐
, ahol 𝑎 ≠ 0 , 𝑏 és 𝑐 a téglalap két csúcsának felel meg. És abban 𝑎
az esetben teljesül ez a feltétel, ha 𝑏 = 0 vagy 𝑐 = 0.
14. ÁBRA: A TÉGLALAPSZABÁLY
A alábbi ábrán a 18-as számra mutatom be a téglalapszabályt:
Ezen az ábrán a 𝑏 = 30, amely 𝑢1 sorban helyezkedik el, 𝑐 = 2, amely az 𝑢2 sorban
helyezkedik el, 𝑑 a keresett mező ebben az esetben 18 , és az 𝑎 = 6, amely az 𝑥1 és az
𝑢1 metszete.
Minden esetben ezt használjuk kivéve amikor a pivotelem sora, illetve oszlopa mivel ott
már elvégeztük a szükséges műveleteket, amelyet az if feltételben ki is kötöttünk:
for (int i = 0; i < sor; i++)
{
for (int j = 0; j < oszlop; j++)
{
if (i != pivotSor && j != pivotOszlop)
{
elozoMatrix[i, j] = elozoMatrix[i, j] -
(eredetiPivotSor[0, j] *
eredetiPivotOszlop[i, 0]) / eredetiPivotelem;
}
}
}
46
A pivotálást addig kell folytatni, amíg minden feltétel teljesül. Tehát a pivotelem értéke
nem lehet nulla a célfüggvény értéke nem lehet negatív, illetve az utolsó sort (−𝑧) és az
utolsó oszlopot (𝑏) nem használhatjuk:
15. ÁBRA: KÖVETKEZŐ PIVOTELEM KERESÉSE AZ ELSŐ MÁR PIVOTÁLT TÁBLÁNKBÓL
Ami által megkaptuk az optimális megoldást, mivel a következő tábla elemei nem
pivotálható, mivel a célfüggvény értéke (−𝑧) értéke negatív:
16. ÁBRA: MÁSODIK TÁBLÁNK HELYES PIVOTELEMÉNEK KIVÁLASZTÁSA
47
Megkaptuk a következő táblánkat, megnézzük, hogy tovább pivotálható-e a mátrixunk:
17. ÁBRA: A CÉLFÜGGVÉNY ÉRTÉKE NEM LEHET NEGATÍV
Tehát a táblánk nem pivotálható tovább, mivel mindkét célfüggvény értéke negatív előjelet
tartalmaz és emiatt a célfüggvény értéke nem növekedhet:
18. ÁBRA: AZ OPTIMÁLIS TÁBLA
48
Így megkaptuk az optimális eredményt:
19. ÁBRA: EREDMÉNYEK TÁBLÁZAT KIMUTATÁSA
Eredmények táblázat kiíratásának módja:
𝑥 értékének kigyűjtése:
for(int i=1; i<oszlop; i++)
{
double ertek = 0;
for(int j=0; j<sor-1; j++)
{
if(sorBazis[j]==("x"+i))
{
ertek = elozoMatrix[j, oszlop - 1];
break;
}
}
dataGridView3.Rows[0].Cells[i - 1].Value = ("x" + i);
dataGridView3.Rows[1].Cells[i - 1].Value = ertek;
}
49
𝑢 értékének kigyűjtése:
for (int i = 1; i <= sor-1; i++)
{
double ertek = 0;
for (int j = 0; j < sor - 1; j++)
{
if (sorBazis[j] == ("u" + i))
{
ertek = elozoMatrix[j, oszlop - 1];
break;
}
}
dataGridView3.Rows[2].Cells[i - 1].Value = ("u" + i);
dataGridView3.Rows[3].Cells[i - 1].Value = ertek;
}
𝑧 értékének a kigyűjtése:
oszlop-1];
dataGridView3.Rows[4].Cells[0].Value = "z";
dataGridView3.Rows[5].Cells[0].Value = (-1)*elozoMatrix[sor-1,
}
Így megkaptuk az optimális értékeket! A 𝑧 értéket úgy kaptuk meg, hogy a – 𝑧 értékét
megszoroztuk (−1) −el!
Elemzése:
Tehát az 𝑥1 termékből 5 darabot állítunk elő, míg az 𝑥2 termékből pedig 3 darabot. Az
első és a negyedik nyersanyag teljesen elfogy, míg a második nyersanyagból 8 egység, a
harmadik nyersanyagból 16 egység maradt. Ez a termelési program mellett a
maximálisnak tekinthető bevétel (𝑧) 30 egység lett.
50
Összefoglaló:
Szakdolgozatom célja az Operáció-kutatás egyik ágának a Szimplex - módszernek a
bemutatása és erre egy oktatás segítő program készítése, amely megkönnyíti a szimplex
módszer használatát a diákok számára.
A szakdolgozatom első felében az optimalizálás történeti áttekintését és a szükséges
információkat mutatom be, amely során a gyakorlati, matematikai része könnyebben
megérthető, bár ez a terület, inkább gyakorlatorientált mégis szükség van olyan
információkra, amelyek nélkül nem lehetne a gyakorlati részét teljes mértékben elsajátítani.
A második részben az oktatást segítő programot, annak használatát, folyamatait
mutatom be programkódokkal és a programkód általi képekkel, amely programozási
előképzettség nélkül is könnyen használható.
A program készítése során Visual Studio Enterprise 2017-es fejlesztőkörnyezetet
használtam, a program C# nyelven íródott grafikus felülettel. A program lépésről-lépésre
végig vezeti a feladat menetét, a nyomógombok segítségével könnyen használható a
program néhány kattintással.
A Szimplex-módszert bemutató program során lehetőségünk van egy adott fájlból
betölteni egy kész feladatot és annak sajátosságait, megoldását vizsgálni és saját feladat
vizsgálatára is módunk van, amelyet a felhasználó saját adatai során tölthet be. Ezáltal egy
olyan optimális megoldást kapunk, amit a gazdaságban és a termelésben is előszeretettel
használnak, mivel optimális termelés mellett nagyobb haszon érhető el.
Úgy gondolom, hogy a XXI. században az online-tanulásnak nagyon nagy
jelentősége van, már a gyerekek kisgyermek kortól a számítógép világában élnek, és úgy
gondolom, hogy a felesleges időtöltések helyett szükség lenne olyan dolgokat tanulniuk,
amelyekhez később hasznát tudják venni a továbbiakban is.
51
Summary:
The aim of my thesis is to discuss one of the methods in the field of operations
research, namely the simplex method, and also to create an education support program
which makes the use of the simplex method easier for students.
The first part of my thesis gives a historical review of optimization and offers the
necessary information needed to understand the practical and mathematical parts. Though
this field is rather practical, there are some pieces of information that are needed for the
complete acquisition of the practical part itself.
The second part of the thesis deals with the education support program – which can
be used easily without having any experience or qualification in programming – and its use
and processes, which are illustrated by program codes and pictures.
The program was made using the Visual Studio Enterprise 2017 development
environment and was created in C# programming language with a graphic user interface.
The program leads the user along the task step by step: it can be used easily only with a few
clicks.
The program, which uses the simplex method, allows the user to load a finished task
from a given file and to analyze its characteristics and solution. But it is also possible for the
users to analyze their own task by giving their own data. This gives them an optimal
solution which is often used in economy and production as well, since optimal production
leads to a greater profit.
In my opinion, online learning has a great importance in the 21st century. Children
are surrounded by computers and several kinds of electronic devices from early on, and I
believe that instead of spending their time with useless activities, they should learn things
that they can make use of later in the future.
52
Adathordozó használata:
Egy CD tarozik a Szakdolgozatomhoz mellékletként.
A CD-n két mappa található:
- Szakdolgozat:
A Szakdolgozat található PDF formátumban: Szakdolgozat.pdf.
- Program:
Itt található a program forráskódjai, illetve a fájl beolvasásához
Szükséges feladatok .txt formátumban.
A program futásához a Microsoft Visual Studio 2017 Enterprise-t javaslom.
Az alkalmazás megtalálható a WindowsFormApplication65 dokumentumban, itt a .csproj
kiterjesztésű fájlt kell elindítani.
A példaprogramok a WindowsFormApplication65 mappán belül a Peldaprogramok
mappában találhatóak.
53
Irodalomjegyzék: [1] Dr. Tóth József: Operációkutatási ismeretek és mezőgazdasági alkalmazásuk, 1988
Debrecen , Agrártudományi Egyetem Debrecen
[2] Farkas István: Bevezetés a lineáris programozásba, Debreceni Egyetem Gazdaságelemzési
és Statisztikai Tanszék
[3] Ferenczi Zoltán: Operációkutatás, 2006 , Széchenyi István Egyetem
[4] Frank András – Király Tamás: Operációkutatás, 2013, Eötvös Lóránd Természettudományi
Egyetem
[5] Fábos Róbert: Katonai logisztika.
[6] Komáromi Éva: Lineáris programozás, 2002, Budapesti Közgazdaságtudományi és
Államigazgatási Egyetem
[7] Dr. Nagy Tamás: Egészértékű programozás, Miskolci Egyetem, Alkalmazott Matematikai
Tanszék
[8] Dr. Ábrahám István: A lineáris programozás I.
[9] Szántai Tamás: Az operációkutatás matematikai módszerei, 1999, Budapest
[10] Varró Zoltán – Temesi József: Operációkutatás, 2007, AULA Kiadó Kft, Budapesti
Corvinus Egyetem.
[11] Tóth Georgina Nóra: Operációkutatás
[12] Dr. Házy Attila: Nemlineáris optimalizálás, 2011, Kempelen Farkas Hallgatói
Információs Központ
[13] Klaus Neumann : Operations Research
[14] Hamdy A. Taha: Operations Research an introduction
[15] Reiter István: C# programozás lépésről lépésre, 2016, Jedlik Oktatási Stúdió Bt.
[16] Illés Zoltán: Programozás C# nyelven, 2008, Jedlik Oktatási Stúdió Bt.
[17] https://hu.wikipedia.org/wiki/Oper%C3%A1ci%C3%B3kutat%C3%A1s
[18] https://hu.wikipedia.org/wiki/Szimplex_algoritmus
[19] https://hu.wikipedia.org/wiki/Line%C3%A1ris_optimaliz%C3%A1l%C3%A1s
54
Köszönetnyilvánítás:
Elsősorban szeretném megköszönni témavezetőmnek, Dr. Házy Attila egyetemi
docensnek a segítséget, nem jöhetett volna létre nélküle ez a szakdolgozat. Ő mutatott rá az
optimalizálás lényegére és a szakdolgozati témát is ő ajánlotta számomra, emellett számos
szakirodalomra hívta fel a figyelmemet. Szeretném még megköszönni Lengyelné dr.
Szilágyi Szilvia tanárnőnek a folyamatos segítségét, ami előre segítette a Szakdolgozatom
megírását. Nem utolsó sorban szeretném megköszönni a családomnak, barátaimnak a
támogatást.