Пъзел 8: Разрешимост и най-кратко решение

Създадох 8 решаване на пъзели, използвайки първо търсене в ширина. Сега бих искал да променя кода, за да използва евристика. Ще бъда благодарен ако някой ми отговори на следните два въпроса:

Разрешимост

Как да решим дали пъзел 8 е разрешим? (предвид начално състояние и целево състояние ) Ето какво казва Уикипедия:

Инвариантът е паритетът на пермутацията на всичките 16 квадрата плюс паритетът на разстоянието на таксито (брой редове плюс брой колони) на празния квадрат от долния десен ъгъл.

За съжаление не можах да разбера какво означава това. Беше малко сложно за разбиране. Може ли някой да го обясни на по-прост език?

Най-краткото решение

Като се има предвид евристика, гарантирано ли е да се даде най-краткото решение с помощта на алгоритъма A*? За да бъдем по-конкретни, винаги ли първият възел в отворения списък ще има дълбочина (или броя на движенията, направени толкова дебели), която е минималната от дълбочините на всички възли, присъстващи в отворения списък?

Трябва ли евристиката да отговаря на някакво условие, за да бъде вярно горното твърдение?

Редактиране: Как става така, че една допустима евристика винаги ще осигурява оптималното решение? И как да тестваме дали една евристика е допустима?

Бих използвал евристиката, изброена тук

Manhattan Distance 
Linear Conflict 
Pattern Database 
Misplaced Tiles
Nilsson's Sequence Score 
N-MaxSwap X-Y 
Tiles out of row and column

За пояснение от Eyal Schneider:

въведете описание на изображението туквъведете описание на изображението тук въведете описание на изображението тук



person Ranjith    schedule 17.02.2013    source източник
comment
реклама №2: да, алгоритъмът A* гарантира намирането на оптимално решение, ако използвате допустима евристика (никога не надценявайте)   -  person John Dvorak    schedule 17.02.2013
comment
Има ли някакъв начин, по който можем да проверим дали евристика е допустима? Искам да използвам различните евристики, посочени на тази страница: heuristicswiki.wikispaces.com/N+-+Puzzle   -  person Ranjith    schedule 17.02.2013
comment
Иска ми се някой да може да обясни как се тества допустимостта на евристика.   -  person Ranjith    schedule 17.02.2013


Отговори (3)


Ще се позова само на проблема с разрешимостта. Необходим е известен опит в пермутациите.

Пермутацията е пренареждане на подреден набор. Например 2134 е пренареждане на списък 1234, където 1 и 2 си разменят местата. Пермутацията има свойство за паритет; то се отнася до паритета на броя на инверсиите. Например, в следната пермутация можете да видите, че съществуват точно 3 инверсии (23,24,34):

1234
1432

Това означава, че пермутацията има нечетен паритет. Следната пермутация има четен паритет (12, 34):

1234
2143

Естествено, пермутацията на идентичност (която поддържа реда на елементите) има четен паритет.

Всяко състояние в пъзела 15 (или пъзела 8) може да се разглежда като пермутация на крайното състояние, ако го разглеждаме като конкатенация на редовете, започвайки от първия ред. Обърнете внимание, че всеки законен ход променя паритета на пермутацията (защото разменяме два елемента и броят на инверсиите, включващи елементи между тях, трябва да е четен). Следователно, ако знаете, че празният квадрат трябва да измине четен брой стъпки, за да достигне крайното си състояние, тогава пермутацията също трябва да е четна. В противен случай ще завършите със странна пермутация на крайното състояние, което е задължително различно от него. Същото с нечетен брой стъпки за празния квадрат.

Според предоставената от вас връзка към Wikipedia критериите по-горе са достатъчни и необходими, за да може даден пъзел да бъде разрешим.

person Eyal Schneider    schedule 17.02.2013
comment
Разбрах какво означава паритет. Сега, стигайки до изречението: паритетът на пермутацията на всичките 9 квадрата плюс паритетът на разстоянието на таксито (брой редове плюс брой колони) на празния квадрат от долния десен ъгъл. Така че ще получим паритета на състояние като цяло число, като го считаме за пермутация на целевото състояние, което трябва да се добави към някое друго число. (паритет на разстоянието на таксито) Сега, самото разстояние на таксито не е ли число? Какво означава паритетът му? - person Ranjith; 17.02.2013
comment
@Ranjith: Означава простото равенство на числото. Можете да го третирате като 0 и 1, така че добавянето на паритети е просто проверка на паритета на сумата. - person Eyal Schneider; 17.02.2013
comment
@Ranjith: Сега, критериите за разрешимост са прости: един пъзел е разрешим, ако и само ако следните две са равни: 1) паритетът на броя стъпки, които празният квадрат трябва да направи (просто изчислете паритета на разстоянието Манхатън между начална и крайна позиция). 2) Паритетът на пермутацията, представена от първоначалното състояние, в сравнение с целевото състояние. - person Eyal Schneider; 17.02.2013
comment
Редактирах въпроса и добавих три изображения: първото изображение показва едно състояние и две целеви състояния. Второто и третото изображение показват дали двете целеви състояния могат да бъдат достигнати или не. Можете ли да ги погледнете и да кажете дали съм го направил правилно или не. Искам да съм сигурен, че правилно съм разбрал нещата. - person Ranjith; 17.02.2013
comment
@Ranjith-SR2GF: Да, изглежда добре, с изключение на печатната грешка в случай B, където числото 3 е представено като четно число... - person Eyal Schneider; 17.02.2013
comment
Някаква идея за някакъв конкретен метод за проверка на допустимостта на евристична функция, различен от проба-грешка... - person Ranjith; 17.02.2013
comment
@Ranjith-SR2GF: Трябва да докажете, че вашата евристична функция е допустима. - person Eyal Schneider; 17.02.2013

Алгоритъмът A* е гарантиран за намиране на (едно, ако има повече от едно еднакви къси) най-краткото решение, ако вашата евристична винаги подценява реалните разходи (Във вашия случай реалният брой необходими ходове към решението).

Но в движение не мога да измисля добра евристика за вашия проблем. Това изисква известно мислене, за да се намери такава евристика.

Истинското изкуство при използване на A* е да се намери евристика, която винаги подценява реалните разходи, но възможно най-малко, за да ускори търсенето.


Първи идеи за такава евристика:

  1. Доста безпроблемна, но валидна евристика, която изникна в съзнанието ми, е разстоянието Манхатън на празния файл до крайната му дестинация.
  2. Сумата от разстоянието Манхатън на всяко поле до крайната му дестинация, разделена на максималния брой полета, които могат да променят позицията си в рамките на едно движение. (Мисля, че това е доста добра евристика)
person MrSmith42    schedule 17.02.2013
comment
Някаква идея относно частта за разрешимостта? - person Ranjith; 17.02.2013
comment
@Ranjith - SR2GF: Все още нямам представа за частта за разрешимост. Наивен начин е: опитайте се да намерите решение, ако няма такова, няма да го намерите ;-) - person MrSmith42; 17.02.2013
comment
Но това ще отнеме много време! - person Ranjith; 17.02.2013
comment
@Ranjith - SR2GF: Относно разрешимостта: 1. По принцип тези пъзели са разрешими. 2. Нерешим пъзел може да стане разрешим, ако размените две съседни полета в началото. Така че една възможност е да се опитате да решите пъзела и паралелно да се опитате да решите пъзела с една съседна двойка полета, разменени. Ако бъде намерено решение на модифицираната версия, оригиналният пъзел не е бил разрешим. - person MrSmith42; 17.02.2013
comment
Това е добра идея - решаване на оригиналния пъзел и разменения пъзел успоредно. Би било по-добре, ако мога директно да проверя за разрешимост. - person Ranjith; 17.02.2013
comment
Благодаря за отговора на втората част от въпроса. - person Ranjith; 17.02.2013

За всеки, който идва, ще се опитам да обясня как OP е получил двойките стойности, както и как той определя маркираните, т.е. инверсии, тъй като ми отне няколко часа, за да го разбера. Първо двойките. Първо вземете целевото състояние и си го представете като 1D масив (A например) [1,2,3,8,0,4,7,5]. Всяка стойност в този масив има своя собствена колона в таблицата (стигайки докрай, което е първата стойност на двойката.) След това преместете над 1 стойност вдясно в масива (i + 1) и отидете докрай отново надолу, втора стойност на чифта. например (състояние A): първата колона, втората стойност ще започне [2,3,8,0,4,7,5] надолу. втората колона ще започне [3,8,0,4,7,5] и т.н.

добре сега за инверсиите. за всяка от 2-те двойки стойности намерете местоположението им INDEX в началното състояние. ако ляв INDEX > десен INDEX, тогава това е инверсия (маркирана). първите четири двойки състояние А са: (1,2),(1,3),(1,8),(1,0)
1 е на индекс 3
2 е на индекс 0
3 > 0, така че инверсия.

1 е 3
3 е 2
3 > 2, така че инверсия

1 е 3
8 е 1
3 > 2, така че инверсия

1 е 3
0 е 7
3 ‹ 7, така че Без инверсия

Направете това за всяка двойка и пребройте общите инверсии. Ако и двете четни или и двете нечетни (Манхатън разстояние на празно петно ​​и общи инверсии), тогава е разрешимо. Надявам се това да помогне!

person David    schedule 02.01.2017