730 likes | 1.06k Views
Изкуствен интелект Упражнение № 1. спец. Информатика, IV курс 2005/2006 учебна година. Литература. Bratko, Ivan, Prolog programming for Artificial Intelligence, 3rd edition, Addison-Wesley, 2001 Van Hentenryck, P., Constraint Satisfaction in Logic Programming, Cambridge, MA: MIT Press, 1989.
E N D
Изкуствен интелектУпражнение № 1 спец. Информатика, IV курс 2005/2006 учебна година
Литература • Bratko, Ivan, Prolog programming for Artificial Intelligence, 3rd edition, Addison-Wesley, 2001 • Van Hentenryck, P., Constraint Satisfaction in Logic Programming, Cambridge, MA: MIT Press, 1989
Задачи за търсене в пространството от състояния • Удовлетворяване на ограничения(Constraint satisfaction problem - CSP) • Търсене на целево състояние • Моделиране на игри за двама играчи
Задача за удовлетворяване на ограничения • Дадено: • Множество от променливиV1, V2, …, Vn • Области на стойности, които могат да приемат променливитеDvi , i=1..n • Множество от ограничения, които променливите трябва да удовлетворяват (допустими/недопустими комбинации от стойности на променливите ) • Да се намери: • Свързванена променливите със стойности, така че всички стойности да удовлетворяват всички дадени ограничения, т.е. решение е наредена n-торка от стойности на променливите, която удовлетворява всички ограничения
Задача за удовлетворяване на ограничения • Често има повече от едно свързвания на променливите, които удовлетворяват ограниченията • При оптимизационните задачи, може да определим критерий за избор измежду възможните свързвания на променливите, които удовлетворяват ограниченията
Основни задачи • планиране / разписание • управление на ресурсите • транспортни задачи • материално-техническо обезпечаване • задачи за разполагане на обекти и др.
Основни задачи • Задача за 8-те царици • Криптоаритметика • Оцветяване на граф • Пъзели • Кръстословици • …
Основни алгоритми • Генериране и тестване(generate & test) • Търсене с връщане назад(backtracking) • Разпространяване на ограниченията(forward checking) • Предварително проучване(look ahead, partial looking ahead)
B D фиг. 1 A C Пример 1: Разписание Дадени са четири дейности A, B, C и D, чиято продължителност е съответно 2, 3, 5 и 4 часа. Нека да са дадени ограничения за последователността на дейностите: дейност A трябва да предшества дейностите B и C; дейност B трябва да предшества дейностD (фиг. 1). Задачата е да се намерят началните (стартовите) времена Ta, Tb, Tc и Td на съответните дейности, така че времето за завършване Tf на разписанието да е минимално. Предполагаме, че най-ранното начално време за стартиране на дейност е 0.
Пример 1 • Променливи: • Ta, Tb, Tc, Td, Tf • Области: • Всички променливи са неотрицателни реални числа • Ограничения: • Ta + 2 <= Tb ( дейност A, която отнема 2 ч., предшества дейност B) • Ta + 2 <= Tc ( A предшества C) • Tb + 3 <= Td ( B предшества D) • Tc +5 <= Tf ( C завършва преди Tf) • Td +4 <= Tf ( D завършва преди Tf) • Критерий • минимизиране на Tf
Пример 1 • Тази задача за удовлетворяване на ограничения има множество от решения, всяко от които минимизира времето за завършване. • Множеството от решения може да бъде представено по следния начин: Ta=0 Tb=2 2<=Tc<=4 Td=5 Tf=9 • Началното време е определено за всички дейности, с изключение на Tc, която може да започва по кое да е време в интервала от 2 до 4 часа.
Удовлетворяване на ограниченията • Представят се чрез граф, който се нарича мрежа: • възли - променливи (X, Y, …) • дъги - ограничения На всяко ограничение p(X,Y), съответстват по две насочени дъги в графа: <X,Y> и <Y,X>.
Алгоритми за съвместимост • Проверяват съвместимостта на областите на променливите по отношение на ограниченията • Дъгата <X,Y> е съвместима, ако за всяка стойност на X от Dx, съответства стойност Y от Dy, удовлетворяваща ограничението p(X,Y). • Ако дъгата <X,Y> не е съвместима, тогава всички стойности от Dx, за които няма съответна стойност от Dy могат да бъдат изтрити от Dx и това би направило дъгата <X,Y> съвместима. p(X,Y) X Y
Пример 2 X Y Dx=0..10 Dy=0..10 p(X,Y): X+4 Y Дъгата <X,Y> не е съвместима. Например, за X=7 не същестува стойност за Y от Dy, такава че да е удовлетворено p(X,Y). За да стане дъгата <X,Y> съвместима, областите Dx и Dy се редуцират до: Dx=0..6 Dy=4..10
Алгоритми за съвместимост • Такава редукция на областите на променливите не може да доведе до загубата на стойности, които биха могли да са решение, защото редуцираните стойности не биха могли да участват в никое решение • Редукцията на една област, обаче може да доведе до несъвместимост на някоя друга дъга в мрежата и това да наложи областта на същата или на друга променлива да се редуцират и т.н.
Алгоритми за съвместимост • Този процес може да се повтори циклично няколко пъти, докато: • някоя от областите стане празното множество - тогава ограниченията са неудовлетворими; • всички дъги станат съвместими: • всяка област съдържа по една единствена стойност - тогава имаме единствено решение на задачата за удовлетворяване на ограничения • всички области са непразни и поне една област съдържа повече от една стойност, тогава: • не всяка комбинация от стойности дава решение • може да има повече от едно решение • може да не съществува решение - съвместимостта на дъгите не ни гарантира, че съществува решение
Пример 3 X {1;3} X > Z X > Y Y Z {0;1} {0;1} Y ≠ Z Дъгите са съвместими Не всяка тройка стойности за <X,Y,Z> е решение Например, за X=1 и Y=0, няма стойност на Z, за която да се получава решение
Пример 4 X {0;1} X ≠ Z X ≠ Y Y Z {0;1} {0;1} Y ≠ Z Дъгите са съвместими Не съществува решение Например, за X=1 и Y=0, няма стойност на Z, за която да се получава решение
Пример 1 Tb + 3 Td Tb Td Ta + 2 Tb Td + 4 Tf Step Arc Ta Tb Tc Td Tf Start 0..10 0..10 0..10 0..10 0..10 1 <Tb,Ta> 2..10 2 <Td,Tb> 5..10 3 <Tf,Td> 9..10 4 <Td,Tf> 5..6 5 <Tb,Td> 2..3 6 <Ta,Tb> 0..1 7 <Tc,Ta> 2..10 8 <Tc,Tf> 2..5 Ta Tf Ta + 3 Tc Tc Tc + 5 Tf
Пример 1 • Алгоритъм - generate & test • Генерира се множеството: • D = DTa xDTb xDTc xDTd xDTf={0,1,2,3,4,5,6,7,8,9,10 } x {0,1,2,3,4,5,6,7,8,9,10 } x {0,1,2,3,4,5,6,7,8,9,10 } x {0,1,2,3,4,5,6,7,8,9,10 } x {0,1,2,3,4,5,6,7,8,9,10 } = { <0,0,0,0,0>, <0,0,0,0,1> … <10,10,10,10,10>} • Тества се всяко свързване на променливите за това дали удовлетворява ограниченията
Пример 1 • Алгоритъм - backtracking • Свързване на променливите със стойности в определен ред • DA ,DB,DC,DD,DE <0,0, ...> • След свързването на всяка променлива със стойност се извършва проверка дали до момента свързаните променливи отговарят на ограниченията: • ако удовлетворяват ограниченията се продължава с избора на стойност за следващата несвързана променлива • ако не удовлетворяват ограниченията се избира нова стойност за последната свързана променлива
Задача 1 (за 8-те царици) • Постановка на задачата: Да се намери такова разположение на осем царици върху шахматна дъска, че никоя от тях да не се намира на бито поле от останалите.
Задача 1 • Нека решението да има вида:solution(Pos).и да приема стойност истина, тогава и само тогава, когато Pos изобразява позиция, при която осемте царици не се бият една друга.
Решение на задача 1 • Търсене с връщане назад(backtracking) • Вариант 1 • Генериране и тестване (generate & test) • Вариант 2 (пермутации) • Разпространяване на ограниченията(forward checking) • Вариант 3 • Вариант 4 (обобщение на вариант 3)
Вариант 1 (1) Първо трябва да изберем начин за представяне на позициите върху дъската. Един от най-естествените начини е да представяме позициите във вид на списък от осем елемента, всеки един от които съответства на по една царица. Всеки един елемент на списъка ще описва това поле от дъската, на което стои съответната царица.
Вариант 1 (2) Полетата ще описваме с помощта на двойка координати (X и Y), като всяка координата е цяло число от 1 до 8. Тази двойка ще записваме в програмата във вида X/Y. По този начин задачата се сведе до намиране на списък от вида:[X1/Y1, X2/Y2, X3/Y3, X4/Y4, X5/Y5, X6/Y6, X7/Y7, X8/Y8] удовлетворяващ условието цариците да не са на бито поле.
Вариант 1 (3) Нашата процедура solution трябва да намери подходящо свързване на променливите X1,Y1,X2,Y2,..., X8,Y8. Ясно е че всички царици трябва да се намират на различни вертикали, ето защо можем да ограничим начина на разполагане, за да облекчим решението. Можем да фиксираме X-координатата, тогава списъкът даващ решението трябва да има вида:[1/Y1, 2/Y2, 3/Y3, 4/Y4, 5/Y5, 6/Y6, 7/Y7, 8/Y8]
Вариант 1 (4) • Нас ни интересуват дъски с размер 8x8. • Нека да разгледаме по-обща задача, която бихме могли лесно да решим и тогава решението на нашата задача ще може да разглеждаме като неин частен случай. • Много важен момент е да изберем подходящо обобщение на задачата. • В нашия случай подходящо обобщение на задачата е да разрешим броя на цариците да е произволен, включително и нула.
Вариант 1 (5) • Тогава определянето на решението solutionсе свежда до два случая: • Случай 1: Списъкът от царици е празен. • Случай 2: Списъкът от царици не е празен.
Вариант 1 (6) Случай 1: Списъкът от царици е празен.Това очевидно е решение, защото в този случай никой не е на бито поле от другите.
Вариант 1 (7) Случай 2: Списъкът от царици не е празен. Тогава той ще има вида: [X/Y | Rest]където първата царица се намира на поле X/Y, а останалите - на полета описани в списъка Rest.
Вариант 1 (7) Случай 2: Списъкът от царици не е празен. За да бъде това решение е необходимо да са изпълнени следните условия: (1) Цариците от списъка Rest, трябва да не се бият една друга,т.е. списъкът Restда представлява решение. (2) Xи Yтрябва да са числа от 1 до 8. (3) Царицата, която е на поле X/Y не трябва да се бие с нито една от цариците, които са в списъка Rest.
Вариант 1 (8) Тогаваsolutionще има вида: solution([X/Y|Rest]):- solution(Rest),member(Y,[1,2,3,4,5,6,7,8]), notbeat(X/Y,Rest).
Вариант 1 (9) • Остава да напишем notbeat:notbeat(Q,QList). • Неговото описание отново може да се разбие на два случая: (1) Ако QList е празен списък, тогава условието е изпълнено.(2) Ако QList не е празен списък, то той ще има вида [Q1|RestQ]и трябва да отговаря на следните две условия: (а) царицата на поле Q не трябва да бие царицата на поле Q1 и (б) царицата на поле Q не трябва да бие нито една от цариците в списъка RestQ.
Вариант 1 (10) Условието царица да не е на бито поле от друга царица, означава двете царици да не са на един и същ диагонал, хоризонтал или вертикала, т.е. Y-координатите им да са различни и разстоянията между полетата по X и по Y да са различни (виж Фиг. 2 и Фиг. 3).
8 7 6 5 3 2 1 3 1 2 4 5 6 7 8 Вариант 1 (11) -7 -6 -5 -4 -2 -1 0 -3 1 2 4 6 3 5 7 Y U=X-Y 4 Всички десни диагонали могат да се означат еднозначно с константа U=X-Y X Фиг. 2
8 7 6 5 3 2 1 3 1 2 4 5 6 7 8 Вариант 1 (12) Y Всички леви диагонали могат да се означат еднозначно с константа V=X+Y 4 V=X+Y X 7 10 11 12 13 14 15 16 6 8 9 2 3 4 5 Фиг. 3
Вариант 1 (13) Тогава програмата, която дава решението ще има вида: solution([]). solution([X/Y|Rest]):- solution(Rest), member(Y,[1,2,3,4,5,6,7,8]), notbeat(X/Y,Rest). notbeat(_,[]). notbeat(X/Y,[X1/Y1|Rest]):- Y =\= Y1,% различни вертикали Y1+X1 =\= X+Y, % различни леви диагонали X1-Y1 =\= X-Y, % различни десни диагонали notbeat(X/Y,Rest). member(X,[X|L]). member(X,[Y|L]):-member(X,L).
Вариант 1 (14) Ако е зададен следният шаблон, с който търсим решение: pattern([1/Y1, 2/Y2, 3/Y3, 4/Y4, 5/Y5, 6/Y6, 7/Y7,8/Y8]). Решението може да се получи от въпроса: ?- pattern(S), solution(S). S=[1/4,2/2,3/7,4/3,5/6,6/8,7/5,8/1] ?
Вариант 2 (1) При вариант 1, решенията имаха вида:[1/Y1, 2/Y2, 3/Y3, 4/Y4, 5/Y5, 6/Y6, 7/Y7, 8/Y8]очевидно е че ако се пропусне X-координатата никаква информация няма да се изгуби. Ето защо може да направим по-икономично представяне на позициите върху дъската, като оставим само Y-координатите на цариците:[Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8].
Вариант 2 (2) За да няма биене на цариците по хоризонтала е необходимо Y-координатите на цариците да са такива, че да са заети всички хоризонтали от1 до 8. Остава само да се определи в какъв ред ще се приемат тези осем стойности. Всяко решение представлява една пермутация на списъка: [1,2,3,4,5,6,7,8]. Една такава пермутация на списъка Sе решение, ако всяка царица не е на бито поле, т.е. S е "безопасен".
Вариант 2 (3) • Тогава решението ще има вида: solution(S):- perm([1,2,3,4,5,6,7,8],S), safe(S). • На построяването на пермутация на списък няма да се спираме.
Вариант 2 (4) • Остава да определим safe. Може да разгледаме два случая: (1) S е празният списък. Тогава той очевидно е безопасен. (2) S не е празен списък и има вида [Q|Rest]. Тогава той е безопасен, ако списъкът Rest е безопасен и Qне бие нито една царица от списъка Rest.
Вариант 2 (5) • Тогава safe ще има вида:safe([]).safe([Q|Rest]):- safe(Rest), notbeat(Q,Rest,1).
Вариант 2 (6) • При определянето на notbeat трудността се състои в това, че разположението на цариците се определя само от Y-координатите им, а X-координатите не присъстват в явен вид при представянето. Ето защо ще добавим трети аргумент DistX, който ще ни задава разстоянието по X, между Qи Rest.
Вариант 2 (6A) X/Y X1/Y1 U=X-Y U1=X1-Y1 V=X+Y V1=X1+Y1 U U1 V V1 X-Y X1-Y1 X+Y X1+Y1 X-X1 Y-Y1 X-X1 Y1-Y DistX Y-Y1 DistX Y1-Y
Вариант 2 (6B) [Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8] X: 1, 2, 3, 4, 5, 6, 7, 8 DistX: 1, 2, 3, ...
Вариант 2 (6C) [Y2,Y3,Y4,Y5,Y6,Y7,Y8 ] X: 2, 3, 4, 5, 6, 7, 8 DistX: 1, 2, 3, ...
Вариант 2 (7) Тогава програмата, която дава решението ще има вида: solution(S):- perm([1,2,3,4,5,6,7,8],S), safe(S). safe([]). safe([Q|Rest]):- safe(Rest), notbeat(Q,Rest,1).
Вариант 2 (8) notbeat(_,[],_). notbeat(Y,[Y1|ListY],DistX):- Y1-Y =\= DistX,Y-Y1 =\= DistX,Dist1 is DistX+1,notbeat(Y,ListY,Dist1). del(A,[A|L],L). del(A,[B|L],[B|L1]):-del(A,L,L1). perm([],[]). perm(L,[X|P]):-del(X,L,L1),perm(L1,P).