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:

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é

Reference

externí odkazy