Simpleksimenetelmä on algoritmi lineaarisen ohjelmoinnin optimointitehtävän ratkaisemiseksi laskemalla kuperan monitahoisen pisteet moniulotteisessa avaruudessa.
Menetelmän ydin: perusratkaisujen rakentaminen, joissa lineaarinen funktionaalisuus pienenee monotonisesti, kunnes tilanne, jossa paikallisen optimiteetin välttämättömät ehdot täyttyvät.
L. V. Kantorovichin teoksessa "Tuotannon organisoinnin ja suunnittelun matemaattiset menetelmät" (1939) esitettiin ensimmäisen kerran uuden matematiikan haaran periaatteet, joka myöhemmin tunnettiin nimellä lineaarinen ohjelmointi. [yksi]
Historiallisesti yleisen lineaarisen ohjelmoinnin ongelman esittivät ensimmäisen kerran vuonna 1947 George Bernard Dantzig , Marshall Wood ja heidän työtoverinsa Yhdysvaltain ilmavoimien osastolla. Tuolloin tämä ryhmä tutki mahdollisuutta käyttää matemaattisia ja niihin liittyviä menetelmiä sotilaallisiin ja suunnitteluongelmiin. Myöhemmin ilmavoimiin perustettiin Project SCOOP -tutkimusryhmä kehittämään näitä ideoita. Ensimmäinen onnistunut ratkaisu lineaarisen ohjelmoinnin ongelmaan SEAC-tietokoneella tehtiin tammikuussa 1952 [2] .
Lineaarisen ohjelmoinnin ongelmana on, että on tarpeen maksimoida tai minimoida jokin lineaarinen funktio moniulotteisessa avaruudessa tietyillä lineaarisilla rajoituksilla.
Huomaa, että jokainen muuttujien lineaarinen epäyhtälö rajoittaa puoliavaruutta vastaavassa lineaarisessa avaruudessa. Tämän seurauksena kaikki epäyhtälöt rajoittavat jotakin kuperaa monitahoista (mahdollisesti ääretöntä), jota kutsutaan myös monitahoiseksi kompleksiksi . Yhtälö W ( x ) = c , jossa W ( x ) on maksimoitu (tai minimoitu) lineaarinen funktio, generoi hypertason L(c) . Riippuvuus c : stä luo rinnakkaisten hypertasojen perheen. Sitten äärimmäinen ongelma saa seuraavan formulaation: vaaditaan suurin c niin, että hypertaso L(c) leikkaa monitahoisen ainakin yhdessä pisteessä. Huomaa, että optimaalisen hypertason ja monitahoisen leikkauspisteessä on vähintään yksi kärki, ja niitä on enemmän kuin yksi, jos leikkauskohta sisältää reunan tai k - ulotteisen pinnan. Siksi funktionaalin maksimi voidaan etsiä monitahoisen kärjestä. Simpleksimenetelmän periaate on, että valitaan yksi monitahoisen kärjestä, jonka jälkeen liike sen reunoja pitkin kärjestä kärkeen alkaa funktionaalin arvon kasvun suuntaan. Kun siirtyminen reunaa pitkin nykyisestä kärjestä toiseen kärkeen, jolla on korkeampi funktion arvo, katsotaan, että c :n optimaalinen arvo on löydetty.
Simplex-menetelmällä suoritettavat laskelmat voidaan jakaa kahteen päävaiheeseen :
Lisäksi joissain tapauksissa alkuperäinen ratkaisu on ilmeinen tai sen määrittely ei vaadi monimutkaisia laskelmia, esimerkiksi kun kaikki rajoitukset esitetään epäyhtälöillä, jotka ovat muotoa "pienempi tai yhtä suuri" (niin nollavektori on ehdottomasti käyttökelpoinen ratkaisu , vaikka todennäköisimmin se on kaukana optimaalisimmasta). Tällaisissa ongelmissa simplex-menetelmän ensimmäinen vaihe voidaan jättää kokonaan pois. Yksivaiheinen menetelmä on jaettu yksivaiheiseen ja kaksivaiheiseen .
Harkitse seuraavaa lineaarista ohjelmointiongelmaa :
Esitetään nyt tämä ongelma vastaavassa parannetussa muodossa. On tarpeen maksimoida Z , jossa:
Tässä x ovat muuttujia alkuperäisestä lineaarifunktiosta, x s ovat uusia muuttujia, jotka täydentävät vanhoja siten, että epäyhtälö muuttuu tasa-arvoksi, c ovat alkuperäisen lineaarifunktion kertoimet, Z on maksimoitava muuttuja. Puoliavaruudet ja leikkauspiste muodostavat monitahoisen, joka edustaa mahdollisia ratkaisuja. Muuttujien lukumäärän ja yhtälöiden välinen ero antaa meille vapausasteiden lukumäärän. Yksinkertaisesti sanottuna, jos otamme huomioon monitahoisen kärjen, tämä on niiden reunojen lukumäärä, joita pitkin voimme jatkaa liikkumista. Sitten voimme antaa tälle muuttujien lukumäärälle arvon 0 ja kutsua niitä "ei-perus" . Tässä tapauksessa loput muuttujat lasketaan yksiselitteisesti ja niitä kutsutaan "perus" . Samaa näiden muuttujien joukkoa kutsutaan kantaksi . Tuloksena oleva piste on ei-perusmuuttujia vastaavien hypertasojen leikkauspiste. Löytääkseen ns. Alkuperäisen hyväksyttävän ratkaisun (kärkipisteen, josta lähdemme liikkumaan), annamme arvon 0 kaikille alkumuuttujille x ja pidämme niitä ei-perusmuuttujina ja kaikkia uusia pidetään perusmuuttujina. Tässä tapauksessa alkuperäinen hyväksyttävä ratkaisu lasketaan yksiselitteisesti: .
Nyt esittelemme algoritmin vaiheet. Jokaisessa vaiheessa muutamme perus- ja ei-perusvektoreiden joukot (siirrämme reunoja pitkin), ja matriisi näyttää tältä:
missä ovat perusmuuttujia vastaavan vektorin kertoimet (muuttujat vastaavat 0), ovat perusmuuttujia vastaavat sarakkeet . Muiden sarakkeiden muodostama matriisi on merkitty . Miksi matriisilla on tämä muoto, selitetään algoritmin vaiheiden kuvauksessa.
Ensimmäinen askel .
Valitsemme alkuperäisen kelvollisen arvon, kuten yllä on osoitettu. Ensimmäisessä vaiheessa identiteettimatriisi, koska perusmuuttujat ovat . on nollavektori samoista syistä.
Toinen vaihe
Osoitetaan, että lausekkeessa vain ei-perusmuuttujilla on nollasta poikkeava kerroin. Huomaa, että lausekkeesta perusmuuttujat ilmaistaan yksiselitteisesti ei-perusmuuttujilla, koska perusmuuttujien lukumäärä on yhtä suuri kuin yhtälöiden lukumäärä. Olkoon perus- ja ei-perusmuuttujia tietyssä iteraatiossa. Yhtälö voidaan kirjoittaa uudelleen muotoon . Kerrotaan se vasemmalla olevalla: . Esitimme siis perusmuuttujat ei-perusmuuttujina, ja yhtälön vasenta puolta vastaavassa lausekkeessa kaikilla perusmuuttujilla on yksikkökertoimet. Jos siis lisätään yhtäläisyys yhtäläisyyteen , niin tuloksena olevassa yhtäläisyydessä kaikilla perusmuuttujilla on nollakerroin - kaikki x -muodon perusmuuttujat pienennetään, eikä muotoa x s olevia perusmuuttujia sisällytetä lausekkeeseen .
Valitaan reuna, jota pitkin liikumme. Koska haluamme maksimoida Z , on tarpeen valita muuttuja, joka vähentää lauseketta eniten
.
Tätä varten valitsemme muuttujan, jolla on suurin negatiivinen kerroin moduulissa [3] . Jos tällaisia muuttujia ei ole, eli kaikki tämän lausekkeen kertoimet ovat ei-negatiivisia, olemme päässeet haluttuun kärkeen ja löytäneet optimaalisen ratkaisun. Muuten alamme kasvattaa tätä ei-perusmuuttujaa, eli liikkua sitä vastaavaa reunaa pitkin. Kutsutaan tätä muuttujaa syötteeksi .
Kolmas vaihe
Nyt meidän on ymmärrettävä, mikä perusmuuttuja menee ensin nollaan, kun syöttömuuttuja kasvaa. Tätä varten riittää, että harkitset järjestelmää:
Ei-perusmuuttujien kiinteille arvoille järjestelmä on yksiselitteisesti ratkaistavissa perusmuuttujien suhteen, joten voimme määrittää, mikä perusmuuttujista saavuttaa ensimmäisenä nollan syötteen kasvaessa. Kutsutaan tätä muuttujaa ulostuloksi . Tämä tarkoittaa, että olemme saavuttaneet uuden huipun. Vaihdetaan nyt saapuvat ja lähtevät muuttujat - saapuva "syöttää" perusmuuttujaan ja lähtevä "lähtee" ei-perusmuuttujat. Nyt kirjoitetaan matriisi B ja vektori c B uusien perus- ja ei-perusmuuttujien joukkojen mukaisesti, minkä jälkeen palataan toiseen vaiheeseen. x''
Koska pisteiden määrä on äärellinen, algoritmi jonain päivänä päättyy. Löytynyt kärkipiste on optimaalinen ratkaisu.
Jos lineaarisen ohjelmointitehtävän tilanteessa kaikkia rajoituksia ei edusta "≤"-tyyppiset epäyhtälöt, niin nollavektori ei aina ole kelvollinen ratkaisu. Yksipuolisen menetelmän jokainen iteraatio on kuitenkin siirtymä pisteestä toiseen, ja jos kärkeä ei tunneta, algoritmia ei voida käynnistää ollenkaan.
Alkupisteen löytämisprosessi ei eroa paljoa yksivaiheisesta simpleksimenetelmästä, mutta se voi olla vaikeampaa kuin jatkooptimointi.
Kaikkia tehtävärajoituksia muokataan seuraavien sääntöjen mukaisesti:
Tämän mukaisesti luodaan joukko lisä- ja apumuutujia. Aluksi valitaan lisämuuttujat kertoimella "+1" ja kaikki apumuuttujat. Varoitus: Ratkaisu, jota tämä peruste vastaa, ei ole hyväksyttävä.
Erot lisä- ja lisämuuttujien välilläHuolimatta siitä, että sekä lisä- että apumuuttujat luodaan keinotekoisesti ja niitä käytetään alkuperäisen perustan luomiseen, niiden arvot ratkaisussa ovat hyvin erilaisia:
Toisin sanoen lisämuuttujan nollasta poikkeava arvo voi (mutta ei saa) osoittaa, että ratkaisu ei ole optimaalinen . Apumuuttujan nollasta poikkeava arvo osoittaa, että ratkaisu on virheellinen .
Kun ehtoa on muutettu, luodaan aputavoitteen funktio . Jos apumuuttujat nimettiin , niin määritämme apufunktioksi
Tämän jälkeen suoritetaan tavallinen simpleksimenetelmä aputavoitteen funktion suhteen. Koska kaikki apumuuttujat lisäävät arvoa , ne johdetaan algoritmin aikana yksitellen perusteesta ja jokaisen siirtymän jälkeen uusi ratkaisu on lähempänä toteutettavissa olevien ratkaisujen joukkoa.
Kun aputavoitteen funktion optimaalinen arvo löytyy, voi syntyä kaksi tilannetta:
Toisessa tapauksessa meillä on hyväksyttävä peruste tai toisin sanoen ensimmäinen hyväksyttävä ratkaisu. On mahdollista suorittaa lisäoptimointi ottamalla huomioon alkuperäinen tavoitefunktio, huomioimatta apumuuttujia. Tämä on ratkaisun toinen vaihe.
Modifioidussa menetelmässä matriisi
ei lasketa uudelleen, vain matriisi tallennetaan ja lasketaan uudelleen . Loppuosa algoritmista on samanlainen kuin yllä kuvattu.
1. Laske kaksoismuuttujat
2. Optimiteetin tarkistaminen. muunnetaan muotoon .
Tarkistuksessa lasketaan kaikki sarakkeet . Perusteelle voidaan syöttää sarake, jonka arvo on < 0.
Valitse usein vähimmäisarvo, mutta tätä varten sinun on iteroitava kaikki sarakkeet.
Valitse useammin arvo, joka on pienempi kuin jokin annettu arvo
Jos tällaista saraketta ei löydy, suurimmaksi löydetty absoluuttinen arvo otetaan löydetyksi ja vastaava sarake syötetään perusteeseen.
3. Tuotoksen määritelmä.
Olkoon muuttujaa vastaava syöttösarake.Perussuunnitelma on ratkaisu järjestelmään Increase .
Kerro vasemmalla puolella , eli .
Tässä on perussuunnitelma, on laajennus tulosarakkeen kannalta perusteella.
Etsi suurin arvo , jonka kaikki arvot eivät ole negatiivisia. Jos voidaan ottaa mielivaltaisen suuri, ratkaisu on rajaton. Muuten yksi elementeistä menee nollaan. Päättelemme vastaavan sarakkeen perusteesta.
4. Viite- (perus)suunnitelman uudelleenlaskenta.
Laskemme uuden vertailusuunnitelman käyttämällä jo annettua kaavaa löydetyllä arvolla .
5. Laskemme käänteisen uudelleen kantaan .
Antaa olla tulossarake.
Matriisi B voidaan esittää muodossa
missä on perusmatriisi ilman tulossaraketta.
Sarakkeen vaihtamisen jälkeen perusmatriisi näyttää tältä
Meidän on löydettävä sellainen matriisi
=> => =>
Missä
Kommentti.
Matriisin uudelleenlaskenta kerää pyöristysvirheitä. Suurten virheiden välttämiseksi matriisi lasketaan kokonaan uudelleen ajoittain. Tätä prosessia kutsutaan "toistoksi".
Kertovassa versiossa matriisia ei tallenneta, vain tekijät tallennetaan
Taloudellisia ongelmia ratkaistaessa rajoitematriisi on usein harva , jolloin kertova vaihtoehto saa lisäetuja - voit tallentaa kertoimia pakatussa muodossa (älä tallenna nollia).
Matriisin LU - hajotusta voidaan käyttää pyöristysvirheiden kertymisen välttämiseksi .
"Epäyhtälö"-tyyppisten rajoitusten ylivoimaisella määrällä voidaan käyttää muuttujapohjaista menetelmää . [neljä]
Menetelmä perustuu siihen, että kantamatriisi voidaan esittää muodossa
Sen käänteisversiolla on muoto
Suhteellisen pienillä matriisikooilla matriisin loppuosaa ei ehkä tallenneta.
Tämä lähestymistapa voi ratkaista ongelmia kymmenillä miljoonilla rajoituksilla (esimerkiksi peliteorian perusteella).
Kaksoismenetelmän toteuttamiseksi on välttämätöntä siirtyä ongelmasta minimiin ongelmaan maksimiin (tai päinvastoin) transponoimalla kertoimien matriisi. Kun siirrytään tehtävästä minimiin, tavoitefunktio on muodossa:
rajoitusten alla
.
Kaksinaisuuslause . Jos toisella kaksoistehtäväparista on optimaalinen suunnitelma, niin toisella on ratkaisu, ja näiden tehtävien lineaarifunktioiden ääriarvot ovat yhtä suuret.
Jos yhden ongelman lineaarista funktiota ei ole rajoitettu, toisella ei ole ratkaisua.
Simpleksimenetelmä on yllättävän tehokas käytännössä, mutta vuonna 1972 Klee ja Minty [5] antoivat esimerkin, jossa simpleksimenetelmä iteroitui kaikki simplexin kärjet, mikä osoittaa menetelmän eksponentiaalisen konvergenssin pahimmassa tapauksessa. Sen jälkeen jokaiselle menetelmän muunnokselle on löydetty esimerkki, jossa menetelmä on toiminut poikkeuksellisen huonosti.
Havainnot ja analyysi menetelmän tehokkuudesta käytännön sovelluksissa johtivat muiden tapojen kehittämiseen tehokkuuden mittaamiseksi.
Simplex-menetelmällä on keskimääräinen polynomikonvergenssi , jossa on laaja valikoima arvojakaumia satunnaismatriiseissa. [6] [7]
Laskennallinen tehokkuus arvioidaan yleensä kahdella parametrilla:
Numeeristen kokeiden tuloksena saatiin seuraavat tulokset.
Rajoitusten määrä vaikuttaa laskennan tehokkuuteen enemmän kuin muuttujien lukumäärä, joten lineaarisia ohjelmointiongelmia muotoiltaessa tulee pyrkiä vähentämään rajoitusten määrää, vaikka muuttujien määrää lisäämällä.
Yksi aikaa vievistä toimenpiteistä simplex-menetelmässä on kantaan lisätyn sarakkeen etsiminen. Paremman konvergenssin saavuttamiseksi näyttää siltä, että sinun on valittava muuttuja, jolla on paras jäännös, mutta tämä vaatii täyden skannauksen, eli sinun on kerrottava kaksoismuuttujien sarake (jota joskus kutsutaan varjohinnoiksi) matriisin kaikilla sarakkeilla. [8] . Tämä lähestymistapa toimii hyvin pienissä ongelmissa, jotka ratkaistaan manuaalisesti. Lisäksi moduulin maksimijäännösarvon valintasäännön tiukka noudattaminen voi osoittautua optimaalista ääripään saamiseksi vaadittavien iteraatioiden kokonaismäärän kannalta. Maksimivahvistus yhdellä iteraatiolla voi johtaa tavoitefunktion arvon hitaaseen laskuun seuraavissa vaiheissa ja siten hidastaa ongelman ratkaisuprosessia [9] .
Suurilla rajoitematriiseilla syötemuuttujan etsiminen alkaa viedä paljon aikaa, ja usein yritetään välttää matriisin kaikkien sarakkeiden katsomista, jolloin voidaan käyttää seuraavia menetelmiä:
Este . Heti kun muuttujan poikkeama poikkeaa riittävästi nollasta (ylittää tietyn arvon, jota kutsutaan esteeksi), muuttuja lisätään kantaan. Jos kaikki jäännökset osoittautuivat estettä pienemmiksi, syötteeksi valitaan muuttuja, jolla on pienin jäännös, kun taas itse este pienennetään jonkin säännön mukaan (esimerkiksi puolet pienimmästä jäännöksestä). Estettä käytetään usein seuraavan tekniikan kanssa. Samanlainen lähestymistapa on kuvattu Murtaughin kirjassa, katso kohta 3.6.2. Kirjan osittainen arviointi [10] . Pyöräilynäkymä . Syötemuuttujan haku alkaa edellisessä iteraatiossa esiteltyä muuttujaa seuraavasta paikasta. Ryhmävalinta (Murtaughin kirjassa tätä tekniikkaa kutsutaan moninkertaiseksi arvioimiseksi . Katso kohta 3.6.3. Moniarviointi [11] .) Syöttömuuttujaa haettaessa ei valita yhtä muuttujaa, vaan useita ehdokkaita. Seuraavissa iteraatioissa katselu suoritetaan vain valittujen ehdokkaiden kesken, kun taas ehdokas voidaan poistaa listalta. Vaakojen tarkoitus . Muuttujille on annettu painoarvot. Katso kohta 3.6.4 Murtafan DEVEX- pisteytysmenetelmä [12] . Etsi Goldfarbin ja Reedin jyrkimpiä kylkiluita. Katso kohta 3.6.5 Jyrkimmän reunan estimointimenetelmä Murtaughin kirjassa [13] .Myös muut temput ovat mahdollisia, kuten Zadeh-sääntö .
![]() | |
---|---|
Bibliografisissa luetteloissa |
Optimointimenetelmät _ | |
---|---|
Yksiulotteinen |
|
Nolla järjestys | |
Ensimmäinen tilaus | |
toinen tilaus | |
Stokastinen | |
Lineaariset ohjelmointimenetelmät _ | |
Epälineaariset ohjelmointimenetelmät |