A félév túlnyomó részében egymáshoz fogunk problémákat viszonyítani, és szeretnénk olyat mondani, hogy pl az A probléma "könnyebb", mint a B probléma (vagy legalábbis, "legfeljebb olyan nehéz" - ez megint a < vs. ≤ különbségre emlékeztet. Maradunk a "legfeljebb olyan nehéz"-nél, mert sokszor a problémák "egyforma" nehezek lesznek majd.).
Adja magát, hogy pl. akkor mondanánk az A-t könnyebbnek, mint a B-t, ha az optimális algoritmus A-ra gyorsabb, mint B-re. Ezzel csak egy a baj: néhány triviális esettől eltekintve nem szoktuk azt tudni, hogy ami algoritmusunk nekünk van, az tényleg az optimális-e vagy sem. Emiatt ez nem egy járható út.
Ami a másik szóbajövő lehetőség: ha B-t meg tudnánk oldani, akkor az őt megoldó algoritmus segítségével az A-t is. Ezt a megközelítést használja a visszavezethetőség fogalma: azt mondjuk, hogy az A probléma visszavezethető B-re, ha van olyan f inputkonverzió (ez lesz maga a visszavezetés), mely
- A inputjaiból B inputjait készíti;
- tartja a választ, azaz A(x)=B(f(x)) tetszőleges x inputjára A-nak (azaz A "igen" példányaiból B "igen" példányait készíti, "nem" példányokból pedig "nem" példányokat);
- és hatékony, azaz polinomidőben kiszámítható.
Például, a SAT probléma a következő: input egy CNF (konjunktív normálforma), output, hogy kielégíthető-e. A FORMSAT pedig ugyanez, csak inputja tetszőleges Boole-formula lehet, nem feltétlen CNF-ben.
Az világos, hogy a SAT legfeljebb olyan nehéz, mint a FORMSAT: ehhez egy visszavezetést kell találjunk SAT-ról FORMSAT-ra. Azaz egy olyan f konverziót, ami
- SAT inputjából (azaz egy CNF-ből) készíti
- FORMSAT egy inputját (azaz egy akármilyen Boole-formulát) úgy, hogy
- ha az input F kielégíthető, akkor a generált f(F) is kielégíthető lesz és csak akkor, továbbá
- f polinomidőben (azaz gyorsan) kiszámítható legyen.
Visszafelé is igaz, hogy a FORMSAT legfeljebb olyan nehéz, mint a SAT, azaz FORMSAT ≤ SAT. Itt vigyázunk kell egy kicsit, it's a trap! Kell adni egy olyan f konverziót, ami
- input tetszőleges formulából készít
- CNF-et úgy, hogy
- ha az input F formula kielégíthető, akkor a generált f(F) CNF is az lesz, és csak akkor, továbbá
- f polinomidőben kiszámítható.
mégis rossz az egész
meeert ez a CNF-re hozó algoritmus bizony nem polinomidejű, sőt.
Több sebből vérzik a dolog, például ha az input formula
(x1∧y1)∨(x2∧y2)∨…∨(xn∧yn)
(igen, ez egy DNF), akkor az ezzel ekvivalens CNF, amit disztributivitással kapunk, kb ilyen:
(x1∨x2∨…∨xn)∧(x1∨…∨xn−1∨yn)∧…∧(x1∨y2∨x3∨y4∨…∨xn)∧…∧(y1∨y2∨…yn).
Olyan hosszú, hogy nem fér ki. Ez minimum gyanús. Tehát egy klózban xi-k vannak és yi-k, minden i-re pontosan az egyik a kettő közül; ilyen klóz 2n-féle van, mindegyik n hosszú, emiatt a teljes generált CNF n⋅2n hosszú lesz. Exponenciális hosszú outputot pedig nem lehet polinomidőben generálni, emiatt
a standard CNF-re hozó algoritmus nem polinomidejű.
sőt.
nincs is polinomidejű CNF-re hozó algoritmus.
Ettől persze még vissza akarjuk vezetni a FORMSAT-ot a SAT-ra, egy afféle apróság, hogy nem lehet tetszőleges formulából ekvivalens CNF-et készíteni polinomidőben, nem szabad, hogy kedvünket szegje. Megnézve a specifikációt, arról egy szó nincs, hogy ekvivalens is legyen a két formula, csak annyi a kérés, hogy kielégíthetőből kielégíthetőt, kielégíthetetlenből pedig kielégíthetetlent készítsünk (ezt hívtuk logikából s-ekvivalens formuláknak, s mint satisfiability).
A módszer pedig az lesz, hogy minden egyes F részformulához társítunk egy új xF változót és annak az értékét egy-egy ↔ ekvivalenciával kényszerítjük, hogy vegye fel azt az értéket, mint amit az F venne, az eredeti változók tetszőleges kiértékelése mellett. Azaz, a következő rekurzív átírást csináljuk:
x↦x, (F∨G)↦x(F∨G)↔(xF∨xG), (F∧G)↦x(F∧G)↔(xF∧xG), stb. Egy példán keresztül, ha az input formula y∧¬(z∨¬w), akkor a ¬w részformula helyett bevezetünk egy x¬w fedőnevű változót, és azt mondjuk, hogy x¬w↔¬w, a (z∨¬w) részformula helyett bevezetünk egy xz∨¬w nevű változót, és azt mondjuk, hogy xz∨¬w↔(z∨x¬w), aztán a ¬(z∨¬w) részformula helyett bejön egy x¬(z∨¬w) változó, amiről azt mondjuk, hogy x¬(z∨¬w)↔(¬xz∨¬w), és az egész formula helyett bevezetünk egy xy∧¬(z∨¬w) (eek) nevű változót, amiről pedig azt mondjuk, hogy xy∧¬(z∨¬w)↔(y∧x¬(z∨¬w)). Ezzel megoldottuk, hogy minden részformulának az értékét "letároljuk" egy változóban, már csak azt kell mondjuk, hogy a formula még ráadásul igaz is, ezt pedig úgy tesszük, hogy hozzáéseljük az xy∧¬(z∨¬w) változót is a fenti összes "értékadás" éseléséhez.
Az eredményként kapott formulánk ez lenne:
(x¬w↔¬w)∧
(xz∨¬w↔(z∨x¬w))∧
(x¬(z∨¬w)↔(¬xz∨¬w))∧
(xy∧¬(z∨¬w)↔(y∧x¬(z∨¬w)))∧
xy∧¬(z∨¬w).
Hiába látszik hosszúnak ez a formula, ez csak azért van, mert a változók neve hosszú, bevezethettem volna x0, x1, stb változókat is xz∨¬w stb. nevek helyett.
Egy jogos észrevétel, hogy ez még nem is CNF, de könnyen azzá tehető, ekvivalenciánként, a végeredmény pedig:
(¬x¬w∨¬w)∧(x¬w∨w)∧
(¬xz∨¬w∨z∨x¬w)∧(xz∨¬w∨¬z)∧(xz∨¬w∨¬x¬w)∧
(¬x¬(z∨¬w)∨¬xz∨¬w)∧(x¬(z∨¬w)∨xz∨¬w)∧
(¬xy∧¬(z∨¬w)∨y)∧(¬xy∧¬(z∨¬w)∨x¬(z∨¬w))∧(xy∧¬(z∨¬w)∨¬y∨¬x¬(z∨¬w))∧
xy∧¬(z∨¬w).
Így általánosan formulából tudunk készíteni lineáris időben (egyszer kell csak bepreorderjárni a formulát mint fát) egy max kb. nyolcszor olyan hosszú CNF-et, ami ha nem is ekvivalens, de s-ekvivalens az eredetivel.
Amúgy ha pl. ennél a példánál a formulát kielégíti az y=1,z=0,w=1 kiértékelés, akkor a plusz változókat a "megfelelő" értékre, tehát x¬w=0, xz∨¬w=0, x¬(z∨¬w)=1 és xy∧¬(z∨¬w)=1, a fenti CNF is igaz lesz, tessék ellenőrizni.
A tanulság egyelőre annyi, hogy a polinomidő az néha komolyabb kritérium a konvertálás felé, mint első blikkre látszik.
Egy másik példát is néztünk: legyen ILP, az Integer Linear Programming a következő probléma: input egy Ax≥b alakú egyenlőtlenség-rendszer, ahol A és b egész számokból álló együtthatómátrix ill. vektor; output: lehet-e úgy egész értékeket rendelni az x változókhoz, hogy teljesüljenek az egyenlőtlenségek? (Van-e egészértékű megoldás?) Mármost ez opkutból ismerős történet, "tudjuk", hogy ha az egészértékű kikötés nem lenne az x-re, akkor mondjuk a szimplex módszerrel hipp és hopp ezt megtudnánk (standardizálás, LKAF stb.) Oké, a szimplex módszer nem polinomidejű, de belsőpontossal vagy ellipszoiddal is meg lehet oldani, ami viszont polinomidejű is.
Hanem (ahogy opkutkettőből tudjuk) ebből kerekítéssel nem jön feltétlen össze egészértékű megoldás.. mindenesetre, azt azért megcsináltuk, hogy
SAT ≤ ILP,
ez mit jelent? Egy olyan f konverziót kell adnunk, ami
- CNF-ből készít
- egyenlőtlenség-rendszert úgy, hogy
- ha a CNF kielégíthető, akkor az egyenlőtlenség-rendszernek van megoldása, és csak akkor,
- mindezt polinomidőben.
- az input változóiból az outputnak szintén változói lesznek, azaz egy x logikai változóból a SAT-ban készítünk egy x egészértékű változót az ILP-be,
- azt szeretnénk jó informatikushoz méltóan, hogy az ILP-ben úgy jelenjen meg az x értéke, hogy 0 a hamis, 1 az igaz,
- akkor fel kell vennünk minden x-hez egy 0≤x≤1 feltételt (hogy megfeleljen a fenti formának, ez két egyenlőtlenség: x≥0 és −x≥−1), ezzel már el is értük, hogy a változók az ILP-ben binárisak lesznek;
- akkor egy pozitív x literálból simán x-et csináljuk, a negatív ¬x literál meg így elsőre úgy fog oldalhelyesen 0-t vagy 1-et felvenni, ha belőle (1−x)-et készítünk;
- végül, egy klózból egy egyenlőtlenség lesz. A klóz akkor igaz, ha van benne igaz literál (aminek az ILP alakban 1 az értéke), és akkor hamis, ha minden literál hamis benne (azaz 0). Tehát ha a klózban a literálok(nak megfeleltetett x-ek és (1−x)-ek) összege 0, akkor hamis, amúgy pedig igaz lesz. Tehát az ℓ1∨…∨ℓk klózból egy ∑ki=1ℓi≥1 egyenlőtlenség pont megfelelő lesz, és ez minden, amit a visszavezetésnek tennie kell.
0≤x1,x2,x3≤1,
x1+(1−x2)+x3≥1,
x2+(1−x3)≥1.
Ha valakit zavar, hogy ez nem pont a mátrix alakban van, akkor némi (polinomidejű :D ) átrendezés után:
x1≥0, x2≥0, x3≥0, −x1≥−1, −x2≥−1, −x3≥−1,
x1−x2+x3≥0,
x2−x3≥0
a generált egyenlőtlenség-rendszerünk. Ennek pont akkor van megoldása, ha az input SAT kielégíthető volt. (Például x1=1,x2=1,x3=0 kielégíti az input formulát is és az egyenlőtlenség-rendszerünket is.)
A bonyelm kurzuson a visszavezetésekből olyan tanulságokat fogunk levonni, hogy egy probléma nehéz. Konkrétan, ha A≤B és A-ról már tudjuk, hogy nehéz, akkor B is nehéz kell legyen. Így van ez a fenti példában is: nemsokára látjuk előadáson, hogy a SAT egy "nehéz" probléma (hogy ez mit jelent, egyelőre szakmai titok), és emiatt az ILP is nehéz kell legyen, mert a SAT visszavezethető rá. Erről még később.
folytköv nextweek
No comments:
Post a Comment