Кіріспе
Жасанды интеллект және операциялық зерттеулерде шектеулерді қанағаттандыру – айнымалылардың қанағаттандыруы тиіс шарттарды белгілейтін шектеулер жиынтығы арқылы шешім табу процесі. Сондықтан, шешім – барлық шектеулерді қанағаттандыратын айнымалыларға тағайындалған мәндер жиынтығы, яғни мүмкін болатын аймақтағы нүкте. Шектеулерді қанағаттандыруда қолданылатын әдістер қарастырылып отырған шектеулердің түріне байланысты. Көбінесе, шекті домендегі шектеулер қолданылады, сондықтан шектеулерді қанағаттандыру мәселелері әдетте шекті домендегі шектеулерге негізделген мәселелермен теңестіріледі. Мұндай мәселелер көбінесе іздеу арқылы, әсіресе кері іздеу немесе жергілікті іздеу әдістері арқылы шешіледі. Шектеу тарату – мұндай мәселелерде қолданылатын әдістердің тағы бір тобы; олардың көпшілігі толық емес, яғни мәселені шеше алады немесе оның шешімі жоқ екенін дәлелдей алады, бірақ әрқашан емес. Шектеу тарату әдістері берілген мәселені шешуді жеңілдету үшін іздеумен бірге қолданылады. Басқа қарастырылатын шектеулердің түрлері – нақты немесе рационалды сандарға қатысты; мұндай шектеулер бойынша мәселелерді шешу үшін айнымалыларды жою немесе симплекс алгоритмі қолданылады. Шектеулерді қанағаттандыру жалпы мәселе ретінде 1970 жылдары жасанды интеллект саласында пайда болды (мысалы, қараңыз). Дегенмен, шектеулер көпөлшемді сызықтық теңдеулер түрінде берілгенде (теңсіздіктерді анықтайтын), бұл саланың тарихы 19 ғасырдағы Джозеф Фурьеге дейін жетеді: Джордж Данцигтің 1946 жылы сызықтық бағдарламалау үшін симплекс алгоритмін (математикалық оптимизацияның ерекше жағдайы) ойлап табуы жүздеген айнымалылары бар мәселелерге қолданылатын шешімдерді табуға мүмкіндік берді. 1980 және 1990 жылдары шектеулерді бағдарламалау тіліне енгізу дамыды. Шектеулі бағдарламалауды тікелей қолдайтын алғашқы тіл – Prolog болды. Содан бері, C++ немесе Java сияқты басқа тілдерде де шектеулі бағдарламалау кітапханалары пайда болды (мысалы, Java үшін Choco).
a set of constraints that impose conditions that the variables must satisfy. A solution is therefore an assignment of values to the variables that satisfies all constraints—that is, a point in the feasible region. The techniques used in constraint satisfaction depend on the kind of constraints being considered. Often used are constraints on a finite domain, to the point that constraint satisfaction problems are typically identified with problems based on constraints on a finite domain. Such problems are usually solved via search, in particular a form of backtracking or local search. Constraint propagation is another family of methods used on such problems; most of them are incomplete in general, that is, they may solve the problem or prove it unsatisfiable, but not always. Constraint propagation methods are also used in conjunction with search to make a given problem simpler to solve. Other considered kinds of constraints are on real or rational numbers; solving problems on these constraints is done via variable elimination or the simplex algorithm. Constraint satisfaction as a general problem originated in the field of artificial intelligence in the 1970s (see for example ). However, when the constraints are expressed as multivariate linear equations defining (in)equalities, the field goes back to Joseph Fourier in the 19th century: George Dantzig's invention of the simplex algorithm for linear programming (a special case of mathematical optimization) in 1946 has allowed determining feasible solutions to problems containing hundreds of variables. During the 1980s and 1990s, embedding of constraints into a programming language was developed. The first language devised expressly with intrinsic support for constraint programming was Prolog. Since then, constraint programming libraries have become available in other languages, such as C++ or Java (e. g., Choco for Java).
Шектілік қанағаттандыру проблемасы
Жасдан анықталғандай, шектеулер берілген әлемде айнымалылар жиынының қабылдай алатын мүмкін мәндерін көрсетеді. Мүмкін әлем – әлемнің (нақты немесе ойша) болу мүмкіндігін білдіретін айнымалыларға мәндердің толық сәйкестендірілуі. Жай ғана айтқанда, шекті домен – кез келген элементтердің шекті жиыны. Мұндай доменде шектеулерді қанағаттандыру мәселесі доменнен ғана мән ала алатын айнымалылар жиынын және шектеулер жиынын қамтиды, әр шектеу айнымалылар тобының рұқсат етілген мәндерін анықтайды. Бұл мәселенің шешімі – барлық шектеулерді қанағаттандыратын айнымалылардың мәндерін табу болып табылады. Яғни, шешім – барлық шектеулер осы мәндермен орындалатындай әр айнымалыға мән беру тәсілі. Кейбір жағдайларда қосымша талаптар болуы мүмкін: біреу шешімнің өзіне ғана емес (және оған ең жылдам немесе ең тиімді жолмен жетуге), сонымен қатар оған қалай қол жеткізілгеніне де қызығушылық танытуы мүмкін; мысалы, біреу «ең қарапайым» шешімді қалауы мүмкін («ең қарапайым» логикалық, есептеуге қатысты емес мағынада нақты анықталуы керек). Мұндай жағдай Судоку сияқты логикалық ойындарда жиі кездеседі. Іс жүзінде шектеулер көбінесе айнымалылардың барлық мүмкін мәндерін тізімдемей, ықшам түрде беріледі. Көбінесе қолданылатын шектеулердің бірі – әсер ететін айнымалылардың мәндерінің барлығы әртүрлі болуын талап ететін шектеу. Шектеулерді қанағаттандыру мәселесі ретінде қоюға болатын мәселелерге сегіз патшайымның жұмбағы, Судокуды шешу мәселесі және басқа да көптеген логикалық жұмбақтар, Бульдық қанағаттандыру мәселесі, кестелеу мәселелері, шектелген қателерді бағалау мәселелері және графиктерге қатысты мәселелер, мысалы, графикті бояу мәселесі жатады. Әдетте шектеулерді қанағаттандыру мәселесінің анықтамасына кірмесе де, арифметикалық теңдеулер мен теңсіздіктер олардағы айнымалылардың мәндерін шектейді, сондықтан оларды шектеулердің бір түрі деп қарастыруға болады. Олардың домені – сандар жиыны (тұтас, рационалды немесе нақты), ол шексіз: демек, осы шектеулердің қатынастары да шексіз болуы мүмкін; мысалы, қанағаттандыратын мәндердің шексіз саны бар. Арифметикалық теңдеулер мен теңсіздіктер көбінесе шекті домендермен шектелген «шектеулерді қанағаттандыру мәселесі» анықтамасының аясында қарастырылмайды. Дегенмен, олар шектеулерді бағдарламалауда жиі қолданылады. Футошики немесе Какуро (Cross Sum деп те аталады) сияқты кейбір шекті логикалық жұмбақтардағы арифметикалық теңсіздіктер мен теңдеулер арифметикалық емес шектеулер ретінде қарастырылатынын көрсетуге болады (Үлгіге негізделген шектеулерді қанағаттандыру және логикалық жұмбақтар).
Шешу
Шектелген домендегі шектеулерді қанағаттандыру мәселелері әдетте іздеу арқылы шешіледі. Кері жолмен іздеу, шектеулерді тарату және жергілікті іздеу сияқты әдістер ең көп қолданылады. Бұл әдістер сызықтық емес шектеулер бар мәселелерде қолданылады. Айырмалыларды жою және симплекс алгоритмі сызықтық және полиномдық теңдеулер мен теңсіздіктерді, сондай-ақ шексіз домендегі айнымалыларды қамтитын мәселелерді шешу үшін пайдаланылады. Бұлар көбінесе оптимизациялау мәселелері ретінде шешіледі, онда оптимизацияланатын функция бұзылған шектеулердің саны болып табылады.
Күрделілігі
Шектелген доменде шектеулерді қанағаттандыру мәселесін шешу домен мөлшеріне байланысты NP-толық проблема болып табылады. Зерттеулер шешуге болатын бірнеше арнайы жағдайларды көрсетті, олардың кейбіреуі рұқсат етілген шектеу қатынастарын шектейді, ал кейбіреулері шектеулердің қолданба аймақтарының ағаш құрылымын талап етеді, мүмкін мәселенің жаңадан құрастырылған түрінде. Сондай-ақ зерттеулер шектеулерді қанағаттандыру мәселесінің шекті модельдер теориясы сияқты басқа салалардағы мәселелермен байланысын анықтады.
Шектеу бағдарламалау
Шектеулі бағдарламалау – мәселелерді кодтау және шешу үшін шектеулерді бағдарламалау тілі ретінде қолдану. Бұл көбінесе бағдарламалау тіліне шектеулерді енгізу арқылы жасалады, мұндай тіл «хост тіл» деп аталады. Шектеулі бағдарламалау Prolog II-дегі терминдердің теңдіктерін формалдаудан туындады, нәтижесінде шектеулерді логикалық бағдарламалау тіліне ендіруге арналған жалпы құрылым пайда болды. Ең көп қолданылатын хост тілдері – Prolog, C++ және Java, бірақ басқа тілдер де пайдаланылған.
Шектеу логикасын бағдарламалау
Шектеулі логикалық бағдарлама – бұл шарттардың денелерінде шектеулер бар логикалық бағдарлама. Мысалы, A(X): X>0,B(X) шарты X>0 шектеуін қамтитын шарт. Мақсатта да шектеулер болуы мүмкін. Мақсаттағы және мақсатты дәлелдеуге қолданылатын шарттардағы шектеулер «шектеулер қоймасы» деп аталатын жиынтыққа жинақталады. Бұл жиынтық бағалау процесін жалғастыру үшін интерпретатор қанағаттандырыла алады деп есептеген шектеулерді қамтиды. Осы жиынтық қанағаттандырылмайтындық анықталса, интерпретатор кері іс-әрекетке көшеді. Логикалық бағдарламалауда қолданылатын терминдердің теңдеулері – шектеулердің ерекше түрі болып саналады және оларды біріктіру арқылы ықшамдауға болады. Сондықтан, шектеулер қоймасын дәстүрлі логикалық бағдарламалауда қолданылатын алмастыру ұғымының кеңейтілген нұсқасы деп қарастыруға болады. Шектеулі логикалық бағдарламалауда ең көп қолданылатын шектеулер – бүтін сандар, рационал сандар, нақты сандар және шекті домендер бойынша шектеулер. Сонымен қатар, параллель шектеулі логикалық бағдарламалау тілдері де әзірленген. Олар параллель емес шектеулі логикалық бағдарламалаудан айқын түрде ерекшеленеді, себебі олар аяқталмайтын параллель процестерді бағдарламалауға бағытталған. Шектеулерді басқару ережелерін параллель шектеулі логикалық бағдарламалаудың бір түрі ретінде қарастыруға болады, бірақ олар кейде параллель емес шектеулі логикалық бағдарламалау тілінде де қолданылады. Олар шектеулерді қайта жазуға немесе шарттардың дұрыстығына негізделген жаңа шектеулерді қорытуға мүмкіндік береді.
Басқа шектеулер бар бағдарламалау тілдері
Шектеулер жиынтығы – императивті бағдарламалау тіліне шектеулерді енгізудің бір жолы. Дегенмен, олар проблемаларды кодтау және шешу үшін ғана сыртқы кітапханалар ретінде қолданылады. Калейдоскоп бағдарламалау тілі шектеулерді императивті бағдарламалау тіліне тікелей интеграциялайтын тәсілді қолданады. Сондай-ақ, шектеулер функционалдық бағдарламалау тілдеріне де енгізілген.