Шахматы, задача о 12 конях

  • Автор темы Вероничка
  • Дата начала
В

Вероничка

Guest
В четверг экзамен помогите, plz.
Требуется найти такую расстановку 12 коней на шахматной доске, при которой каждое поле будет находиться под ударом одного из них.
 

Mulll•GuN

Пользователь
хех знал задачу про 8 королев или 7 не плмню.. там нужно было растваить их так что бы они наобарот друг друга ни как не ели....
но эта тоже будет интерестной )
 

scrptn

Пользователь
Я придумал решение, но только придётся писать прогу, чтобы объяснить.

Могу на Паскале изобразить, если надо...

Хотя, судя по дате, уже не надо.
 

scrptn

Пользователь
Меня тоже зацепило. Вечером, как приду домой, напишу на Пасквиле.
 

scrptn

Пользователь
Очень долго думал над этой задачей. Придумал несколько вариантов решения, но при оценке количества итераций в этих алгоритмах я их отметал. :)

Самая трезвая идея: т.к. каждая клетка находится "под прицелом", то и каждый конь находтся под прицелом хотя бы одного из собратьев - исходя из этого можно составить алгоритм, который расставляет коней по принципу "чтобы клетка, на которой он стоит, была уже под прицелом". Как готовое решение: ставить коня на произвольную клетку, а потом совершать 11 ходов так, чтобы не попадать в одну клетку дважды. А потом проверять, выполняются ли условия, если в эти следы расставить коней. Но даже этот вариант имеет трудности и не гарантирует нахождения решения.

Самый простой для программирования вариант: генетический алгоритм.
Генерируются случайные особи с 12-ю генами в хромосомах. Каждый ген - число - номер клетки, где есть конь. А потом эти особи итеративно скрещиваются. Фитнес функция проверяет близость каждой особи к решению. Вероятность оставить потомство особью пропорциональна степени соответствия решению (кол-ву "простреливаемых" конями клеток) - думаю, так итерации быстрее всего сойдутся и алгоритм не провалится в локальные экстремумы.

Возможно, потом всё-таки изображу решение.

А вот аналитического решения я так и не накрутил. :)
 

scrptn

Пользователь
Это аццкая задача! Я написал решение посредством ГА (генетич. алг-м), но он не сходится!!! ;) Мне максимум удавалось достигать значения в 60 покрытых клеток поля.
 

scrptn

Пользователь
Кода на 177 строк. Не сходится. Сделал так, что возможность мутации гена вводить можно вручную, и наилучшие результаты, очевидно, получаются тогда, когда это значение сравнимо с количеством клеток доски - 64.

Прога выводит максимальное и минимальное значение фитнес-функции для популяции. Просит ввести количество особей и кол-во итерации за раунд. Если находит значение, то останавливается сама... наверное... ;)

В архиве исходник и откомпилированная программа.
[attachment=8236:12knights.zip]

Если интересны подробности - спрашивайте.
 

scrptn

Пользователь
Экспериментировал с программой. Сделал предположение, что всё-таки под прицелом должны находиться только пустые клетки, т.е. конь может стоять и там, где клетка не находится под прицелом др. коня. Но даже так алгоритм не сходится!

Протестировал те участки кода, в которые раньше программа не заходила - вывод результата - работает нормально. Странно всё это.

А есть ли вообще решение задачи? Одним словом, нужно искать аналитическое решение. Если у кого есть идеи - пишите! Это будет интересно.
 

AlexeyGR

Пользователь
[quote name=\'scrptn\' post=\'335548\' date=\'3.10.2008, 19:47\']А есть ли вообще решение задачи?[/quote]

Если речь о самой расстановке - есть. Также есть решения для пяти ферзей, восьми ладей или слонов, девяти королей.
 

scrptn

Пользователь
Так какая тогда правильная формулировка: чтобы все клетки были под прицелом (включая занятые конями) или только все свободные клетки?
 

AlexeyGR

Пользователь
В классических шахматно-математических задачах речь идёт именно о свободных клетках. Хотя сейчас передо мной лежит вариант решения - и в нём несколько занятых клеток также под ударом. По большому счёту - допустимо то, что прямо не запрещено условием задачи.
 

scrptn

Пользователь
Несколько клеток под ударом - это естественно. Скорее, даже труднее наоборот сделать. Тогда я ещё покручу программу, может, заработает. Я не верю в то, что генетический алгоритм не справляется с этой задачей. Но и косяков вроде бы нет в программе.
 

scrptn

Пользователь
Много думал... :)
Кажется я понял, почему алгоритм не сходится. Вероятно, один или несколько коней в решении стоят близко к краю доски или к углам, в результате чего под удар этих коней попадает меньше клеток, чем если бы конь стоял в центре доски. С т.з. фитнес-функции такие расстановки невыгодны - она учитывает суммарное количество клеток под ударом. Например, если появится расстановка, отличающаяся от решения позицией только одного из коней, который случайно оказался на краю доски или в углу, то алгоритм посчитает, что такая расстановка далека от решения и с очень малой вероятностью позволит такой расстановке сохранить свои гены в будущем поколении. В результате всего этого алгоритм (точнее, особи в популяции вариантов решений) проваливается в локальный максимум фитнес-функции. А нам нужен глобальный.

Нужно либо менять вид фитнес-функции, либо процедуру скрещивания. Проще сделать второе, но даже в этом случае я очень сомневаюсь, что найдётся решение. И к тому же я не представляю себе новый вид этих функций - они получаются слишком "умными".

Буду дальше думать...
 
Сверху