Transcript
Page 1: Programiranje ograni cenja sa primerima u programskom ...poincare.matf.bg.ac.rs/~milena/msnr/2016/11/06_ProgramiranjeOgra... · Programiranje ograni cenja sa primerima u programskom

Programiranje ogranicenja sa primerima u

programskom jeziku PythonSeminarski rad u okviru kursa

Metodologija strucnog i naucnog radaMatematicki fakultet

Sasa Bukurov, Marko [email protected], [email protected]

11. maj 2016

Sazetak

Cilj ovog rada je da predstavi paradigmu programiranja ogranicenja. Uradu su predstavljeni koncepti, definicije i vrste ogranicenja, kao i problemizadovoljivosti ogranicenja. Dalje, rad se osvrce na samu paradigmu, kakoi gde se primenjuje, kao i na dostupne tehnologije.

Sadrzaj

1 Uvod 2

2 Ogranicenja 22.1 Globalna ogranicenja . . . . . . . . . . . . . . . . . . . . . . 2

3 Problemi zadovoljivosti ogranicenja 3

4 Algoritmi za resavanje problema zadovoljivosti ogranicenja 44.1 Naivni algoritmi . . . . . . . . . . . . . . . . . . . . . . . . 44.2 Napredni algoritmi . . . . . . . . . . . . . . . . . . . . . . . 4

5 Programiranje ogranicenja 55.1 Primena programiranja ogranicenja . . . . . . . . . . . . . . 55.2 Podrska programiranja ogranicenja . . . . . . . . . . . . . . 6

6 Zakljucak 6

Literatura 7

A Dodatak 7

1

Page 2: Programiranje ograni cenja sa primerima u programskom ...poincare.matf.bg.ac.rs/~milena/msnr/2016/11/06_ProgramiranjeOgra... · Programiranje ograni cenja sa primerima u programskom

1 Uvod

Programiranje ogranicenja (eng. constraint programming) je (dekla-rativna) programska paradigma gde su relacije medu promenljivama dateu obliku razlicitih ogranicenja. Za razliku od imperativne paradigme,gde je postupak pronalazenja resenja dat u koracima, kod programira-nja ogranicenja, nije dat postupak vec su postavljeni uslovi koje pro-menljive moraju da ispunjavaju. Ogranicenja mogu biti postavljena narazlicite nacine (vise o tome je napisanu u odeljku. Uopsteno, programi-ranje ogranicenja je alat za resavanje problema zadovoljivosti ogranicenja(odeljak 3).

2 Ogranicenja

Ogranicenje c(x1, ..., xn) ukljucuje konacan broj promenljivih odlucivanjax1, ..., xn. Svaka promenljiva xj moze uzeti vrednost vi iz konacnog skupaDj , koji se naziva domen od xj . Ogranicenje c definise relaciju Rc ⊂D1 × D2...Dn [2]. Zadovoljeno je ako (v1, ..., vn) ∈Rc. Razlikuju searitmeticka i simbolicka ogranicenja. Aritmeticka ogranicenja se odnosena matematicka ogranicenja kao sto su jednako/razlicito ili manje/vece.Programiranje ogranicenja kao paradigma daje mogucnost da se raznaogranicenja mogu koristiti i ta ogranicenja nazivamo simbolickim ogranicenjima.Paradigma dozvoljava da se razne stvari predstave i koriste kao ogranicenja.Takva ogranicenja se nazivaju simbolicka ogranicenja. Simbolicko ogranicenjeje bilo koja relacija R ⊂ D1 × ...Dn, ali da bi bila korisna mora da imaefikasne algoritme filtriranja [2].

Postoje i druge podele ogranicenja poput: aritmeticka ogranicenja i iz-razi, logicka ogranicenja, ogranicenja kompatibilnosti, ogranicenja rasporedivanja,specijalizovana ogranicenja. Primer logickih ogranicenja je prikazan u ta-beli 1.

Simbol Znacenje

&& Logicka konjukcija| | Logicka disjunkcija! Logicka negacija

=> Implikacija!= Razlicito== Ekvivalencija

Tabela 1: Primer logickih ogranicenja

2.1 Globalna ogranicenja

Simbolicka ogranicenja koja nastaju grupisanjem proizvoljnog brojajednostavnih ogranicenja, koja se odnose na nekoliko promenljivih, u novoogranicenje koje se odnosi na sve promenljive nazivaju se globalna ogranicenja.Dakle globalna ogranicenja su ogranicenja koja sadrze skup drugih ogranicenja.Postoji veliki broj razlicitih globalnih ogranicenja a daljem tekstu su iz-dvojena najpopularnija.

Sve razlicite (eng. Alldifferent) - Ogranicenje po kom promenljive,x1,...,xn, treba da imaju razlicite vrednosti po parovima. Dakle xi 6= xj

2

Page 3: Programiranje ograni cenja sa primerima u programskom ...poincare.matf.bg.ac.rs/~milena/msnr/2016/11/06_ProgramiranjeOgra... · Programiranje ograni cenja sa primerima u programskom

za sve 1 ≤ i < j ≤ n [2].Ciklus (eng. Cycle) - Ogranicenje koje omogucava kreiranje ciklusa

kroz usmereni graf. Za svaki cvor u grafu je poznat opseg tog cvora, tj. skojim cvorovima je direktno povezan [2].

Element - Element ogranicenja element(i, l, v) oznacava da i-ta pro-menljiva u listi promenljivih l=(x1,...,xn) uzima vrednost v, tj. xi=v [2].

Sortiranost (eng. Sortedness) - Ogranicenje sort(x1, ..., xn, y1, ..., yn)naznacava da je n-torka (y1,...,yn) dobijena od n-torke (x1,...,n) sortira-njem u neopadajucem poretku [2].

Kardinalnost (eng. Cardinality) - Ogranicenje kardinalosti odredujenajveci broj puta koji promenljiva sme da uzme istu vrednost [2].

3 Problemi zadovoljivosti ogranicenja

Definicija 3.1 Neka je:

a = (a1,a2, ...,an) ∈ D,

D = D1 ×D2 × ...×Dn

gde su D1, D2, ..., Dn neprazni skupovi sa konacno mnogo elemenata.Nad promenljivom a = (a1, a2, ..., an) se moze postaviti skup ogranicenja

C = (C1,C2, ...,Cm)

gde su ogranicenja oblika: Ci(a1, a2, ..., an)Pronalazenje jedne vrednosti (ili svih) promenljive a koja ispunjava zadataogranicenja C se naziva problem zadovoljivosti ogranicenja (sa konacnimdomenom)[1] (eng. (finite domain) constraint satisfaction problem,CSP).

Ogranicenja mogu predstavljena na razlicite nacine.

Primer 3.1 Postavljanje ogranicenja jednacinama:{x + y + z = 5, x− z = 2, x, y, z ∈ D,D = {1, 2, 3, 4}}Ovaj problem ima jedno resenje: (x, y, z) = (1, 3, 1).Jedna vrsta CSP-a je problem zadovoljivosti (SAT problem), odnosnoproblem u kome je potrebno utvrditi da li je skupu logickih promenljivihlogicke formule moguce dodeliti vrednosti tako da formula ima vrednosttacno.

Primer 3.2 SAT problem (eng. Boolean Satisfiability Problem)

• Jovan moze da dode na sastanak u ponedeljak, sredu ili petak

• Katarina ne moze da dode na sastanak u sredu.

• Ana ne moze da dode na sastanak u petak.

• Petar ne moze da dode na sastanak u utorak i cetvrtak.

Odgovor na pitanje kada svi mogu da dodu na sastanak se moze dobitiresavanjem formule:(ponedeljak∨sreda∨petak)∧(¬sreda)∧(¬petak)∧(¬utorak∨¬cetvrtak)sat

Primer 3.3 Kriptaritmetika Kriptaritmetike su matematicke igre u ko-jima se resavaju jednacine kod kojih su cifre brojeva zamenjene odredenimslovima. U primeru na slici 1 je potrebno zameniti slova razlicitim ciframai pocetne cifre brojeva ne smeju biti 0.

3

Page 4: Programiranje ograni cenja sa primerima u programskom ...poincare.matf.bg.ac.rs/~milena/msnr/2016/11/06_ProgramiranjeOgra... · Programiranje ograni cenja sa primerima u programskom

Slika 1: Kriptaritmetika

Primer 3.4 Problem osam topovaPotrebno je rasporediti osam sahovskih figura topa na standardnu sahovskutablu, na taj nacin da se topovi medusobno ne napadaju.

Iz prethodnih primera se moze uociti da su algoritmi koji resavaju ovakveprobleme velike slozenosti. SAT problem je prvi problem za koji je doka-zano da je NP-tezak problem [3] (pripada klasi problema koji se resavajuu nedeterministickom polinomijalnom vremenu) .

4 Algoritmi za resavanje problema zado-voljivosti ogranicenja

Biblioteke programiranja ogranicenja mogu imati razlicite pristupe zaresavanje problema. Iako nije neophodno poznavanje algoritama kojeove biblioteke koriste, dobro je poznavati ih jer je najlakse procenitikoji problemi se mogu efikasno resiti programiranjem ogranicenja. Naj-jednostavniji algoritmi su laki za implementaciju, ali su lose vremenskeslozenosti. Njihovim unapredivanjem nastaju algoritmi koji mogu efika-sno da resavaju zadatke.

4.1 Naivni algoritmi

Prvi nacin da se pristupi resavanju problema je ispitivanjem za svakopotencijalno resenje da li ispunjava postavljena ogranicenja. U slucajuproblema osam topova, bile bi ispitane sve moguce postavke na kojima suti topovi postavljeni, i one postavke koje ispunjavaju ogranicenja bi biledodate u skup resenja.

Iako u teoriji ovi algoritmi uvek pronalaze resenja, nije uvek moguceprimeniti ih jer je potrebno previse vremena za njihovo izvrsavanje. Uproblemu osam topova, topove je moguce rasporediti na

(648

)(4426165368

nacina) dok je broj postavki koje ispunjavaju uslov 8!, odnosno 40320nacina. Naivan pristup se moze implementirati koriscenjem bektrekingpretrage (eng. backtracking). [4]

4.2 Napredni algoritmi

Jedna optimizacija koju je moguce uneti u bektreking algoritme pre-trage je pretraga sa proverom unapred (eng. look ahead). Za razliku oduobicajenog bektreking algoritma, gde se ogranicenja proveravaju u od-nosu na prethodno postavljene promenljive i trenutnu promenljivu, bek-treking algoritmi sa proverom unapred ispituju i promenljive koje jos uveknisu dodeljene [4]. Algoritam pokusava da odbaci sve vrednosti promen-ljivih koje jos nisu postavljene, a koje ne bi ispunjavale ogranicenja po-stavljena u problemu. Ukoliko bi se odbacile sve vrednosti koje jednapromenljiva moze da ima, trenutno stanje u pretrazi bi bilo odbaceno i

4

Page 5: Programiranje ograni cenja sa primerima u programskom ...poincare.matf.bg.ac.rs/~milena/msnr/2016/11/06_ProgramiranjeOgra... · Programiranje ograni cenja sa primerima u programskom

nastavkom bektreking pretrage se nastavlja izvrsavanje algoritma. Naprimeru problema topova, nakon postavljanja topa u polje u prvoj vrsti iprvom redu bilo bi moguce odbaciti sva potencijalna resenja u kojima sedrugi top nalazi u prvoj vrsti ili prvom redu.

5 Programiranje ogranicenja

Programiranje ogranicenja je postupak pronalazenja izvodljivih resenjaiz velikog skupa kandidata resenja.[1] Problem je modelovan u odnosu naproizvoljna resenja. Bazira se na logickom programiranju i teoriji grafova.Model programiranja ogranicenja je deklarativnog tipa. Vecina problemase moze modelovati kao skup ogranicenja gde je cilj nalazenje izvodljivogresenja: zadati vrednosti promenljivama takve da je svako ogranicenjezadovoljeno. Problem koj resavamo mozemo predstaviti kao problem za-dovoljivosti ogranicenja. Formulisemo problem sa promenljivim na nekomkonkretnom skupu sa zadatim ogranicenjima, zatim biramo jezik u komecemo da predstavimo ogranicenja. Za resavanje problema koristimo me-todu specificnu za zadati domen ili neku opstu metodu, a mogu se kori-stiti oba pristupa. Cilj programiranja ogranicenja je da se eliminisu svenemoguce vrednosti, a zatim da se iz skupa mogucih vrednosti odaberunajbolja za dat problem [1].

Programiranje ogranicenja je relativno novo ali ima siroku i aktivnuzajednicu sirom sveta sa posvecenim naucnim casopisima i konferencijama[5]. Uspesno se primenjuje u planiranju, zakazivanju i drugim oblastima saraznolikim ogranicenjima. Programiranje ogranicenja se javlja u mnogimnaucnim i inzenjerskim disciplinama. Termin ’programiranje’ je pogresnoiskoriscen jer se programiranje ne odnosi na pisanje koda vec postavljanjeokvira u kojim program radi [5].

5.1 Primena programiranja ogranicenja

Primena ove paradigme je veoma siroka, krece se od matematike prekohemije pa do svakodnevnog zivota. Neke od svetskih korporacija kojekoriste ovu paradigmu u sklopu organizacije [6]: British Airways, SAS,Swissair, French railway authority SNCF, Hong Kong International Ter-minals, Michelin, Dassault...Neki od problema koji se resavaju pomocu paradigme su [6]

• mozgalice

– N-kraljica

– Zebra (problem 5 kuca)

– ukrstene reci

– kritpoaritmetika

• bojenje grafa

• analiza i sinteza analognih kola

• sekvenciranje DNK

• planiranje

• lokacija skladista

• rasporedivanje saltera na aerodromu

• seca bolesnog drveca (eng. forest treatment scheduling)

5

Page 6: Programiranje ograni cenja sa primerima u programskom ...poincare.matf.bg.ac.rs/~milena/msnr/2016/11/06_ProgramiranjeOgra... · Programiranje ograni cenja sa primerima u programskom

• hipoteticko rezonovanje u hemiji (eng. chemical hypothetical reaso-ning)

• analiza poslovanja u posrednistvu (eng. option trading analysis)

• problem rasporedivanja posade (eng. crew rostering problem)

5.2 Podrska programiranja ogranicenja

Pre navodenja podrske u popularnim i modernim jezicima treba na-glasiti da je paradigma nastala u programskom jeziku Prolog.

Poznate biblioteke za popularne programske jezike

• Artelys Lakis (C++, Java, Python) https://www.artelys.com/en/optimization-tools/kalis

• Cassowary (C++, Java, JavaScript, Ruby, Smalltalk, Python) https://constraints.cs.washington.edu/cassowary/

• CHIP V5 (C++, C) http://www.cosytec.com/production_scheduling/chip/chip_technology.htm

• Choco (Java) http://choco-solver.org/

• Cream (Java) http://bach.istc.kobe-u.ac.jp/cream/

• Disolver (C++) http://research.microsoft.com/apps/pubs/default.aspx?id=64335

• Gecode (C++, Python) http://www.gecode.org/

• Google or-tools (Python, Java, C++, .NET) https://github.com/

google/or-tools

• JaCoP (Java) http://jacop.osolpro.com/

• JOpt (Java) http://jopt.sourceforge.net/

• Numberjack (Python) http://numberjack.ucc.ie/

• Minion (C++) http://constraintmodelling.org/minion/

• python-constrains (Python) http://labix.org/python-constraint

• Z3 (C++, Java, Python, C, C#) https://github.com/Z3Prover/z3

Jezici koji imaju direktnu podrsku za programiranje ogranicenja

• Claire http://www.claire-language.com/

• Curry(zasnovan na Haskell-u) http://www-ps.informatik.uni-kiel.de/currywiki/

• Kaleidoscope https://constraints.cs.washington.edu/cip/kaleidoscope-asi.html

• Oz http://strasheela.sourceforge.net/strasheela/doc/01-Basics.html

• Wolfram language https://www.wolfram.com/language/

6 Zakljucak

Problemi koji se resavaju programiranjem ogranicenja su obicno ve-oma slozeni za resavanje. Iako naivni pristupi resavanju problema dajutacna resenja, njih u praksi nije moguce koristi, jer takvi algoritmi suvelike vremenske slozenosti. Prednosti koje pruzaju jezici specijalizovaniza programiranje ogranicenja i biblioteke u jezicima opste namene (po-put jezika Python i Jave) su formalizacija procesa pronalazenja resenja idovoljno dobra optimizacija algoritama koje ovi alati pruzaju.

6

Page 7: Programiranje ograni cenja sa primerima u programskom ...poincare.matf.bg.ac.rs/~milena/msnr/2016/11/06_ProgramiranjeOgra... · Programiranje ograni cenja sa primerima u programskom

Literatura

[1] Krzysztof R. Apt. Principles of Constraint Programming. CarnegieMellon University, 5000 Forbes Ave, Pittsburgh, PA 15213, UnitedStates, 1999.

[2] Alexander Bockmayr and John N. Hooker. Constraint programming.Carnegie Mellon University, 5000 Forbes Ave, Pittsburgh, PA 15213,United States, 2003.

[3] Stephen A Cook. The complexity of theorem-proving procedures. InProceedings of the third annual ACM symposium on Theory of com-puting, pages 151–158. ACM, 1971.

[4] Sally C. Brailsford et al. European Journal of Operational Research119 (1999) 557581.

[5] Google. developer.google.com, 2013. on-line at: https://developers.google.com/optimization/cp//.

[6] Karlov univerzitet u Pragu. Karlov univerzitet u Pragu, 2016. on-lineat: http://kti.mff.cuni.cz/~bartak/constraints/intro.html.

A Dodatak

U datoteci ProgramiranjeOgranicenja.zip su dati primeri koriscenjabiblioteke python-constraint u programskom jeziku Python.

Prvi program ilustruje pronalazenje Armstrong-ovih brojeva, daklebrojeva ciji je zbir kubova cifara jednak njemu samom. U programu jeilustrovan rad ogranicenja AllDIfferentConstraint koj yadaje da sve 3 cifremoraju biti razlicite.

from con s t r a i n t import ∗

de f main ( ) :problem = Problem ( )problem . addVar iables ( ”abc” , range (0 , 10 ) )problem . addConstraint ( A l lD i f f e r e n tCon s t r a i n t ( ) )

# problem . addConstraint ( lambda a , b , c : a !=1)problem . g e tSo l u t i on s ( )f o r s o l u t i o n in problem . g e tSo l u t i on s ( ) :

a = s o l u t i o n [ ”a” ]b = so l u t i o n [ ”b” ]c = s o l u t i o n [ ”c” ]va lue = (100∗ a+10∗b+c ) ∗1 .0value2 = ( a∗∗3+b∗∗3+c ∗∗3) ∗1 .0i f va lue2 == 0 :

value2 = 1 .0i f va lue / value2 == 1 . 0 :

p r i n t s o l u t i o n

i f name == ” main ” :main ( )

7

Page 8: Programiranje ograni cenja sa primerima u programskom ...poincare.matf.bg.ac.rs/~milena/msnr/2016/11/06_ProgramiranjeOgra... · Programiranje ograni cenja sa primerima u programskom

Drugi program je predstavlja pronalazenje broja trocifrenog broja Xtakvog da daje celobrojno resenje pri deljenju brojem X’. X’ predstavljarazliku zbira cifara stotina i desetica i cifre jedinica. U tom kodu je ilu-strovano koriscenje proizvoljnih ogranicenja.

from con s t r a i n t import ∗

de f main ( ) :problem = Problem ( )problem . addVar iables ( ”abc” , range (1 , 10 ) )problem . addConstraint ( lambda a , b , c : a!=b)problem . addConstraint ( lambda a , b , c : a>c )problem . addConstraint ( lambda a , b , c : c !=b)problem . addConstraint ( A l lD i f f e r e n tCon s t r a i n t ( ) )problem . g e tSo l u t i on s ( )minvalue = 100minso lut ion = {}f o r s o l u t i o n in problem . g e tSo l u t i on s ( ) :

a = s o l u t i o n [ ”a” ]b = so l u t i o n [ ”b” ]c = s o l u t i o n [ ”c” ]b r o j i l a c = ( a∗100+b∗10+c )imen i l a c = ( a+b−c )i f imen i l a c > 0 :

va lue = b r o j i l a c ∗1 .0/ imen i l a c ∗1 .0value2 = b r o j i l a c / imen i l a ci f va lue < minvalue and value − value2 ==

0 :minso lut ion = so l u t i o nminvalue = value2

p r i n t minvaluep r i n t minso lut ion

i f name == ” main ” :main ( )

8


Top Related