През последните няколко дни се въздържах от магистърско обучение и се съсредоточих върху този (на пръв поглед прост) пъзел:
Има тази решетка 10*10, която представлява квадрат от 100 налични места, които можете да отидете. Целта е да започнете от ъгъла и да преминете през всички места по отношение на някои прости "правила за преминаване" и да стигнете до номер 100 (или 99, ако сте програмист и започнете с 0 вместо това :)
Правилата за преминаване са:
1. Две полета скачат по вертикалната и хоризонталната ос
2. Едно пространство скачат по диагоналите
3. Можете да посетите всяко поле само веднъж
За да визуализирате по-добре, ето валиден примерен траверс (до 8-ма стъпка):
http://img525.imageshack.us/img525/280/squarepuzzle.png
Ръчно работих върху този пъзел от скука. От години се опитвам да го реша на ръка от време на време, но никога не съм надхвърлял 96. Звучи лесно? Опитайте сами и се уверете сами :)
По този начин, за да реша проблема, разработих кратка (около 100 реда код) програма в Python. Аз съм начинаещ в този език, исках да видя какво мога.
Програмата просто прилага изчерпателна техника за решаване на опити и грешки. С други думи: първо търсене в дълбочина с груба сила.
Въпросът ми възниква оттук нататък: Програмата, за съжаление, не може да реши проблема, защото пространството на състоянието е толкова голямо, че търсенето никога не свършва, без да се намери решение. Може да стигне до номер 98 (и го отпечатва) без много затруднения, въпреки това не е цялостно решение.
Програмата също така отпечатва дължината на дървото за търсене, което е обхванало досега. За няколко минути списъкът с обход от, да речем, 65-ти елемент е покрит до края, само за един единствен път. Този брой намалява в експоненциално нарастващи периоди от време. Изпълних кода от доста време и не можах да надхвърля бариерата от 50 и сега съм убеден.
Изглежда, че този прост подход няма да е достатъчен, освен ако не го пусна завинаги. И така, как мога да подобря кода си, за да бъде по-бърз и по-ефективен, така че да предлага решения?
По принцип очаквам с нетърпение да видя идеи как да:
- Улавяйте и използвайте знания за домейн, специфични за този проблем
Прилагайте техники/трикове за програмиране, за да преодолеете изтощението
..и накрая да се реализират в съществено решение.
Благодаря предварително.
Ревизия
Благодаря на Дейв Уеб за връзката на проблема с домейна, на който принадлежи:
Това е много подобно на проблема с обиколката на рицаря, който се отнася до преместване на рицар около шахматна дъска, без да се преразглежда същото поле. По принцип това е същият проблем, но с различни „Правила за преход“.