Trolleri med villkorsprogrammering Mats Carlsson matsc@sics.se www.sics.se/~matsc
I ett nötskal Programmera vad, inte hur Effektiva algoritmer paketerade som återanvändbara mjukvarukomponenter Komponenterna kommunicerar via delade variabler - propagering Variablerna tar diskreta värden
Problemklasser Hårdvarudesign Kompilering Layout och placering Tillklippning Platsallokering Frekvensplanering Konfigurering Schemaläggning: Industriella processer Underhåll I skolan Sportturneringar Skift och personal Dyr utrustning (teleskop, satelliter, )
Villkorsteknik Villkor Ett logiskt samband mellan obekanta (variabler) Villkorsprogramming (CP) Beräkningssystem som baseras på villkor CP över ändliga domäner (CP(FD)) Varje obekant har en ändlig, diskret domän
Vad är ett villkor? Några exempel. Kodningen börjar när specifikationen är klar Möten får inte överlappa i tiden Efter två nattskift krävs ett dygns vila
Exempel på villkorsprogram top :- [X1,X2,X3] in 1..4, X1+X2 #< X3, labeling([x1,x2,x3]).
Exempel på villkorsprogram top :- [X1,X2,X3] in 1..4, domändeklaration X1+X2 #< X3, labeling([x1,x2,x3]).
Exempel på villkorsprogram top :- [X1,X2,X3] in 1..4, domändeklaration X1+X2 #< X3, labeling([x1,x2,x3]). X1:1..4 X2:1..4 X3:1..4
Exempel på villkorsprogram top :- [X1,X2,X3] in 1..4, X1+X2 #< X3, ställa ett villkor labeling([x1,x2,x3]).
Exempel på villkorsprogram top :- [X1,X2,X3] in 1..4, X1+X2 #< X3, labeling([x1,x2,x3]). ställa ett villkor X1:1..2 X2:1..2 X3:3..4
Exempel på villkorsprogram top :- [X1,X2,X3] in 1..4, X1+X2 #< X3, labeling([x1,x2,x3]). sökning
Exempel på villkorsprogram top :- [X1,X2,X3] in 1..4, X1+X2 #< X3, labeling([x1,x2,x3]). sökning [1,1,3] [1,1,4] [1,2,4] [2,1,4]
Domändeklaration [X1,X2,X3] in 1..4 X1 in 1..4 Normalt innan några villkor ställs på X1, X2, X3 Designbeslut: Vilka är variablerna i mitt problem? Vilka är värdena i mitt problem?
Att ställa ett villkor X1+X2 #< X3 Som ett proceduranrop Designbeslut: Hur ska villkoret bäst uttryckas? Logiskt ekvivalenta varianter kan bete sig operationellt olika.
Exempel på propagering mellan villkor
Exempel på propagering mellan villkor
Exempel på propagering mellan villkor
Exempel på propagering mellan villkor
Exempel på propagering mellan villkor
Exempel på propagering mellan villkor
Exempel på propagering mellan villkor
Villkor från operationellt perspektiv Programkod använd som korutin for att: (1) Testa om villkoret är definitivt falskt backtracking (2) Testa om villkoret är definitivt sant deaktivering (3) Ta bort variablers värden som skulle göra villkoret definitivt falskt suspendering man måste söka Vanligen polynomiella men inkompletta algoritmer
Testa om villkoret är definitivt falskt [X1,X2,X3] in 1..4, X1+X2 #< X3 (1) Beräkna minimum av X1+X2 min(x1+x2)=min(x1)+min(x2)=1+1=2 (2) Beräkna maximum av X3 max(x3)=4 (3) Jämför: eftersom minimum av X1+X2 inte är större än maximum av X3 så är X1+X2 #< X3 inte definitivt falskt
Testa om villkoret är definitivt sant [X1,X2,X3] in 1..4, X1+X2 #< X3 (1) Beräkna maximum av X1+X2 max(x1+x2)=max(x1)+max(x2)=4+4=8 (2) Beräkna minimum av X3 min(x3)=1 (3) Jämför: eftersom maximum av X1+X2 inte är mindre än minimum av X3 så är X1+X2 #< X3 inte definitivt sant
Ta bort värden [X1,X2,X3] in 1..4, X1+X2 #< X3 (1) Beräkna nytt maximum av X1,X2 max(x1) max(x3)-min(x2)=4-1-1=2 max(x2) max(x3)-min(x1)=4-1-1=2 (2) Beräkna nytt minimum av X3 min(x3) min(x1)+min(x2)=1+1+1=3 X1:1..2 X2:1..2 X3:3..4
Sökning Så länge inte alla villkor är deaktiverade kan man inte veta säkert om det finns någon lösning alltså Man måste söka värden för alla variabler
Optimering En sökning som fixerar alla variabler (också CostVar) minimize(goal, CostVar) Börja om varje gång en bättre lösning hittas
Globala villkor Verkar på en variabel-mängd i motsats till villkor mellan några få variabler Starka nödvändiga villkor OR, geometri, grafteori, flödesteori Komponenter generiska, multiple purpose, stark propagering
Villkoret alldifferent all_different(vars) List of dvar Alla Vars har olika värden. V1 in 1..3, V2 in 2..4, V3 in 1..2, all_different([v1,v2,v3]), labeling([v1,v2,v3]) [1,3,2] [1,4,2] [2,3,1] [2,4,1] [3,2,1] [3,4,1] [3,4,2]
Villkoret element element(index, Table, Value) dvar List of dvar dvar Table[Index] = Value. X in 1..5, Y in 1..6, element(x,[4,8,1,4,2,0],y), labeling([x,y]) [1,4] [3,1] [4,4] [5,2]
Villkoret cumulative cumulative(origins,durations,heights,limit) ListDvars ListDvars ListDvars Int quantity of resource duration Limit height task origin time
Exempel: cumulative O1 in 1..2, O2 in 3..3, D1 in 2..3, D2 in 2..2, H1 in 1..4, H2 in 2..3 cumulative([o1,o2],[d1,d2],[h1,h2],4), labeling([o1,d1,h1,o2,d2,h2]). [1,2,1,3,2,2] [1,3,1,3,2,3] [1,2,1,3,2,3] [1,3,2,3,2,2] [1,2,2,3,2,2] [2,2,1,3,2,2] [1,2,2,3,2,3] [2,2,1,3,2,3] [1,2,3,3,2,2] [2,2,2,3,2,2] [1,2,3,3,2,3] [2,3,1,3,2,2] [1,2,4,3,2,2] [2,3,1,3,2,3] [1,2,4,3,2,3] [2,3,2,3,2,2] [1,3,1,3,2,2]
Tillämpningar av cumulative Förnybar resurs disjunktiv schemaläggning 1 kumulativ schemaläggning Ej förnybar resurs producent-konsument Bin-packing 1 2 3 Placering
Producent-Konsument Produced Quantity P Producer task Stock Consumer task Final Stock Consumed Quantity C Initial Stock
Områden som bidragit Artificiell Intelligens villkorsnät, datadriven beräkning Logikprogrammering Prolog, icke-determinism Diskret Matematik grafteori, kombinatorik, gruppteori Optimeringslära flödesanalys, modelleringsspråk Algoritmer och datastrukturer datastrukturer, inkrementalitet
Historia ALICE (J.L.Laurière) 1976 CHIP (ECRC) 1987-1990 Industri (Bull, Cosytec, Ilog) 1990-1992 Bibliotek 1993-2003 Inbäddat i C++ Ilog, CHIP, Figaro Inbäddat i Java Koalog, JCL, MINERVA Inbäddat i Prolog SICStus, ECLiPSe, GNU, IF Inbäddat i CLAIRE ÉCLAIR, CHOCO Inbäddat i Oz Mozart Inbäddat i OCaml FaCiLe Inbäddat i Mercury HAL Inbäddat i Lisp, Python,
Villkorsteknik på SICS - tillämpningar Schemaläggning och resursallokering för järnvägar (SJ, Green Cargo) Optimering av IP-trafik (Telia) Automatisk handel (Trading Agents) DNA-sekvensanalys (Pyrosequencing) Analys av globalt genuttryck (Global Genomics) Styrprogram för bläckstråleskrivare (HP) Schemaläggning av valsverk (Ovako Steel) Frekvensplanering for basstationer (Ericsson)
Villkorsteknik på SICS - forskning Globala villkor Bra abstraktioner/komponenter Klassificering Fundamentala principer Algoritmer Debugging Modellering och metoder Beslutstödsystem för schemaläggning och planering Plattform: www.sics.se/sicstus