Omezení programování - Constraint programming
Omezení programování (CP) je paradigma pro řešení kombinatorických problémů, které vychází z široké škály technik od umělé inteligence , počítačové vědy a operačního výzkumu . V programování omezení uživatelé deklarativně uvedou omezení proveditelných řešení pro sadu rozhodovacích proměnných. Omezení se liší od běžných primitiv z naléhavých programovacích jazyků v tom, že nezadáte krok nebo sled kroků, které mají vykonat, ale spíše vlastnosti nalézt řešení. Kromě omezení musí uživatelé také určit metodu řešení těchto omezení. Toto obvykle čerpá ze standardních metod, jako je chronologické zpětné sledování a šíření omezení , ale může použít přizpůsobený kód jako heuristiku větvení specifickou pro daný problém .
Omezení programování má svůj kořen a může být vyjádřeno ve formě logického programování omezení , které vloží omezení do logického programu . Tato varianta logického programování je způsobena Jaffarem a Lassezem, kteří v roce 1987 rozšířili specifickou třídu omezení, která byla zavedena v Prologu II . První implementace logického programování omezení byly Prolog III , CLP (R) a CHIP .
Místo logického programování lze omezení kombinovat s funkčním programováním , přepisováním termínů a imperativními jazyky . Programovací jazyky s integrovanou podporou omezení zahrnují Oz (funkční programování) a Kaleidoscope (imperativní programování). Omezení jsou většinou implementována v imperativních jazycích prostřednictvím nástrojů pro řešení omezení , což jsou samostatné knihovny pro existující imperativní jazyk.
Logické programování omezení
Omezení programování je vložení omezení v hostitelském jazyce. Prvními použitými hostitelskými jazyky byly logické programovací jazyky, takže se pole původně nazývalo logické programování s omezeními . Dvě paradigmata sdílejí mnoho důležitých funkcí, jako jsou logické proměnné a zpětné sledování . Dnes většina implementací Prologu obsahuje jednu nebo více knihoven pro logické programování omezení.
Rozdíl mezi nimi je do značné míry v jejich stylech a přístupech k modelování světa. Některé problémy jsou přirozenější (a tedy jednodušší) psát jako logické programy, zatímco jiné jsou přirozenější psát jako omezující programy.
Přístup programování omezení je hledat stav světa, ve kterém je současně splněno velké množství omezení. Problém se obvykle uvádí jako stav světa obsahující řadu neznámých proměnných. Omezovací program hledá hodnoty pro všechny proměnné.
Časové programování souběžných omezení (TCC) a nedeterministické programování časových souběžných omezení (MJV) jsou varianty programování omezení, které si poradí s časem.
Problém spokojenosti s omezením
Omezení je vztah mezi více proměnnými, který omezuje hodnoty, které mohou tyto proměnné nabývat současně.
Definice - Problém uspokojení omezení na konečných doménách (nebo CSP) je definován tripletem, kde:
- je sada proměnných problému;
- je sada domén proměnných, tj. pro vše, co máme ;
- je soubor omezení. Omezení je definováno sadou proměnných a relací, která definuje sadu hodnot povolených současně pro proměnné :
Existují tři kategorie omezení:
- Extensional Constraints: Constraints are defined by enumerating the set of values that would meet them;
- aritmetická omezení: omezení jsou definována aritmetickým výrazem, tj. použitím ;
- logická omezení: omezení jsou definována s explicitní sémantikou, tj. AllDifferent , AtMost , ...
Definice - Přiřazení (nebo model) CSP je definováno dvojicí, kde:
- je podmnožinou proměnné;
- je n-tice hodnot získaných přiřazenými proměnnými.
Přiřazení je přidružení proměnné k hodnotě z její domény. Částečné přiřazení je, když byla přiřazena podmnožina proměnných problému. Úplné přiřazení je, když jsou přiřazeny všechny proměnné problému.
Vlastnost - Vzhledem k tomu, je asignace (částečnou nebo úplnou), z CSP , a na omezení na , jako jsou asignace splňuje vazbu v případě, a pouze tehdy, když všechny hodnoty proměnných z omezení patří .
Definice - Řešením CSP je úplné přiřazení, které splnilo všechna omezení problému.
Během hledání řešení CSP si uživatel může přát:
- nalezení řešení (splnění všech omezení);
- nalezení všech řešení problému;
- prokazující neuspokojivost problému.
Problém s optimalizací omezení
Problém optimalizace omezení (COP) je problém uspokojení omezení spojený s objektivní funkcí.
Řešení Optimální k minimalizace (maximalizace) COP je řešení, které minimalizuje (maximalizuje) hodnota objektivní funkce .
Během hledání řešení CSP si uživatel může přát:
- nalezení řešení (splnění všech omezení);
- nalezení nejlepšího řešení s ohledem na cíl;
- prokázání optimality nejlépe nalezeného řešení;
- prokazující neuspokojivost problému.
Perturbation vs. refinement models
Jazyky pro programování založené na omezeních sledují jeden ze dvou přístupů:
- Model upřesnění: proměnné v problému jsou zpočátku nepřiřazené a předpokládá se, že každá proměnná může obsahovat jakoukoli hodnotu obsaženou v jeho rozsahu nebo doméně. Jak postupuje výpočet, hodnoty v doméně proměnné se prořezávají, pokud se ukáže, že jsou nekompatibilní s možnými hodnotami jiných proměnných, dokud pro každou proměnnou nenajdete jednu hodnotu.
- Poruchový model: proměnným v úloze je přiřazena jedna počáteční hodnota. V různých časech dostává jedna nebo více proměnných poruchy (změny jejich staré hodnoty) a systém šíří změnu ve snaze přiřadit nové hodnoty jiným proměnným, které jsou v souladu s poruchami.
Omezení šíření v omezovačích problémů spokojenost je typickým příkladem modelu rafinace, a tabulky jsou typickým příkladem modelu odchylky.
Model upřesnění je obecnější, protože neomezuje proměnné na jedinou hodnotu, může vést k několika řešením stejného problému. Model poruchy je však intuitivnější pro programátory používající smíšené imperativní omezení objektově orientovaných jazyků.
Domény
Omezení použitá v programování omezení jsou obvykle nad některými konkrétními doménami. Některé populární domény pro programování omezení jsou:
- booleovské domény, kde platí pouze omezení true / false ( problém SAT )
- celočíselné domény, racionální domény
- intervalové domény, zejména pro problémy s plánováním
- lineární domény, kde jsou popsány a analyzovány pouze lineární funkce (i když přístupy k nelineárním problémům existují)
- konečné domény, kde jsou omezení definována přes konečné sady
- smíšené domény zahrnující dvě nebo více výše uvedených domén
Konečné domény jsou jednou z nejúspěšnějších domén programování omezení. V některých oblastech (jako je operační výzkum ) je programování omezení často identifikováno s programováním omezení přes konečné domény.
Šíření omezení
Podmínky místní konzistence jsou vlastnosti problémů s uspokojením omezení souvisejících s konzistencí podmnožin proměnných nebo omezení. Mohou být použity ke zmenšení prostoru hledání a snazšímu řešení problému. Různé druhy místních podmínek konzistence jsou spekulativní, včetně konzistenci uzlin , konzistence oblouku a konzistence cesty .
Každou podmínku místní konzistence lze vynutit transformací, která změní problém, aniž by se změnila jeho řešení. Taková transformace se nazývá šíření omezení . Propagace omezení funguje snížením domén proměnných, posílením omezení nebo vytvořením nových. To vede ke zmenšení prostoru pro vyhledávání, což usnadňuje řešení problému pomocí některých algoritmů. Šíření omezení lze také použít jako kontrolu neuspokojivosti, obecně neúplnou, ale v některých konkrétních případech úplnou.
Řešení omezení
Existují tři hlavní algoritmické techniky pro řešení problémů s uspokojením omezení: zpětné vyhledávání, místní vyhledávání a dynamické programování.
Zpětné vyhledávání
Backtracking search je obecný algoritmus pro hledání všech (nebo některých) řešení některých výpočetních problémů , zejména problémů s omezením spokojenosti , který postupně vytváří kandidáty na řešení a opouští kandidáta („backtracks“), jakmile zjistí, že kandidát nemůže případně doplněno k platnému řešení.
Místní vyhledávání
Místní vyhledávání je neúplná metoda pro nalezení řešení problému . Je založen na iterativním vylepšování přiřazení proměnných, dokud nejsou splněna všechna omezení. Zejména místní vyhledávací algoritmy obvykle mění hodnotu proměnné v přiřazení v každém kroku. Nové přiřazení se blíží předchozímu v prostoru přiřazení, odtud název lokálního vyhledávání .
Dynamické programování
Dynamické programování je metodou matematické optimalizace i metodou počítačového programování. Odkazuje na zjednodušení komplikovaného problému rekurzivním rozdělením na jednodušší dílčí problémy . Zatímco některé problémy s rozhodováním nelze takto rozebrat, rozhodnutí, která pokrývají několik bodů v čase, se často rekurzivně rozpadají. Stejně tak v počítačové vědě, pokud lze problém optimálně vyřešit rozdělením na dílčí problémy a rekurzivním nalezením optimálního řešení dílčích problémů, pak se říká, že má optimální spodní konstrukci .
Příklad
Syntaxe pro vyjádření omezení přes konečné domény závisí na hostitelském jazyce. Následuje program Prolog, který řeší klasickou alfametickou hádanku SEND + MORE = MONEY v logickém programování omezení:
% This code works in both YAP and SWI-Prolog using the environment-supplied
% CLPFD constraint solver library. It may require minor modifications to work
% in other Prolog environments or using other constraint solvers.
:- use_module(library(clpfd)).
sendmore(Digits) :-
Digits = [S,E,N,D,M,O,R,N,Y], % Create variables
Digits ins 0..9, % Associate domains to variables
S #\= 0, % Constraint: S must be different from 0
M #\= 0,
all_different(Digits), % all the elements must take different values
1000*S + 100*E + 10*N + D % Other constraints
+ 1000*M + 100*O + 10*R + E
#= 10000*M + 1000*O + 100*N + 10*E + Y,
label(Digits). % Start the search
Tlumočník vytvoří proměnnou pro každé písmeno v skládačce. Operátor ins
se používá k určení domén těchto proměnných tak, aby se pohybovaly nad množinou hodnot {0,1,2,3, ..., 9}. Omezení S#\=0
a M#\=0
znamená, že tyto dvě proměnné nemohou nabývat nulové hodnoty. Když interpret vyhodnotí tato omezení, sníží domény těchto dvou proměnných odstraněním hodnoty 0 z nich. Potom all_different(Digits)
je zváženo omezení ; nesnižuje žádnou doménu, takže je jednoduše uložen. Poslední omezení specifikuje, že číslice přiřazené písmenům musí být takové, aby „SEND + MORE = MONEY“ platilo, když je každé písmeno nahrazeno odpovídající číslicí. Z tohoto omezení odvodí řešitel, že M = 1. Všechna uložená omezení zahrnující proměnnou M jsou probuzena: v tomto případě šíření omezení na all_different
omezení odebere hodnotu 1 z domény všech zbývajících proměnných. Šíření omezení může vyřešit problém snížením všech domén na jednu hodnotu, může dokázat, že problém nemá řešení snížením domény na prázdnou množinu, ale může také skončit, aniž by prokázal uspokojivost nebo neuspokojivost. Na štítku literály jsou použity pro skutečně provést hledat řešení.
Viz také
- Kombinatorická optimalizace
- Logické programování omezení
- Souběžné programování logiky omezení
- Matematická optimalizace
- Heuristické algoritmy
- Problém s plánováním sestry
- Problém s cestováním na turnaji
Reference
externí odkazy
- Sdružení pro programování omezení
- Konferenční seriál CP
- Průvodce programováním omezení
- Programovací systém Mozart na archive.today (archivovaný 5. prosince 2012), svobodný software založený na Oz ( styl X11 )
- Výpočtové centrum Cork Constraint v archive.today (archivováno 7. ledna 2013)
- Globální katalog omezení