Begrænsningsprogrammering - Constraint programming

Begrænsningsprogrammering (CP) er et paradigme til løsning af kombinatoriske problemer, der trækker på en bred vifte af teknikker fra kunstig intelligens , datalogi og operationsforskning . I begrænsningsprogrammering angiver brugerne erklærende begrænsningerne for de mulige løsninger til et sæt beslutningsvariabler. Begrænsninger adskiller sig fra de almindelige primitiver for bydende programmeringssprog ved, at de ikke specificerer et trin eller en række trin, der skal udføres, men snarere egenskaberne ved en løsning, der skal findes. Ud over begrænsninger skal brugerne også angive en metode til at løse disse begrænsninger. Denne tegner typisk ved standardmetoder som kronologisk backtracking og tvang formering , men kan anvende tilpassede kode som et specifikt problem forgrening heuristisk .

Begrænsningsprogrammering tager rod fra og kan udtrykkes i form af begrænsningslogisk programmering , som indlejrer begrænsninger i et logisk program . Denne variant af logisk programmering skyldes Jaffar og Lassez, der i 1987 udvidede en bestemt klasse af begrænsninger, der blev introduceret i Prolog II . De første implementeringer af begrænsningslogisk programmering var Prolog III , CLP (R) og CHIP .

I stedet for logisk programmering kan begrænsninger blandes med funktionel programmering , termomskrivning og tvingende sprog . Programmeringssprog med indbygget understøttelse af begrænsninger inkluderer Oz (funktionel programmering) og Kalejdoskop (tvingende programmering). For det meste implementeres begrænsninger på tvingende sprog via begrænsningsløsningsværktøjssæt , som er separate biblioteker til et eksisterende tvingende sprog.

Begrænsning af logisk programmering

Begrænsningsprogrammering er en indlejring af begrænsninger på et værtssprog. De første anvendte værtssprog var logiske programmeringssprog , så feltet blev oprindeligt kaldt begrænsningslogisk programmering . De to paradigmer deler mange vigtige funktioner, såsom logiske variabler og backtracking . I dag inkluderer de fleste Prolog- implementeringer et eller flere biblioteker til begrænsning af logisk programmering.

Forskellen mellem de to er stort set i deres stilarter og tilgange til modellering af verden. Nogle problemer er mere naturlige (og dermed enklere) at skrive som logiske programmer, mens nogle er mere naturlige at skrive som begrænsningsprogrammer.

Begrænsningsprogrammeringsmetoden er at søge efter en tilstand i verden, hvor et stort antal begrænsninger opfyldes på samme tid. Et problem angives typisk som en tilstand af verden, der indeholder et antal ukendte variabler. Begrænsningsprogrammet søger efter værdier for alle variablerne.

Temporal concurrent constraint programmering (TCC) og ikke-deterministisk temporal concurrent constraint programmering (MJV) er varianter af begrænsningsprogrammering, der kan håndtere tid.

Problem med begrænsningstilfredshed

En begrænsning er en sammenhæng mellem flere variabler, som begrænser de værdier, disse variabler kan tage samtidigt.

Definition  -  Et begrænset tilfredshedsproblem på begrænsede domæner (eller CSP) defineres af en triplet, hvor:

  • er sæt af variabler for problemet;
  • er sæt af domæner af variablerne, dvs. for alt, hvad vi har ;
  • er et sæt begrænsninger. En begrænsning defineres af et sæt variabler og en relation, der definerer det sæt værdier, der tillades samtidigt for variablerne i :

Der findes tre kategorier af begrænsninger:

  • udvidelsesbegrænsninger: begrænsninger defineres ved at tælle det sæt værdier, der ville tilfredsstille dem;
  • aritmetiske begrænsninger: begrænsninger defineres ved et aritmetisk udtryk, dvs. ved anvendelse af ;
  • logiske begrænsninger: begrænsninger defineres med en eksplicit semantisk, dvs. AllDifferent , AtMost , ...

Definition  -  En opgave (eller model) af en CSP defineres af parret, hvor:

  • er en delmængde af variabel;
  • er tuplen for de værdier, der er taget af de tildelte variabler.

Tildeling er tilknytning af en variabel til en værdi fra dens domæne. En delvis opgave er, når en delmængde af problemets variabler er tildelt. En samlet opgave er, når alle variablerne i problemet er tildelt.

Ejendom  -  Givet en tildeling (delvis eller total) af en CSP og en begrænsning af f.eks. , Tildeler tildelingen begrænsningen, hvis og kun hvis alle værdierne for begrænsningens variabler hører til .

Definition  -  En løsning af en CSP er en total opgave, der opfylder alle problemets begrænsninger.

Under søgningen efter løsningerne på en CSP kan en bruger ønske sig:

  • at finde en løsning (opfylder alle begrænsninger)
  • at finde alle løsningerne på problemet
  • bevis for, at problemet ikke er tilfredsstillende.

Problem med optimering af begrænsning

Et begrænsningsoptimeringsproblem (COP) er et problem med begrænsningstilfredshed, der er knyttet til en objektiv funktion.

En optimal løsning på en minimering (maksimering) COP er en løsning, der minimerer (maksimerer) værdien af ​​den objektive funktion .

Under søgningen efter løsningerne på en CSP kan en bruger ønske sig:

  • at finde en løsning (opfylder alle begrænsninger)
  • at finde den bedste løsning med hensyn til målet
  • bevis for optimaliteten af ​​den bedst fundne løsning
  • bevis for, at problemet ikke er tilfredsstillende.

Forstyrrelse vs forbedringsmodeller

Sprog til begrænsningsbaseret programmering følger en af ​​to tilgange:

  • Forbedringsmodel: variabler i problemet er oprindeligt ikke tildelt, og hver variabel antages at kunne indeholde enhver værdi, der er inkluderet i dens område eller domæne. Efterhånden som beregningen skrider frem, beskæres værdier i domænet for en variabel, hvis de viser sig at være uforenelige med de mulige værdier for andre variabler, indtil der findes en enkelt værdi for hver variabel.
  • Forstyrrelsesmodel: variabler i problemet tildeles en enkelt startværdi. På forskellige tidspunkter modtager en eller flere variabler forstyrrelser (ændringer i deres gamle værdi), og systemet udbreder ændringen og prøver at tildele nye værdier til andre variabler, der er i overensstemmelse med forstyrrelsen.

Begrænsningsproproduktion i problemer med begrænsningstilfredshed er et typisk eksempel på en forbedringsmodel, og regneark er et typisk eksempel på en forstyrrelsesmodel.

Forbedringsmodellen er mere generel, da den ikke begrænser variabler til at have en enkelt værdi, den kan føre til flere løsninger på det samme problem. Forstyrrelsesmodellen er dog mere intuitiv for programmører, der bruger blandede imperative begrænsninger objektorienterede sprog.

Domæner

De begrænsninger, der anvendes i begrænsningsprogrammering, er typisk over nogle specifikke domæner. Nogle populære domæner til begrænsningsprogrammering er:

Endelige domæner er et af de mest succesrige domæner inden for begrænsningsprogrammering. På nogle områder (som operationsforskning ) identificeres begrænsningsprogrammering ofte med begrænsningsprogrammering over begrænsede domæner.

Begrænsning udbredelse

Lokale konsistensforhold er egenskaber ved problemer med begrænsningstilfredshed relateret til konsistensen af undergrupper af variabler eller begrænsninger. De kan bruges til at reducere søgerummet og gøre problemet lettere at løse. Forskellige slags lokale konsistensbetingelser udnyttes, herunder node-konsistens , bue-konsistens og sti-konsistens .

Enhver lokal konsistensbetingelse kan håndhæves af en transformation, der ændrer problemet uden at ændre dets løsninger. En sådan transformation kaldes forplantning af begrænsninger . Begrænsningsformering fungerer ved at reducere domæner for variabler, styrke begrænsninger eller oprette nye. Dette fører til en reduktion af søgerummet, hvilket gør problemet lettere at løse med nogle algoritmer. Begrænsningsformering kan også bruges som en utilfredsstillende kontrol, ufuldstændig generelt men komplet i nogle særlige tilfælde.

Løsning af begrænsninger

Der er tre hovedalgoritmiske teknikker til løsning af problemer med begrænsningstilfredshed: backtracking-søgning, lokal søgning og dynamisk programmering.

Backtracking søgning

Backtracking-søgning er en generel algoritme til at finde alle (eller nogle) løsninger på nogle beregningsproblemer , især begrænsningsproblemer , der gradvist bygger kandidater til løsningerne og forlader en kandidat ("backtracks"), så snart den bestemmer, at kandidaten ikke muligvis udfyldes til en gyldig løsning.

Lokal søgning

Lokal søgning er en ufuldstændig metode til at finde en løsning på et problem . Det er baseret på iterativt at forbedre en tildeling af variablerne, indtil alle begrænsninger er opfyldt. Især ændrer lokale søgealgoritmer typisk værdien af ​​en variabel i en opgave ved hvert trin. Den nye opgave er tæt på den forrige i opgaveområdet, deraf navnet lokal søgning .

Dynamisk programmering

Dynamisk programmering er både en matematisk optimeringsmetode og en computerprogrammeringsmetode. Det refererer til at forenkle et kompliceret problem ved at opdele det i enklere delproblemer på en rekursiv måde. Mens nogle beslutningsproblemer ikke kan adskilles på denne måde, bryder beslutninger, der spænder over flere tidspunkter, ofte fra hinanden rekursivt. Ligeledes i datalogi, hvis et problem kan løses optimalt ved at opdele det i underproblemer og derefter rekursivt finde de optimale løsninger på delproblemerne, siges det at have optimal underkonstruktion .

Eksempel

Syntaksen til at udtrykke begrænsninger over begrænsede domæner afhænger af værtssproget. Følgende er et Prolog- program, der løser det klassiske alfamatiske puslespil SEND + MORE = PENGE i begrænsningslogikprogrammering:

% 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

Tolken opretter en variabel for hvert bogstav i puslespillet. Operatøren ins bruges til at specificere domænerne for disse variabler, så de spænder over værdisættet {0,1,2,3, ..., 9}. Begrænsningerne S#\=0 og M#\=0 betyder, at disse to variabler ikke kan tage værdien nul. Når tolken evaluerer disse begrænsninger, reducerer det domænerne for disse to variabler ved at fjerne værdien 0 fra dem. Derefter all_different(Digits) overvejes begrænsningen ; det reducerer ikke noget domæne, så det gemmes simpelthen. Den sidste begrænsning angiver, at de cifre, der er tildelt bogstaverne, skal være sådan, at "SEND + MORE = PENGE" holder, når hvert bogstav erstattes med det tilsvarende ciffer. Fra denne begrænsning udleder opløseren, at M = 1. Alle lagrede begrænsninger, der involverer variabel M, vækkes: i dette tilfælde fjerner begrænsningspropagering all_different begrænsningen værdi 1 fra domænet for alle de resterende variabler. Begrænsningspropagation kan løse problemet ved at reducere alle domæner til en enkelt værdi, det kan bevise, at problemet ikke har nogen løsning ved at reducere et domæne til det tomme sæt, men kan også afsluttes uden at bevise tilfredshed eller utilstrækkelighed. De label konstanter bruges til rent faktisk at udføre søge efter en løsning.

Se også

Referencer

eksterne links