![]() |
|
![]() ![]() ![]() |
|
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
Небезызвесная задача о расстановке 8 ферзей на шахтатной доске так, чтобы они не били друг друга.
Всего существует 92 решения. Но основных из них 12. Остальные получаются из них при помощи симметрии (центральной, осевой и т.д.) Нигде в нете не удалось найти решение данной задачи для этих 12 расстановок. у меня есть очевидное решение: идет генерация ВСЕХ 92 решений и последующая проверка на симметрию с сохраненными предыдущими решениями. Вопрос: можно ли этот процесс каким либо образом оптимизировать. буду рад в том числе и математическому обоснованию. Заранее спасибо. -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
nostromo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
На мой взгляд, в данном конкретном случае оптимизировать совершенно незачем --- число проверок равно C(92, 2)=4186 --- т.е. совсем небольшое.
Однако поиск решений можно оптимизировать, если вести перебор с оглядкой на симметрию. Например, выдвинув предположения: - количество ферзей в нижней половине доски не меньше четырех; - количество ферзей в левой половине доски не меньше четырех. Замечу, что эти предположения сделаны лишь с учетом того, что нас интересуют решения с точностью до симметрий и не учитывают никакой специфики задачи (вместо ферзей можно, например, расставлять королей). --------------------
На пыльных тропинках далеких планет останутся наши следы. |
|||
|
||||
Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 1 Всего: 10 |
Kuvaldis, Я как то делал программу на нахождение всех комбинаций. Вроде она давала 96 решений. Но в принципе можно покапаться в архиве и уточнить точное значение. Кстати, как ты вышел на цифру 12? Вроде 92 не делется на 12 нацело. Хотя по логике должно.
-------------------- Пролетал мимо. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Вообще-то более чем очевидно - ибо на каждой вертикали (горизонтали) может быть только 1 ферзь... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
nostromo |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
Не должно. Например, число способов раскраски каждой стороны квадрата в один из двух цветов равно 16. А с учетом вращений --- 6. Это определяется теоремой <забыл кого> и связано с порядком подгрупп допустимых преобразований. Добавлено @ 17:43
Я же написал, что опирался только на предположение, что мы ищем решения с точностью досимметрий. Да, в данной задаче, наверное, могут оказаться более эффективными, например, такие прдположения: - количество ферзей ниже главной диагонали не меньше четырех; - количество ферзей ниже побочной диагонали не меньше четырех. Замечу, что эффективность тех или иных правил зависит от способа представления позиций. --------------------
На пыльных тропинках далеких планет останутся наши следы. |
||||
|
|||||
Kuvaldis |
|
||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
Вот код программы. Она герерирует не все 92 а только 74 варианта. Т.е. оптимизация к сожалению не хорошая. int Queen_Virt(int n) - классическая функция из книги Вирта "Алгоритмы и структуры данных" int Queen_Virt_optim(int n) - "оптимизированная"
Я тут еще подумал о следующем. Если я не ошибаюсь, то любое размещение ОДНОЗНАЧНО определяется положением первого поставленного ферзя. Если его ставить в 1/8 часть доски: между главной диагональю до середины и вертикальной осью симметрии, то как раз и будут эти 12 вариантов. Но... кардинально меняется алгоритм. Извилин не хватает его реализовать. -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||
|
|||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
http://forum.vingrad.ru/index.php?showtopic=75536
http://forum.vingrad.ru/index.php?showtopic=72136 а искать по Инету я даже не пытался - ну просто потому что. PS. Оптимизация ради оптимизации мне представляется занятием менее чем осмысленным. А цели не видать... разве что вместо
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Kuvaldis |
|
||||||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
Представим, что у нас доска не 8 х 8, а 200 х 200 , т.е. смысл есть (для чего, в принципе, все и делается)
Т.е. я нашел вариант, прокрутил все возможные симметрии. Но.. все равно придется дедовским способом генерировать остальные 92 варианта (чтобы ничего не пропустить). Или я не прав? Т.Е. выигрыш маленький Как найти следующее базовое решение? В этом смысл. Еще более пристально порылся в нете. Вот цитата из книги "Шахматы и математика"
методы Пермантье, Ла-Ное, Гюнтера, Глэшера, Лакьера - про них нигде нет. Добавлено @ 21:39
C этого я и начал, но там нет ответа на мой вопрос (там решение в лоб) -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||||||
|
|||||||||
Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 1 Всего: 10 |
Вот нашел в архивах свое решение этой задачи
![]() ![]()
-------------------- Пролетал мимо. |
|||
|
||||
Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 1 Всего: 10 |
Я дальше тогда не стал делать оптимизацию, чтобы выкинуть все сеиметричные решения. Но были такие мысли. У меня поле представлено 8 числами от 0 и до 7. В принципе комбинацию можно свести в 24 битовое число. Все комбинации свести в массив чисел. Сделать подпрограмму поворачиваюшую комбинацию на 90 градусов и делаюшую зеркалку. Потом только останется делать перебор всех симетричных комбинаций.
Но это только мысли. Не проверял. Это сообщение отредактировал(а) Fin - 26.7.2006, 23:58 -------------------- Пролетал мимо. |
|||
|
||||
nostromo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
Качество оптимизации перебора определяется прежде всего количеством позиций, которые пришлось перебирать при поиске всех решений. А используют ли правила отсечения вариантов свойства симметрии или какие другие особенности задачи --- это уже детали. В общем, оценивать качество алгоритма следует по времени работы, а если в добавок интересует зависимость от каких либо параметров (например, размера доски), то эту зависимость также надо исследовать, а не просто предполагать линейной (зачастую это не так). --------------------
На пыльных тропинках далеких планет останутся наши следы. |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
Ну что, граждане? Достаточно серьезная задачка?
На русском языке я ничего не нашел, но на буржуйском кое-что ![]() Кого заинтересовало, смотри ссылкуФерзи -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
nostromo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
Неплохо было бы, собственно, увидеть постановку задачи. Непонятно, что Вас интересует: - алгоритм выделения решений с точностью до симметрии среди всех решений; - алгоритм поиска всех решений для доски 8х8; - алгоритм поиска всех решений для досок больших размеров; - алгоритм поиска некоторых решений для досок очень больших размеров (~500000 ферзей). --------------------
На пыльных тропинках далеких планет останутся наши следы. |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
Хотелось найти алгоритм выделения симметричных решений для генерации всех остальных, так как для больших досок поиск всех решений при помощи backtracking не является эффективным. Но, оказывается (см. ссылку) все решения можно найти более быстро. А тогда симметричные выделяются простым, обычным отбором. -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
nostromo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
И где там написано, что они находят все решения? --------------------
На пыльных тропинках далеких планет останутся наши следы. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |