În informatică și cercetarea operațională, multe probleme de optimizare combinatorie sunt insolubile din punct de vedere computațional pentru a rezolva problema exact (adică pentru a obține soluția optimă). Multe astfel de probleme permit algoritmi de aproximare rapidă ( în timp polinomial ) - adică algoritmi care sunt garantat să returneze o soluție aproape optimă pentru orice intrare.
Rotunjirea probabilistică [1] este o abordare larg utilizată pentru dezvoltarea și analiza unor astfel de algoritmi de aproximare [2] [3] . Ideea de bază este utilizarea unei metode probabilistice pentru a transforma soluția optimă corespunzătoare a unei probleme de programare liniară (LP) într-o aproximare a soluției optime a problemei inițiale.
Abordarea de bază are trei pași:
(Deși abordarea utilizează în principal programarea liniară, pot fi utilizate și alte tipuri de relaxare a condițiilor. De exemplu, algoritmul lui Goeman și Williamson utilizează algoritmul de tăiere maximă aproximativă de programare semidefinită .)
Scopul primului pas este de a alege o declarație adecvată a problemei de programare liniară întregi. Acest lucru necesită o bună cunoaștere a programării liniare și, în special, o înțelegere a modului de modelare a problemelor folosind programarea liniară și programarea liniară întregi. Cu toate acestea, pentru multe probleme există o problemă de programare liniară cu numere întregi naturale cu performanțe bune, așa cum se arată în exemplul problemei care acoperă setul. (O problemă de programare liniară cu numere întregi ar trebui să aibă un decalaj mic între întregi. În plus, rotunjirea probabilistică este adesea folosită pentru a demonstra decalajele întregi.)
În a doua etapă, soluția optimă fracțională, de obicei, poate fi calculată în timp polinomial folosind un algoritm de programare liniară standard .
La a treia etapă, soluția fracțională trebuie transformată într-o soluție întreagă (și astfel în soluția problemei inițiale). Acest proces se numește rotunjire fracționată a soluției . Soluția finală întreagă trebuie (în mod dovedibil) să aibă un preț care nu diferă mult de prețul soluției fracționale. Acest lucru asigură că costul unei soluții întregi nu este cu mult mai mare decât costul unei soluții întregi optime.
Tehnica principală folosită în a treia etapă (rotunjire) este utilizarea unei abordări probabilistice și apoi utilizarea raționamentului probabilistic pentru a limita creșterea prețului care vine odată cu rotunjirea. Aici argumentele probabilistice sunt folosite pentru a arăta existența unei structuri discrete cu proprietăți dorite. În acest context, argumentele probabilistice sunt folosite pentru a arăta următoarele:
Având în vedere o soluție fracțională a problemei LP, rotunjirea probabilistică cu probabilitate pozitivă dă o soluție întreagă care se aproximează conform unui criteriu dorit.În cele din urmă, pentru a face al treilea pas eficient din punct de vedere computațional, fie se arată a fi aproape de cu probabilitate mare (astfel încât pasul să rămână probabilist), fie pasul de rotunjire este derandomizat , de obicei prin probabilități condiționate . Această din urmă metodă transformă procesul de rotunjire probabilistică într-un proces determinist eficient care este garantat să ofere un rezultat bun.
Etapa de rotunjire probabilistică diferă de majoritatea aplicațiilor metodei probabilistice în două privințe:
Metoda este cel mai bine ilustrată cu un exemplu. Următorul exemplu arată modul în care rotunjirea aleatoare poate fi utilizată pentru a crea un algoritm de aproximare pentru problema setului de acoperire .
Luați orice exemplu al problemei de acoperire a setului cu colecția .
Pentru pasul 1, să fie problema întregului LP să fie problema standard de programare liniară întregă pentru a acoperi mulțimea .
Pentru pasul 2, să fie problema LP slăbirea problemei ILP la problema LP și să fie soluția optimă pentru această problemă slăbită obținută de orice algoritm de programare liniară standard . (Timpul necesar pentru rezolvarea problemei LP depinde polinom de mărimea intrării.)
(Soluțiile valide ale problemei LP sunt vectori care atribuie fiecărei mulțimi o greutate nenegativă , astfel încât, pentru orice element , acoperă - greutatea totală atribuită mulțimilor care conțin , este cel puțin 1, adică
O soluție optimă este o soluție fezabilă al cărei cost este
cât mai mic posibil.)
Rețineți că orice capac al setului pentru oferă o soluție fezabilă (unde pentru , în caz contrar). Prețul acestei acoperiri este egal cu prețul , adică
Cu alte cuvinte, problema de programare liniară este o relaxare a problemei de acoperire a mulțimii date.
Deoarece are prețul minim dintre soluțiile fezabile ale problemei LP, prețul este limita inferioară pentru costul acoperirii optime a setului .
Mai jos este o descriere a descrierii celui de-al treilea pas, pasul de rotunjire, care trebuie să transforme acoperirea parțială a prețului minim stabilit într-o soluție întregă validă (corespunzând acoperirii setate corecte).
Pasul de rotunjire va da o soluție , care, cu probabilitate pozitivă, are un preț care diferă de preț printr-un factor mic. Apoi (deoarece prețul este limita inferioară a prețului acoperirii setului optim), prețul va diferi de prețul optim printr-un factor mic.
Ca punct de plecare, luați în considerare cea mai naturală schemă de rotunjire:
Pentru fiecare set pe rând, luăm cu probabilitate , altfel luăm .Conform acestei scheme de rotunjire, așteptarea matematică a prețului setului selectat nu depășește , prețul acoperirii parțiale. Acest lucru este bun, dar, din păcate, acoperirea nu este bună. Dacă variabilele sunt mici, probabilitatea ca elementul să nu fie acoperit este aproximativă
Astfel, așteptarea matematică a proporției elementelor acoperite va fi constantă.
Pentru a face foarte probabil să acopere toate elementele, schema standard de rotunjire crește mai întâi probabilitățile de rotunjire cu un factor adecvat . Schema standard de rotunjire:
Fixăm parametrul . Pentru fiecare set , luăm cu probabilitate , altfel luăm .Înmulțirea probabilităților cu crește valoarea așteptată a prețului cu , dar face ca acoperirea tuturor elementelor să fie mai probabilă. Ideea aici este să alegeți cât mai mic posibil, astfel încât toate elementele să fie acoperite cu probabilitate diferită de zero. Mai jos este o analiză detaliată.
Lema (eficiența garantată a schemei de rotunjire) Reparăm . Cu o probabilitate pozitivă, schema de rotunjire va returna o acoperire cu un cost care nu depășește (și acest cost diferă printr-un factor al costului acoperirii setate optime).(Rețineți că, cu puțină atenție, valoarea poate fi redusă la .)
DovadaIeșirea schemei de rotunjire aleatorie are proprietățile dorite până când apar următoarele evenimente „rele”:
Așteptările matematice ale fiecăruia nu depășesc . Datorită liniarității așteptării matematice , așteptarea nu depășește . Apoi, conform inegalității Markov , probabilitatea primului eveniment rău nu depășește .
Pentru evenimentele proaste rămase (câte unul pentru fiecare element al lui ), rețineți că deoarece , pentru orice element dat al lui , probabilitatea care nu este acoperită este
(Aici folosim inegalitatea , care este strict adevărată pentru .)
Astfel, pentru orice număr de elemente, probabilitatea ca elementul să nu fie acoperit este mai mică decât .
Probabilitatea ca unul dintre evenimentele rele să se întâmple este mai mică . Apoi, probabilitatea absenței evenimentelor rele este mai mare decât zero și este o acoperire a setului cu un cost care nu depășește .
QED (care urma să fie dovedit)
Lema de mai sus arată existența unei acoperiri a unei mulțimi cu cost ). În acest context, scopul nostru este un algoritm de aproximare eficient, nu doar o dovadă a existenței, așa că nu am terminat de analizat pasul 3.
Ca o abordare, ar putea crește puțin și apoi arăta că probabilitatea de succes este de cel puțin, să zicem, 1/4. Folosind această modificare, repetând pasul de rotunjire aleatorie de mai multe ori, se poate asigura succesul cu o mare probabilitate.
Această abordare slăbește eficiența garantată, dar vom descrie o altă abordare care dă un algoritm determinist care oferă eficiența garantată indicată mai sus. Abordarea se numește metoda probabilităților condiționate .
Algoritmul determinist emulează o schemă de rotunjire probabilistică — fiecare mulțime este luată în considerare și , totuși, în loc să aleagă aleatoriu pe baza , algoritmul face o alegere deterministă , astfel încât probabilitatea condiționată de eșec determinată de alegere să rămână mai mică de 1 .
Constrângere asupra probabilității condiționate de eșecDorim să putem seta valoarea fiecărei variabile pentru a menține probabilitatea de eșec condiționată mai mică de 1. Pentru a realiza acest lucru, avem nevoie de o limită bună a probabilității de eșec condiționată. Granița se obține prin revizuirea dovezii originale a existenței. Această dovadă limitează implicit probabilitatea de eșec la valoarea așteptată a variabilei aleatoare
,Unde
este ansamblul elementelor rămase neacoperite.
Variabila aleatoare poate părea oarecum misterioasă, dar reflectă abordarea sistematică a demonstrației probabilistice. Primul termen din formula pentru este obținut prin aplicarea inegalităților lui Markov la limita de probabilitate pentru primul eveniment rău (costul este prea mare). Acest membru contribuie cu cel puțin 1 dacă prețul este prea mare. Al doilea termen numără numărul de evenimente rele de al doilea fel (elemente neacoperite). Contribuie cu cel puțin 1 la dacă lasă orice element neacoperit. Astfel, în orice ieșire care este mai mică de 1, soluția trebuie să acopere toate elementele și să aibă un preț compatibil cu limita dorită din lemă. Pe scurt, dacă pasul de rotunjire eșuează, . Aceasta implică (conform inegalității lui Markov ) care este o limită superioară a probabilității de eșec. Rețineți că argumentele de mai sus sunt deja implicit prezente în demonstrația lemei, ceea ce arată și că .
Pentru a aplica metoda probabilității condiționate, trebuie să extindem raționamentul pentru limitarea probabilității condiționate de eșec în timpul etapei de rotunjire. Acest lucru se poate face de obicei în mod sistematic, deși din punct de vedere tehnic poate consuma mult timp.
Deci, care este probabilitatea condiționată de eșec atunci când pasul de rotunjire trece prin mulțimi? Deoarece în orice rezultat înseamnă că pasul de rotunjire a condus la eșec, conform inegalității lui Markov , probabilitatea condiționată de eșec nu depășește așteptarea condiționată .
Apoi calculăm media condiționată , așa cum am calculat media în demonstrația inițială. Luați în considerare starea procesului de rotunjire la sfârșitul fiecărei iterații . Să notăm seturile scanate (primele seturi în ). Să notăm un vector (alocat parțial) ( definit astfel doar dacă ). Pentru o astfel de mulțime , denotăm probabilitatea cu care va fi atribuită la 1. Fie conține elemente neacoperite. Apoi așteptarea condiționată dată de alegere, adică dată de decizie , atunci
Rețineți că este definit numai după iterația lui .
Menținerea probabilității condiționate de eșec mai mică de 1Pentru a menține probabilitatea condiționată de eșec mai mică de 1, este suficient să păstrați media condiționată mai mică de 1. Pentru a face acest lucru, este suficient să evitați creșterea mediei condiționate și asta va face algoritmul. Algoritmul se va seta la fiecare iterație astfel încât
(unde ).
La o iterație , cum se poate seta algoritmul la ? Se pare că îl puteți seta doar să imite valoarea lui .
Pentru a înțelege de ce, luați în considerare momentul în care începe iterația. În acest moment, valoarea este definită, dar valoarea este nedefinită - poate lua două valori posibile, în funcție de modul în care este setată în iterație . Lasa înseamnă valoare . Fie și notăm două valori posibile ale lui , în funcție de faptul că este setată la 0 sau la 1. Prin definiția așteptării condiționate,
Deoarece media ponderată a două cantități este întotdeauna mai mare sau egală cu cea mai mică dintre ele, rezultă că
Astfel, setarea astfel încât să minimizeze valoarea rezultată a , asigură că . Aceasta este ceea ce va face algoritmul.
În detaliu, ce înseamnă asta? Considerată ca o funcție a (cu toate celelalte valori fixe), această funcție este liniară în , iar coeficientul at în această funcție este
Astfel, algoritmul ar trebui setat la 0 dacă această expresie este pozitivă și la 1 în caz contrar. Toate acestea dau următorul algoritm.
intrare: set de mulțimi , populație , vector preț
ieșire: acoperire set (soluția unei probleme de programare liniară cu numere întregi standard pentru a acoperi un set)
Algoritmul asigură că așteptarea condiționată nu crește la fiecare iterație. Deoarece această așteptare condiționată a fost inițial mai mică de 1 (așa cum se arată mai sus), algoritmul asigură că așteptarea condiționată rămâne mai mică de 1. Deoarece probabilitatea condiționată de eșec nu depășește așteptarea condiționată , algoritmul asigură că probabilitatea condiționată de eșec rămâne mai mic decât 1. Astfel, la sfârșitul algoritmului, când toate elementele sunt definite, algoritmul obține un rezultat de succes. Adică, algoritmul de mai sus returnează o acoperire setată cu un preț care nu depășește cu un factor prețul minim al oricărei acoperiri setate (fracționale).
În exemplul de mai sus, algoritmul s-a bazat pe așteptarea condiționată a unei variabile aleatoare . În unele cazuri, în locul așteptării condiționale exacte, este utilizată limita superioară (și uneori limita inferioară) a așteptării condiționate a unei anumite valori. Aceasta se numește estimare pesimistă .