Programare cu numere întregi

O problemă de programare cu numere întregi este o problemă de optimizare matematică sau de satisfacție în care unele sau toate variabilele trebuie să fie numere întregi [1] . Adesea, termenul se referă la programarea liniară întregi (ILP), în care funcția obiectiv și constrângerile (cu excepția cerinței întregului) sunt liniare .

Programarea cu numere întregi este o problemă NP-hard . Un caz special, programarea liniară cu numere întregi 0-1, în care variabilele iau valorile 0 sau 1, este una dintre cele 21 de probleme NP-complete ale lui Karp .

Tipuri canonice și standard de CLP

Problema programării liniare întregi în forma canonică este exprimată ca [2]

maximiza
in conditii
și ,

și în formă standard

maximiza
in conditii
și

unde sunt vectori și este o matrice, toate elementele fiind numere întregi. Rețineți că, ca și în cazul programării liniare, o problemă ILP care nu este în formă standard poate fi redusă la forma standard prin eliminarea inegalităților prin introducerea de variabile suplimentare și artificiale și înlocuirea variabilelor care nu sunt supuse constrângerii de non-negativitate cu două variabile.

Exemplu

Figura din dreapta arată următoarea sarcină.

Punctele întregi valide sunt afișate cu roșu, iar liniile punctate roșii arată corpul convex al acestor puncte, care este cel mai mic poligon care conține toate aceste puncte. Liniile albastre, împreună cu axele de coordonate, definesc poligonul de atenuare liniară, care este dat de inegalități fără cerința întregului. Scopul optimizării este de a muta linia punctată neagră astfel încât să fie cât mai sus posibil, dar să atingă poligonul. Soluțiile optime ale problemei întregi sunt punctele și , la care funcția obiectiv ia valoarea 2. Singura soluție la problema slăbită (liniară) este punctul , unde funcția obiectiv ia valoarea 2.8. Rețineți că dacă rotunjim soluția unei probleme de programare liniară la cel mai apropiat număr întreg, soluția va fi invalidă pentru ILP.

Dovada durității NP

Următorul argument este o reducere a problemei de minimizare a acoperirii vârfurilor la o problemă de programare cu numere întregi, care demonstrează duritatea NP.

Fie un grafic nedirecționat. Definim o problemă de programare liniară după cum urmează:

Având în vedere cerința ca acestea să ia valorile 0 sau 1, orice soluție fezabilă pentru programarea întregilor este un subset de vârfuri. Prima constrângere implică faptul că cel puțin un capăt al fiecărei muchii este inclus în submulțime. Astfel, soluția oferă o acoperire de vârf. De asemenea, având în vedere un vârf de acoperire C, putem atribui o valoare de 1 pentru orice și 0 pentru orice , ceea ce ne oferă o soluție validă pentru problema de programare a întregilor. Din aceasta putem concluziona că la minimizarea sumei , obținem și acoperirea minimă a vârfurilor [3] .

Opțiuni

În programarea liniară cu numere întregi mixte (MILP), doar unele dintre variabile trebuie să fie întregi, în timp ce restul variabilelor pot fi non-întregi.

În programarea booleană, variabilele trebuie să ia valorile 0 sau 1. Rețineți că orice variabilă întreagă mărginită poate fi exprimată ca o combinație de variabile booleene [4] . De exemplu, dacă există o variabilă întreagă , aceasta poate fi exprimată în termeni de variabile booleene:

Aplicații

Există două motive principale pentru utilizarea variabilelor întregi la modelarea problemelor de programare liniară:

  1. Variabilele întregi reprezintă cantități care pot fi numai numere întregi. De exemplu, nu se poate construi 3,7 mașini.
  2. Variabilele întregi reprezintă decizii care iau valorile 0 sau 1.

Aceste convenții sunt comune în practică și, prin urmare, programarea liniară întregă poate fi utilizată în multe domenii, dintre care unele sunt discutate pe scurt mai jos.

Planificarea producției

Programarea cu numere întregi mixte are multe aplicații în producție, inclusiv simulări de planificare. Un exemplu apare în planificarea producției în agricultură pentru a determina producția de produse care pot avea resurse comune (cum ar fi pământ, forță de muncă, costuri, semințe, îngrășăminte etc.). Un posibil obiectiv de optimizare ar putea fi maximizarea veniturilor fără a depăși limitele resurselor disponibile. În unele cazuri, problema poate fi exprimată ca o problemă de programare liniară, dar variabilele trebuie să fie numere întregi.

Planificare

În aceste sarcini, este necesar să se asigure întreținerea și orarul rețelei de transport. De exemplu, sarcina poate fi aranjarea autobuzelor sau trenurilor de-a lungul rutelor pentru a respecta programul, precum și furnizarea de șoferi pentru materialul rulant. Aici, variabilele booleene (adică, luând valoarea 0 sau 1) determină dacă un autobuz sau un tren este alocat unei rute și dacă un șofer este alocat unui anumit autobuz/tren.

Rețele de date

Scopul acestei sarcini este de a construi o rețea de date astfel încât să ofere cerințe predefinite pentru costul minim [5] . Această sarcină necesită optimizarea atât a topologiei rețelei, cât și a lățimii de bandă a elementelor de rețea. În multe cazuri, debitul este exprimat în cantități discrete, rezultând variabile întregi. De obicei, se aplică alte constrângeri specifice tehnologiei, care pot fi modelate ca variabile întregi sau booleene.

Rețele celulare

Sarcina de planificare a frecvenței în rețelele mobile GSM necesită distribuirea frecvențelor admisibile între antene pentru a asigura comunicarea și a minimiza interferența între antene [6] . Această problemă poate fi formulată ca o problemă de programare liniară în care variabilele booleene reflectă dacă o anumită frecvență este atribuită unei anumite antene.

Algoritmi

Modul naiv de a rezolva problema ILP este pur și simplu ignorarea constrângerii întregi pe variabilele x , rezolvarea problemei LP corespunzătoare (care se numește relaxarea liniară a constrângerilor problemei ILP) și apoi rotunjirea componentelor soluției problemei rezultate. Cu toate acestea, soluția rezultată poate nu numai că nu este optimă, ci poate fi chiar inacceptabilă, adică unele restricții pot fi încălcate.

Folosind unimodularitatea completă

Deși, în cazul general, integralitatea soluției problemei slăbite nu este garantată, dacă ILP are forma în condițiile , unde și are numere întregi ca elemente și este complet unimodulară , atunci orice soluție de bază fezabilă va fi întreagă. Prin urmare, soluția dată de metoda simplex va fi cu siguranță număr întreg [7] . Pentru a arăta că orice soluție de bază a unei astfel de probleme este întreagă, să fie o soluție arbitrară admisibilă. Din moment ce este admisibil, știm că . Fie elementele corespunzătoare coloanelor de bază ale soluției de bază . Prin definiția unei baze, există o submatrice pătrată a unei matrice cu coloane liniar independente astfel încât .

Deoarece coloanele sunt liniar independente și matricea este pătrată, matricea este nesingulară și, prin urmare, în ipoteza că este unimodulară . Deoarece nu este singulară, matricea este inversabilă și, prin urmare, . Prin definiție, . Aici înseamnă matricea de unire pentru și este întreg pentru că este întreg. În acest fel,

întreg întreg Orice soluție de bază admisibilă este un număr întreg.

Astfel, dacă matricea ILP este complet unimodulară, în loc de a rezolva problema ILP, se poate folosi o relaxare liniară a problemei, care va da o soluție întreagă.

Algoritmi exacti

Dacă matricea nu este complet unimodulară, există o serie de algoritmi care rezolvă exact problema de programare liniară întregă. Una dintre clasele unor astfel de algoritmi este metodele planului de tăiere (metodele Gomori), care funcționează prin rezolvarea unei probleme liniare slăbite cu adăugarea ulterioară a constrângerilor liniare care elimină soluția non-întregică a problemei fără a tăia soluțiile fezabile întregi.

O altă clasă de algoritmi sunt variantele metodei ramificate și legate . De exemplu, metoda ramificării și tăierii , care combină metoda ramificației și legăturii cu metodele planului de tăiere. Metodele ramificate și legate au o serie de avantaje față de algoritmii care folosesc doar planuri de tăiere. Unul dintre avantaje este că algoritmul poate fi terminat mai devreme, de îndată ce se găsește cel puțin o soluție întregă validă, deși nu optimă. În plus, rezolvarea unei probleme liniare relaxate poate fi folosită pentru a estima cât de departe este de cea optimă. În cele din urmă, metodele ramificate și legate pot fi utilizate pentru a obține mai multe soluții optime.

Lenstra în 1983 a arătat [8] că, în cazul unui număr fix de variabile, o soluție fezabilă pentru o problemă de programare cu numere întregi poate fi găsită în timp polinomial.

Metode euristice

Deoarece problemele de programare liniară întregi sunt NP-hard , multe probleme sunt dificil de rezolvat, așa că sunt aplicate metode euristice. De exemplu, o căutare tabu [9] poate fi folosită . Pentru a utiliza căutarea tabu pentru a rezolva problema ILP, un pas de algoritm poate fi definit ca creșterea sau decrementarea unei variabile întregi, lăsând celelalte variabile întregi neschimbate. Apoi se găsește o soluție pentru variabilele cărora nu este impusă constrângerea întregului. Memoria pe termen scurt poate fi folosită pentru a stoca încercările anterioare, în timp ce memoria pe termen lung poate consta din valori ale variabilelor întregi pentru care se obțin valori mai mari ale funcției obiective (presupunând o problemă de maximizare). În cele din urmă, memoria pe termen lung poate fi folosită pentru a căuta valori întregi care nu au fost încă testate.

Alte euristici care pot fi aplicate pentru a rezolva ILP

Există, de asemenea, alte euristici specifice sarcinii, cum ar fi euristica k-opt pentru problema vânzătorului ambulant. Rețineți că dezavantajul metodelor euristice este că, în caz de eșec în găsirea unei soluții, metoda nu determină dacă acest lucru s-a întâmplat din cauza lipsei unei soluții valide sau pentru că algoritmul nu a reușit să o găsească. În plus, de obicei este imposibil să se determine cât de aproape de soluția optimă obținută prin această metodă.

Note

  1. Karmanov, 1986 , p. 11-12.
  2. Papadimitriou, Steiglitz, 1998 .
  3. Erickson .
  4. Williams, HP Logic și programare cu numere întregi  (nedefinită) . - 2009. - V. 130. - (Seria Internațională în Cercetare Operațională și Știința Managementului). - ISBN 978-0-387-92280-5 .
  5. Borndörfer, R.; Grötschel, M. Proiectarea rețelelor de telecomunicații prin programare cu numere întregi (2012).
  6. ^ Sharma, Deepak Frequency Planning (2010).
  7. Deci, de exemplu, problema transportului poate fi considerată ca o problemă de programare liniară, iar metoda potențialelor pentru rezolvarea acestei probleme este, de fapt, o metodă simplex. Soluția de bază a metodei simplex corespunde arborelui din metoda potențialului, iar matricea corespunzătoare are întotdeauna un determinant de 1. Astfel, cu date inițiale întregi, soluția problemei de transport prin metoda simplex (sau metoda potențialului, care este echivalent) va obține întotdeauna o soluție întreagă.
  8. Lenstra, 1983 .
  9. Glover, 1989 , p. 4–32.

Literatură

Lectură pentru lecturi suplimentare

Link -uri