|
|
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Попинали в другой теме, посоветовали открыть новую. Вот такая классика интересная : Требуется реализовать задачу обхода шахматного коня всей шахматной доски 8x8 из клетки (i,j) так, чтобы в каждой клетке он(конь) побывал ровно по одному разу. Способ реализации мультипоточный 4 - потока = const (можно и больше, не принципиально, лишь бы найти решение(я)). алгоритм - методом обхода в глубину . Исходные данные: 4 (или более) потока(константа) - задано жестко в программе. M - минимальное число маршрутов коня которые нужно найти. i,j - стартовая точка. M,i,j - задаются в виде аргументов командной строки. правилом Варнсдорфа не пользуемся , так как оно работает - реализация удалась (во всяком случае для 8x8 и даже более , так что не интересно) Как я понял в другой теме товарищ (а он наверняка прочитает и меня подправит) предложил выбирать не последовательно ветки , а в случайном порядке, откатываясь назад к предку при случае , если конь упёрся в тупик. делать это он предлагал параллельно в нескольких потоках, чтобы стратегия хода была разная (выбор ведь будет случайным ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 22:54 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81, блин, в теме лоханулся. сорри - у меня вечер туго думаю ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 22:55 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Тишина какая-то. Ну ладно. Для затравки. Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 00:47 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonТишина какая-то. О, да! В 2 часа ночи никто не подорвался решать за тебя курсовую. Тишина в теме, никому не хочется работать Блин, раньше в delphi-форумах такое было "решите курсач, срочно", теперь вот начали в ПТУ java учить- и здесь постоянно лезет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 07:43 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, ой да не смешите. в ПТУ меня не примут. старый я уже. не надо за меня ничего делать. задача уже как 3 недели мною решена , причем 2-мя методами. один из которых Варнсдорф - даёт решения. а второй затыкается на разросшимся дереве (вариантов очень много) Меня заинтриговал mayton , он полагает, что возможно решить задачу при помощи многопоточности. у меня так не получается. особенности алгоритма я и хотел обсудить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 08:19 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81он полагает, что возможно решить задачу при помощи многопоточности. у меня так не получается. особенности алгоритма я и хотел обсудить. Если стоит цель "распараллелить" то я вижу два рпшения: 1. Только в 4 потока. Начинаем с поля Е1 (начинать можно с любого). И запускаем 4 потока, в первом первый ход на C2, во втором- на D3, потом не F3 и G2. Потом надо подчистить симметричные потоки. 2. Говорим "а фигли там", делаем таску "начать с поля A1 и первых ход на C2" и каждый ход создаёт новую таску на все допустимые ходы и пихает их в тредпул. Это если ход есть. Если нет- либо записывает путь, либо (нет решения) просто завершает задачу. A1->C2 чтобы потом бубли (обратные решения) не удалять. 3. В 5 потоков . Каждый начинает с A1->C2 а далее 5 возможных ходов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 08:52 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
вы пишите , что видите 2 решения , но у вас 3 пункта. это как мне понимать ? Alexey Tomin1. Только в 4 потока. Начинаем с поля Е1 (начинать можно с любого). И запускаем 4 потока, в первом первый ход на C2, во втором- на D3, потом не F3 и G2. Потом надо подчистить симметричные потоки. что значит считаем симметричные потоки ? Alexey Tomin2. Говорим "а фигли там", делаем таску "начать с поля A1 и первых ход на C2" и каждый ход создаёт новую таску на все допустимые ходы и пихает их в тредпул. Это если ход есть. Если нет- либо записывает путь, либо (нет решения) просто завершает задачу. A1->C2 чтобы потом бубли (обратные решения) не удалять. объясните, что значит "таск" ??? каким образом вы выбираете какой ход сделать во всех способах ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 09:07 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81Alexey Tomin, ой да не смешите. в ПТУ меня не примут. старый я уже. не надо за меня ничего делать. задача уже как 3 недели мною решена , причем 2-мя методами. один из которых Варнсдорф - даёт решения. а второй затыкается на разросшимся дереве (вариантов очень много). КМК Варнсдорф играет на том что доска 8x8 - маленькая и его правило срабатывает часто за счет границ доски. Если мы возьмем доску 100х100 к примеру то мне кажется в таком случае разница между поиском в глубину и Варнсдорфом не будет такая очевидная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 09:42 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonandron81Alexey Tomin, ой да не смешите. в ПТУ меня не примут. старый я уже. не надо за меня ничего делать. задача уже как 3 недели мною решена , причем 2-мя методами. один из которых Варнсдорф - даёт решения. а второй затыкается на разросшимся дереве (вариантов очень много). КМК Варнсдорф играет на том что доска 8x8 - маленькая и его правило срабатывает часто за счет границ доски. Если мы возьмем доску 100х100 к примеру то мне кажется в таком случае разница между поиском в глубину и Варнсдорфом не будет такая очевидная. он для доски 40x40 по-моему отрабатывает (и довольно быстро) , дальше затыкается. но дело даже только в этом. Забудьте про Варнсдорф. Интересен поиск в глубину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 09:45 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81maytonпропущено... КМК Варнсдорф играет на том что доска 8x8 - маленькая и его правило срабатывает часто за счет границ доски. Если мы возьмем доску 100х100 к примеру то мне кажется в таком случае разница между поиском в глубину и Варнсдорфом не будет такая очевидная. он для доски 40x40 по-моему отрабатывает (и довольно быстро) , дальше затыкается. но дело даже только в этом. Забудьте про Варнсдорф. Интересен поиск в глубину. Что значит - затыкается? Это не инженерный термин. Скорее всего метод работает. Просто долго не выдает результата. А почему долго не выдаёт? Вот это вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 09:49 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81вы пишите , что видите 2 решения , но у вас 3 пункта. это как мне понимать ? Третье в последний момент придумал. andron81что значит считаем симметричные потоки ? Правильно "симметричные решения". Т.е. если одно боратно второму- то я ыб посчитал их одним решением. Хотя как хочется. Alexey Tomin2. Говорим "а фигли там", делаем таску "начать с поля A1 и первых ход на C2" и каждый ход создаёт новую таску на все допустимые ходы и пихает их в тредпул. Это если ход есть. Если нет- либо записывает путь, либо (нет решения) просто завершает задачу. A1->C2 чтобы потом бубли (обратные решения) не удалять. объясните, что значит "таск" ??? [/quote] Это Runnable, который передаётся в Executor.execute() andron81каким образом вы выбираете какой ход сделать во всех способах ? Текущее поле - i,j Перебираем все 8 доступных новых поля, отсекаем те, что за доской и те, что уже были (каждой таске надо передать, к примеру, массив уже пройденых полей). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 09:50 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Alexey TominПравильно "симметричные решения". Т.е. если одно боратно второму- то я ыб посчитал их одним решением. Хотя как хочется. Да. Все верно. В задаче Эйлера о ферзях тоже было условие что расстановки зеркальные друг относительно друга а также развороты на 90 градусов считаются одинаковым решением. И хотя в случае коня у нас есть начало и конец пути я все равно-бы рассматривал такие пути безотносительно к порядку и просто как маршруты в общей базе уникальных маршрутов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 09:58 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
наверно разница между обычным в глубину алгоритмом и методом Варнсдорфом на больших полях пропадает. но нет надобности такие большие поля юзать. задача стоит 8x8 - алгоритмом в глубину. всё ! вот человек правда на плюсах делает с графической иллюстрацией , на доске начиная со стороной 60 не выходит у него. посмотреть можно примерно с 7:03. [youtube= ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 10:00 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Alexey TominТретье в последний момент придумал. понял. Alexey TominПравильно "симметричные решения". тогда понятно. да черт уже с ним, пусть даже это будут кое-где не уникальные решения в разных потоках. пусть они даже где-нибудь повторятся повторятся . не говоря уже о симметрии. Alexey TominТекущее поле - i,j Перебираем все 8 доступных новых поля, отсекаем те, что за доской и те, что уже были (каждой таске надо передать, к примеру, массив уже пройденых полей). так я и делал. в этом случае для некоторых начальных точек дерево разрастается так, что даже для доски 8x8 и пол. дня для нормального компа не хватает чтобы выдать хоть одно решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 10:14 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81 Alexey TominТекущее поле - i,j Перебираем все 8 доступных новых поля, отсекаем те, что за доской и те, что уже были (каждой таске надо передать, к примеру, массив уже пройденых полей). так я и делал. в этом случае для некоторых начальных точек дерево разрастается так, что даже для доски 8x8 и пол. дня для нормального компа не хватает чтобы выдать хоть одно решение. стоп. соврал. проверять в разных потоках я не проверял. я каждый раз из 8 ходов выбирал ход случайным образом и если он свободен - делал ход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 10:40 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81, вообще меня вот настораживает , что мой обычный однопоточный алгоритм поиска в глубину (без Варнсдорфа) не находит решений даже минут за 5 с начальной клетки 1:2 , с клетки 5:5. Причем на находит и продолжает думать. хотя вот с клетки 1:1 находит. может где - то всё же логика моего алгоритма даёт дурака. я вижу 2 всё же варианта разобраться : 1. можно попробовать протоколировать как выражались весь флуд в файл; 2. попробовать как мужик на ютьюбе рисовать на шахматной доске траектории хода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 15:01 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81andron81, вообще меня вот настораживает , что мой обычный однопоточный алгоритм поиска в глубину (без Варнсдорфа) не находит решений даже минут за 5 с начальной клетки 1:2 , с клетки 5:5. даже за 15 минут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2016, 15:07 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81andron81andron81, вообще меня вот настораживает , что мой обычный однопоточный алгоритм поиска в глубину (без Варнсдорфа) не находит решений даже минут за 5 с начальной клетки 1:2 , с клетки 5:5. даже за 15 минут Можно вопросец? В предыдушей ветке была формулировка задачи: Требуется реализовать задачу обхода шахматного коня всей шахматной доски 8x8 из клетки (i,j) так, чтобы в каждой клетке он побывал ровно по одному разу . Способ реализации мультипоточный (4 - потока = const) алгоритм методом обхода в глубину . Исходные данные: 4 потока(константа) - задано жестко в программе. M - минимальное число маршрутов коня которые нужно найти. i,j - стартовая точка. M,i,j - задаются в виде аргументов командной строки. Так как конь должен побывать в каждой клетке доски и ровно один то это задача обхода дерева 64 слоя (количество ходов равно количеству клеток). Решений может быть больше одного но мы сосредоточимся на поиске первого решения, значит потребуется а) Описание дерева и текушее состояние пути обхода в) задание для обходчиков в отд потоках (для начала в одном потоке) На каждом шаге конь имеет максимум 7 (кроме первого хода) вариантов хода (нельзя возвращаться в предыдущую клетку). На первом шаге может быть 8 вариантов. Итого получаем дерево ходов 64 слоя, по 7 вариантов в каждом ноде, полный перебор всех вариантов составит 7 в 64 степени или 1.2197605e+54. При переборе 1млн вариантов в секунду количество секунд все равно неприлично большое. 4 или 400 потоков здесь не будут иметь решающего значения по сравнению с 1м. Вопрос: точно требуется чтобы конь побывал в каждой клетке доски ровно один раз? Или требуется чтобы он на свои предыдущие ходы не попадал с заданым количеством шагов (меньше чем 64)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2016, 15:06 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
uid uniqueВопрос: точно требуется чтобы конь побывал в каждой клетке доски ровно один раз? Или требуется чтобы он на свои предыдущие ходы не попадал с заданым количеством шагов (меньше чем 64)? да. в каждой клетке один раз. это классическая задача . uid uniqueНа каждом шаге конь имеет максимум 7 (кроме первого хода) вариантов хода почему 7 ? от 8 и меньше ! uid uniqueИтого получаем дерево ходов 64 слоя, по 7 вариантов в каждом ноде, полный перебор всех вариантов составит 7 в 64 степени или 1.2197605e+54. При переборе 1млн вариантов в секунду количество секунд все равно неприлично большое. 4 или 400 потоков здесь не будут иметь решающего значения по сравнению с 1м. люди говорят писали программы кот. находили решения за 5-10 мин. при помощи потоков не прибегая к помощи Варнсдорфа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2016, 16:17 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
[quot andron81] почему 7 ? от 8 и меньше ! 8 только в первом ходу может быть, ведь в каждой точке можно только один раз поставить коня, значит на предыдущую клетку возвращаться нельзя, те максимум 7 вариантов. andron81люди говорят писали программы кот. находили решения за 5-10 мин. при помощи потоков не прибегая к помощи Варнсдорфа Вариантов конечно будет меньше, это верхняя оценка 7 в 64, но в любом случае перебором решать не стоит, число будет большим. Глянул в сети, оценка 4*10^51. Это много в любом случае, вариант перебора тупиковый. Кроме Вансдорфа, на вики нашел решение с нейронной сетью и бэттрейсинг вариант для доски 8х8. Начальные условия только нужно пробросить. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2016, 20:50 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Хм... Не поверишь но я вчера то же решение нагуглил. По наделал столько изменений - теперь не корректно работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2016, 20:59 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
[quot uid unique]andron81почему 7 ? от 8 и меньше ! 8 только в первом ходу может быть, ведь в каждой точке можно только один раз поставить коня, значит на предыдущую клетку возвращаться нельзя, те максимум 7 вариантов. пропущено... Вариантов конечно будет меньше, это верхняя оценка 7 в 64, но в любом случае перебором решать не стоит, число будет большим. Глянул в сети, оценка 4*10^51. Это много в любом случае, вариант перебора тупиковый. Кроме Вансдорфа, на вики нашел решение с нейронной сетью и бэттрейсинг вариант для доски 8х8. Начальные условия только нужно пробросить. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. с точки 0,0 (1,1) и у меня находит обычный обход доски неплохо обычным перебором. а вот с точки 1,0 и этот алгоритм уходит в думы? короче говоря без Вансдорфа видимо не обойтись. и потоки никакие не помогут... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2016, 22:04 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81, и наш алгоритм это Backtracking . поиск с возвратом. просто иная реализация. правда тут проще для восприятия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2016, 22:10 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81andron81, и наш алгоритм это Backtracking . поиск с возвратом. просто иная реализация. правда тут проще для восприятия. То что я притащил в поиске, какой то злобно рекурсивный алгоритм, недалеко от brutal force ушел, тот же самый обход в лоб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2016, 23:03 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
[quot andron81]uid uniqueпропущено... с точки 0,0 (1,1) и у меня находит обычный обход доски неплохо обычным перебором. а вот с точки 1,0 и этот алгоритм уходит в думы? короче говоря без Вансдорфа видимо не обойтись. и потоки никакие не помогут... Для рекурсии - это нормальное поведение. Свернул не в тот поворот - и дальше - семейство тупиков у которых path меньше чем 64 - вот поэтому и долго работает. А тренироваться на потоках на самом деле как раз удобно на таких алгоритмах. С год назад мы "тренировались" на рисовании зеркальных шаров.... вот это эпично. По поводу поиска в глубину. Я хотел проверить свои гипотезы. 1) Кластерный конь. Разбить доску на комнаты и определить жесткий порядок их обхода. Например для доски 5х5 простой поиск находит решение быстро. Но мне нужно гарантировать точки входа и выхода коня в строго нужной координате. Если нет - то попробовать 6х6. После этого любые доски хоть 600х600 будут иметь решение за почти констатное время. Для этого Варндсдорф не нужен. Тоесть может и нужен но он был-бы усложнением простой концепции. 2) Конь в лабиринте. Проверить возможно-ли обойти конём произольную форму доски (не прямоугольные границы). 3) Конь-волновой. Проверить может-ли конь заливать пространство волной как в алгортме Мура. (по сабжу я знаю что не может т.к. конь не ходит как ферзь или король но достигнуть локальной близости) можно - попробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 09:46 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Такая гипотеза. В википедии написано, что существует 13 267 364 410 532 замкнутых и 19 591 828 170 979 904 незамкнутых решений данной задачи. Очевидно, что существует путь, начинающийся из любой выбранной точки - подойдет любое замкнутое решение. Но, возможно, для некоторых точек путь, который в них начинается, должен обязательно быть замкнутым (это и есть гипотеза). В этом случае поиск из такой точки будет в среднем в 1400 раз дольше. Это объясняет, почему у ТС из некоторых точек пути не находятся за разумное время, без применения некоторых оптимизирующих стратегий. Ну и хотелось бы повозмущаться очередным копипастом в количестве 8 штук Код: java 1. 2. 3. 4. 5. Одни и те же действия с разными данными. Так и напрашивается массив с данными и итерация по нему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 09:48 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
По поводу Варндсдорфа. Наверное все уже прочилали вики. Так вот. Там есть рисунок с ajcacency. Если-б я реализовывал Варнсдорфа - то попробовал бы не расчитывать смежность а фиксировать при "установке" коня или "снятии" (на обратном ходе). Также есть мысль что для сегмента доски (2,2) - (n-2,n-2) возможно свести работу с координатами к работе со смещениями в адресном пространстве. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 09:59 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonПо поводу Варндсдорфа. Наверное все уже прочилали вики. Так вот. Там есть рисунок с ajcacency. Если-б я реализовывал Варнсдорфа - то попробовал бы не расчитывать смежность а фиксировать при "установке" коня или "снятии" (на обратном ходе). Также есть мысль что для сегмента доски (2,2) - (n-2,n-2) возможно свести работу с координатами к работе со смещениями в адресном пространстве. не надо по поводу Вандерсофа с ним всё ясно, он работает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 10:03 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81не надо по поводу Вандерсофа с ним всё ясно, он работает... Ты суть моего месседжа понял? О чем я вообще хотел сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 10:19 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonandron81не надо по поводу Вандерсофа с ним всё ясно, он работает... Ты суть моего месседжа понял? О чем я вообще хотел сказать. нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 12:37 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Ладно. Я имел в виду не реализацию самого Варнсдорфа. Бох с ним. Я считаю что ты его уже реализовал. Я говорю о его дальнейшей оптимизации. Или о факте самой возможности. Если я не прав - что-ж. Буду неправ. Но в графовых задачах (а это - типичная задача на поиск в графах) любая оптимизация основана на том что мы икапсулируем в рёбра или вершины графа некую свою индексную информацию при этом мы превносим некое вычислительное o(1) в сложность нашей формулы ... (а это говоря простым языком - ништяк) но получаем взамен некие дополнительные поисковые возможности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 21:09 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Ну вот в этой статье идея кластерного развита до обобщения в "Разделяй и властвуй". http://larc.unt.edu/ian/pubs/algoknight.pdf Хм... ну а на что я надеялся. Теорию обгрызли со всех сторон толпа математиков. Остался пустяк. Имплементировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 21:55 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonЯ говорю о его дальнейшей оптимизации. Или о факте самой возможности. Можно сделать заготовки для обхода небольших по размеру досок и их комбинаций. статья из науки и жизнь про подобное решение в досках ступенчатых квадратах https://www.nkj.ru/archive/articles/11578/ Конь всегда ходит между клетками разного цвета; если представить себе отображение геометрии ходов коня в пешку в другой геометрии, то возможно это будет пешка на 4х мерной доске (8 вариантов хода, соседние клетки другого цвета). Доска будет 4х мерной (пространство ходов), конь пешкой. Интересно будет ли проще найти решение в 4х мерных шахматах с пешкой чем с конем в 2х мерных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 22:11 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
mayton http://larc.unt.edu/ian/pubs/algoknight.pdf классная инфа . судя по всему идёт речь о разбиении на более мелкие подполя (разделяй и властвуй) я думал над этим . надо попробовать найти решения для доски 4x8 для начала. интересно есть такие ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 22:34 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
uid uniqueКонь всегда ходит между клетками разного цвета; если представить себе отображение геометрии ходов коня в пешку в другой геометрии, то возможно это будет пешка на 4х мерной доске (8 вариантов хода, соседние клетки другого цвета). Доска будет 4х мерной (пространство ходов), конь пешкой. Интересно будет ли проще найти решение в 4х мерных шахматах с пешкой чем с конем в 2х мерных? Много-мерность в данной (прикладной) задаче не имеет никакого влияния на результат. Это задача на маршруты в неориентированном графе. В теории. Как мы его представим - в виде декартовых координат на плоскости или в гиперкубе - не имеет значения. Разумеется мы можем графически их презнтовать так как нам удобно видеть. На клеточной доске. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2016, 23:00 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
uid unique, вот тоже самое решение я слегка переделал. Changes: Снял ограничения на квадратность доски. Теперь можно делать прямоугольники. Добавил некую детерминированную шумящую функцию. Траектория коня будет зависеть от параметра randomSeed. В чем у меня был баг? Проглядел что константа 0 используется как пометка пустой клетки. И у меня первый step с уровнем 0 в рекурсии создал мне некие мелкие трудности. TODO: desk[][] надо еще заменить на одномерный массив и где-то сбоку добавить базу готовых маршрутов с проверками на уникальность и зеркальные отражения и развороты на 90 градусов. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. Stdout: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 01:16 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonuid unique, вот тоже самое решение я слегка переделал. Changes: Снял ограничения на квадратность доски. Теперь можно делать прямоугольники. Добавил некую детерминированную шумящую функцию. Траектория коня будет зависеть от параметра randomSeed. В чем у меня был баг? Проглядел что константа 0 используется как пометка пустой клетки. И у меня первый step с уровнем 0 в рекурсии создал мне некие мелкие трудности. TODO: desk[][] надо еще заменить на одномерный массив и где-то сбоку добавить базу готовых маршрутов с проверками на уникальность и зеркальные отражения и развороты на 90 градусов. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. Stdout: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. ай, вот не в ту стороную вы. реализация может и отлична от моей , но вот решения для 8x8 , со старта 0,0 у меня терпения дождаться не выходит. Вы бы лучше бы наривали как в потоках это всё бы выглядело , раз не лень писать код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 10:05 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81Вы бы лучше бы наривали как в потоках это всё бы выглядело , раз не лень писать код. В этой реализации простая рекурсия, если смысл в потоках? в потоках будете шарить доску int[][] desk; вот этот код можете запустить в 8 потоках вместо цикла но в лоб с этой рекурсией хорошо не получится Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Нужно сделать более мелкие задания для потоков с примерно одинаковым временем выполнения и разделить код на management (управляющая логика, обходчик) и worker (исполнители в потоках). Исполнители возвращают результат работы и контекст их задания (переменные состояния), затем делается новое задание и отдается в свободный поток (в пул). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 11:43 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81ай, вот не в ту стороную вы. реализация может и отлична от моей , но вот решения для 8x8 , со старта 0,0 у меня терпения дождаться не выходит. Вы бы лучше бы наривали как в потоках это всё бы выглядело , раз не лень писать код. Давай порассуждаем. Если стоит задача быстро найти 1-е решение то Варнсдорф рулит. А если нужно найти все решения? Будет ли он столь-же эффективен как и Deep-First-Search (DFS) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 11:44 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
uid unique в потоках будете шарить доску int[][] desk; вот этот код можете запустить в 8 потоках вместо цикла но в лоб с этой рекурсией хорошо не получится Ууид! Ну это фейспалм какой-то. Я-же говорю. Не надо шарить доску! Вообще ни разу не надо! Каждому потоку - дана своя доска! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 11:46 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
mayton Deep-First-Search (DFS) ? что значит first в этом словосочетании ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 11:49 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
DFS это один из вариантов англоязычного названия метода. Ему противостоит Breadth-first search. Типа поиск в ширину. Но в данном переводе насколько я понимаю first означает "в первую очередь". Тоесть в первую очередь исследовать глубину. А альтернативный алгоритм - делает акцент на ширину. Например заливка краской пикселей - это обычно поиск в ширину. Сорян за мой английский. Где-то я мог и ошибаться в нюансах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 11:54 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
mayton, понятно . DFS короче это поиск в глубину . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 11:56 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
mayton Давай порассуждаем. Если стоит задача быстро найти 1-е решение то Варнсдорф рулит. А если нужно найти все решения? Будет ли он столь-же эффективен как и Deep-First-Search (DFS) ? Сомневаюсь в вашей гипотезе . как я понимаю , Варнсдорф в худшем случае (для очень больших шахматных досок) превращается в обычный поиск в глубину хоть ветки и берутся не последовательно и не рандомно, а по правилу наименьшего исхода из них (веток). мы же в случае тупика вернёмся и просто выкидываем из рассмотрения тупиковую ветку и возьмем опять наименьшую . (я так делал) мне кажется , что Варнсдорф это просто подсказка к глубинному методу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 12:09 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81Сомневаюсь в вашей гипотезе . как я понимаю , Варнсдорф в худшем случае (для очень больших шахматных досок) превращается в обычный поиск в глубину хоть ветки и берутся не последовательно и не рандомно, а по правилу наименьшего исхода из них (веток). мы же в случае тупика вернёмся и просто выкидываем из рассмотрения тупиковую ветку и возьмем опять наименьшую . (я так делал) мне кажется , что Варнсдорф это просто подсказка к глубинному методу Да. Но Варнсдорф за это платит свою цену. Он обозревает узлы еще на шаг вперед а для простого получения ВСЕХ решений это избыточные расчеты. Впрочем я не настаиваю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 12:13 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
mayton Не надо шарить доску! Вообще ни разу не надо! Каждому потоку - дана своя доска! Если у каждого потока своя доска то либо у каждого потока свой алгоритм (обход) не пересекающийся с другими потоками либо обмен данными (какими?). Потоки обходят одну доску, это общий ресурс, как делается разделение ресурса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 16:41 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Еще раз читаем внимательно условие. Требуется реализовать задачу обхода шахматного коня всей шахматной доски 8x8 из клетки (i,j) так, чтобы в каждой клетке он(конь) побывал ровно по одному разу. Способ реализации мультипоточный 4 - потока = const (можно и больше, не принципиально, лишь бы найти решение(я)). алгоритм - методом обхода в глубину . Исходные данные: 4 (или более) потока(константа) - задано жестко в программе. M - минимальное число маршрутов коня которые нужно найти. i,j - стартовая точка. M,i,j - задаются в виде аргументов командной строки. Я беру на себя смелость добавить еще одно дополнение к условию. На основании того как я понял дизайн вывода результата. Маршруты коня должны быть уникальны. Маршруты которые являются зеркальными отражениями друг друга или копиями с разворотом доски в 90 градусов также считаются дублями. Их выдавать в ответ не нужно. Далее я рассуждаю. У нас - идеальная задача для параллелизма. Каждый поток получает задачу - стартовую точку. И фактически коллизия потоков возникает только в самом конце (когда идет проверка что маршрут является дублем) и это и будет точка конкуренции. Я предполагаю что она будет занимать менее 1% общего времени выполнения работы приложения и это не оказывает влияния на время поиска M маршрутов. Шарить доски нет никакого смысла т.к. они являются ГОРЯЧИМ ресурсом и постоянно находятся под нагрузкой. Любая попытка их росшарить приведет к провальному понижению КПД работы потоков. Впрочем последнее - это моё эвристическое предположение и вы можете его проверить и опровергнуть. Всё также будет зависеть от реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 16:52 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
uid uniqueЕсли у каждого потока своя доска то либо у каждого потока свой алгоритм (обход) да . я предполагал и делал так : у них просто рандомно выбираются ветки. может где-то и пересекутся разок, но дальше вряд ли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 16:54 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
andron81uid uniqueЕсли у каждого потока своя доска то либо у каждого потока свой алгоритм (обход) да . я предполагал и делал так : у них просто рандомно выбираются ветки. может где-то и пересекутся разок, но дальше вряд ли... условие невнимательно посмотрел, спасибо, оказывается задача проще чем казалось - нужно 4 различных решения а не одно ускорить в 4х потоках. У меня мысль свернула на ускорение поиска одного решения, доска тогда шарится, задачи для потоков нужно нарезать по хитрому, не слишком маленькие или большие. Вместо рандомного индекса можно сделать сдвиг и направление обхода массива шагов в зависимости от индекса потока, они пойдут по разным маршрутам и это намного быстрее рандома. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 20:53 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
DFS в 4 потока. Как-то так вобщем. По поводу executorService. Я не уверен что 100% корректно его использую. Редко юзал. Возможно там есть нюансы с очередью и финализацией. Вобщем как-то так. По поводу недостатков Варнсдорфа. Они все такие есть. Но воспроизводятся на больших M. Чуть позже я попробую обосновать. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 21:34 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
По поводу 8х8. DFS - тормоз ясен пень. На данной конкретной постановке когда мы хотим очень быстро получить 1-й солюшен и отвалить. Но Варнсдорф мне почему-то напомнил старый добрый алгоритм мыши в лабиринте которая бегает касаясь левой (или правой ) стены и постоянно сворачивает в одну сторону. Вобщем у этого метода есть недостатки. В частности если посмотреть на блуждания лошади с на большом поле (порядка 130 на 130) с высоты птичьего полета то можно видеть что конь ходит подобно этой мыши которую я описал. Тоесть прижимается к своей собственной тропинке которую уже проходил. Я считаю это если не фейком то просто увеличением энтропии самого маршрута. А именно - маршрут предстказуем и ограничен. Что будет после того как все "мышиные" маршруты закончятся и начнётся хардкор, по которому ходит "честный DFS" - я не знаю. Скорее всего правило Варнсдорфа будет реже выдавать результаты именно в силу того что наиболее популярный мышиные уже исследованы. А реже - имеено по причине наличия эвристики. По сабжу тот DFS что я скопи-пастил и переделал тоже имеет недостатки. В частности мне очень не нравится что он каждый раз начинает маршрут заново. Хотелось-бы идти от изменений существующего. Но это уже без Random. А как-то по другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 21:45 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
mayton Хотелось-бы идти от изменений существующего. Но это уже без Random. А как-то по другому. Можно сворачивать в сторону где меньше натоптано (и наоборот). Деление доски на части и обход частей уже смотрели https://pdfs.semanticscholar.org/927e/dbaa256301f500e8b3fcd52eaa6f0cc2c768.pdf ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 00:31 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
uid uniquemayton Хотелось-бы идти от изменений существующего. Но это уже без Random. А как-то по другому. Можно сворачивать в сторону где меньше натоптано (и наоборот). Деление доски на части и обход частей уже смотрели https://pdfs.semanticscholar.org/927e/dbaa256301f500e8b3fcd52eaa6f0cc2c768.pdf Что значит - "можно" ? Я и сам знаю что можно. Предложите ваш код. Деление смотрел. Если мы решили задачу обхода 5х5 и при этом (!) гарантируем что для любого блока 5x5 можем заставить коня войти и выйти в нужную дверь (вход-выход) то задача обхода 130 на 130 уже решена за o(n). Но мне решать такие задачи не очень-то интересно. Формально доказать что вход-выход в 5х5 существует. Или 5х10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 01:03 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Да. Я не весь сорс опубликовал. Есть еще мелкая либа. Более полный вариант проекта здесь https://sourceforge.net/p/chess-experiments/code/HEAD/tree/trunk/mayton/knight-tour/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 01:09 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonЧто значит - "можно" ? Я и сам знаю что можно. Предложите ваш код. Только когда уйду в отпуск ;-) стараюсь хотя бы на выходных код не писать а в прошлые выходные работал. так что пока спрыгиваю с темы но буду подумывать на досуге, может что и придет в голову. Если ускорять бэкрейсинг то можно использовать просчитанные матрицы ходов к примеру для досок 5х5 (их около 2 тыс) и проверять текущую позицию через поиск подходящей матриц(ы) 5х5 (или меньшей в зависимости от позиции), здесь бы отлично подошла CAM память (проверка за один такт всех матриц 5х5). Ускорили бы бэктрейсинг примерно в 50 тыс раз (25 х 2000). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 11:34 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
uid uniqueТолько когда уйду в отпуск ;-) стараюсь хотя бы на выходных код не писать а в прошлые выходные работал. так что пока спрыгиваю с темы но буду подумывать на досуге, может что и придет в голову. Да ради бога. Я никуда не тороплю. Если ускорять бэкрейсинг то можно использовать просчитанные матрицы ходов к примеру для досок 5х5 (их около 2 тыс) и проверять текущую позицию через поиск подходящей матриц(ы) 5х5 (или меньшей в зависимости от позиции), здесь бы отлично подошла CAM память (проверка за один такт всех матриц 5х5). Ускорили бы бэктрейсинг примерно в 50 тыс раз (25 х 2000). Чо? Какая такая CAM-память? Ассоциативная? Не понял зачем это надо. Когда у нас есть бесконечное разнообразие hashtable/hashmap. И узкое место в - рекурсии а имеенно в движении коня по 8 направлениям а вовсе не в маппингах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 12:13 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Немножко переделал параметры. Не нравятся константы вбитые в код. Особенно в части 4 threads. Теперь так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 13:18 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Не знаю как насчет эффективности, а утилизацию обеспечивает. Вот так картинка выглядит с точки зрения JVisualVM при THREADS=5 (На моем ноуте - оптимально 5 threads). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 13:23 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
По поводу моей идеи кластерного коня, которая впрочем обсуждалась в литературе. Экспериментально я нашел что минимальная доска на которую можно покрыть конем это 4х5 или 5х4. Осталось еще доказать что всегда сущесвуют маршруты с нужной точкой входа и выхода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 14:13 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonПо поводу моей идеи кластерного коня, которая впрочем обсуждалась в литературе. Экспериментально я нашел что минимальная доска на которую можно покрыть конем это 4х5 или 5х4. Осталось еще доказать что всегда сущесвуют маршруты с нужной точкой входа и выхода. Это алгоритм Конрада http://mathworld.wolfram.com/KnightGraph.html Conrad et al. (1994) discovered another linear time algorithm and proved that it solves the Hamiltonian path problem for all n>=5. The Conrad et al. algorithm works by decomposition of the chessboard into smaller chessboards (not necessarily square) for which explicit solutions are known. This algorithm is rather complicated because it has to deal with many special cases, but has been implemented in the Wolfram Language by A. Roth. Example tours are illustrated above for n×n boards with n=5 to 8. По поводу CAM памяти идея была в использовании при сравнении части доски с просчитанными матрицами за один такт и нахождении пересечений деревьев (маршрутов). Сразу накладывать ходы на глубину в 2-3 шага в виде штампа (без самопересечений) и обрабатывать только те которые не имеют пересечений с доской (листьев будет не так много, больше 8 но и не тысячи). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 16:53 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Конрад пошел еще дальше чем Варнсдорф. По сути задача решается выкладыванием мозаики из готовых шаблонов. Но все эти алгоритмы играют на строго прямоугольных досках. Что будет если им подать на вход доску с отверстием. Или доску неправильной формы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 20:23 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonКонрад пошел еще дальше чем Варнсдорф. По сути задача решается выкладыванием мозаики из готовых шаблонов. Но все эти алгоритмы играют на строго прямоугольных досках. Что будет если им подать на вход доску с отверстием. Или доску неправильной формы. Да, это очень ограниченые методики, полных решений для доски 8х8 неизвестное количество, есть только грубая оценка. На ночь глядя склепал небольшой пример (не компилировал) для пояснения как можно использовать САМ с кешем для бэкрейсинга или рекурсивного обхода доски. Используются заранее расчитанные варианты шагов фиксированной глубины (положим 4, получается не такое большое количество вариантов максимум 8 * 7 * 7 * 7 = 2744 и дерево с 16 уровнями вместо 63. 1. Хранятся в бинарном виде позиции для каждого возможного пути глубиной N из заданой точки на доске (64 bit, long value) 2. По бинарному пути точек хранится траектория движения. 3. Вместо последовательного сравнения можно использовать CAM память и получить за 1 такт выборку возможных путей. Для глубины в 8 шагов экономия будет существенной (6.5 млн раз) a а размер кеша терпимым (420МБ для бинарного массива и 2 3 гига для объектов, можно уменьшить). С САМ возможно ускорение примерно на 6 порядков. Завтра вставать в 5, ушел... Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 22:36 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
uid unique, ничо непонятно. Где entry-point? Как это использовать? Хотя-б модульный тест был-бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2016, 00:30 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonuid unique, ничо непонятно. Где entry-point? Как это использовать? Хотя-б модульный тест был-бы. Пардон, это всего лишь иллюстрация использования САМ и кеша заранее рассчитанных ходов из любой позиции на доске. Даже без ассоциативной памяти с кешем бэкрейс будет работать шустрее. Написано грубовато, на ночь глядя, без проверок. Entry point: public List<List<Position>> getPrecalculatedPaths(int xPos, int yPos, int[][] board) Метод thread safe, доступ только на чтение из потоков. даете массив позиций на доске (0 ячейка свободна, 1 занята) и получаете коллекцию ходов коня на 4 шага вперед не конфликтующую с позициями на доске.Можете использовать тот же бэктрейсинг но не с 64 уровнями а с 16. В бэктрейс несколько потоков молотят один и тот же цикл проверки ходов коня для каждой ячейки на доске, одинаковая работа делается несколько раз, сравнение тоже в цикле идет. В кеше хранятся позиции коня для ходов на глубину в 4 шага (можно менять глубину) и сравнение делается по бинарным полям в long массива позиций фигур на доске в биты в long (как в массиве). Так как упаковка позиций в 64 бита переменную то макс площадь доски не более 64 позиций. А вот если бы была САМ память то вместо цикла получили бы выполнение сравнения за один такт. Здесь даже не true CAM подошла бы а гибридный вариант с сегментами обычной памяти (примерно как хэшмапа в Java устроена сначала быстрый поиск по хэш коду а потом в листе). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 11:22 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
uid uniqueА вот если бы была САМ память то вместо цикла получили бы выполнение сравнения за один такт. Здесь даже не true CAM подошла бы а гибридный вариант с сегментами обычной памяти (примерно как хэшмапа в Java устроена сначала быстрый поиск по хэш коду а потом в листе). Облизываюсь на продукцию вот этой конторы давненько уже (лет 10) https://www.opalkelly.com/products/ Может все таки возьму эту плату или подобную в хозяйство https://www.opalkelly.com/products/xem7360/ стряхну пыль с книжек по Verilog и VHDL (лежат на полочке уже давно), скачаю новые версии IDE и тогда можно будет поизвращаться с шахматными задачками и специализированными ускорителями. Типовая бизнес Java действует на меня отупляюще, перестал думал, скоро буду мычать как Маугли ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 11:45 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Докину дровишек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2016, 00:39 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
uid uniqueПардон, это всего лишь иллюстрация использования САМ и кеша заранее рассчитанных ходов из любой позиции на доске. Даже без ассоциативной памяти с кешем бэкрейс будет работать шустрее. Написано грубовато, на ночь глядя, без проверок. Entry point: public List<List<Position>> getPrecalculatedPaths(int xPos, int yPos, int[][] board) Метод thread safe, доступ только на чтение из потоков. даете массив позиций на доске (0 ячейка свободна, 1 занята) и получаете коллекцию ходов коня на 4 шага вперед не конфликтующую с позициями на доске.Можете использовать тот же бэктрейсинг но не с 64 уровнями а с 16. В бэктрейс несколько потоков молотят один и тот же цикл проверки ходов коня для каждой ячейки на доске, одинаковая работа делается несколько раз, сравнение тоже в цикле идет. В кеше хранятся позиции коня для ходов на глубину в 4 шага (можно менять глубину) и сравнение делается по бинарным полям в long массива позиций фигур на доске в биты в long (как в массиве). Так как упаковка позиций в 64 бита переменную то макс площадь доски не более 64 позиций. А вот если бы была САМ память то вместо цикла получили бы выполнение сравнения за один такт. Здесь даже не true CAM подошла бы а гибридный вариант с сегментами обычной памяти (примерно как хэшмапа в Java устроена сначала быстрый поиск по хэш коду а потом в листе). Я тут пожалуй хочу услышать каменты коллег. Я мало чего понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2016, 00:44 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonЯ тут пожалуй хочу услышать каменты коллег. Я мало чего понял. Мэйтон, с Новым Годом! У меня все болеют вокруг, один я еще пока держусь (как в фильмах про зомби), открыл бутылочку Камю, хряпнул соточку неторопясь закусывая вкусной конфеткой... хороший коньячок в ЦУМе продают, не ожидал. Хорошо москвичи живут, в провинции такой коньяк найти трудно. В общем о чем я - с наилучшими пожеланиями в Новом 2017 году, чтоб были идеи в голове, интересная работа, здоровья хватало и семья была в порядке (жена довольна)! Чтоб наши потребности не опережали наши возможности и было счастье и лепота на душе! PS по поводу промера кода, ну что там непонятного? наспех написанный примерчик, набросок. Вместо проверки на один шаг делается проверку сразу на 4 шага вперед (количество шагов произвольное число, зависит от доступного размера кеша), у САМ памяти преимущество в том что поиск в несортированном массиве (любого размера) делается за 1 такт. Причем поиск может идти по маске а не полному совпадению. PSS Когда эта память станет массовой она перевернет устоявшиеся подходы в решении задач и многие неэффективные раньше алгоритмы получат второе дыхание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2016, 23:05 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonДокину дровишек. это ваша реализация отработала ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 20:11 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Да. Та которую я опубликовал по ссылке выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 20:13 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
друзья , напоминаю вам , что вопрос был относительно потоков. Доска 8x8 . поэтому никаких прямоугольных досок, никаких "дырок" в доске. старт осуществляем из клетки указанный пользователем. Рассуждения по поводу Варнсдорфа не интересны. Интересовал собственно вопрос возможно ли реализовать вывод хотя бы одного решения при помощи 4-х потоков или более. Да / Нет. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 20:21 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
maytonДа. нет возможности пока скачать и посмотреть а с любой точки искалос? скажем с точки 0:1 , или 0:2 у меня с них висло все ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 21:33 |
|
||
|
задача конем шахматной доски.
|
|||
|---|---|---|---|
|
#18+
Для DFS - нормально работает для размеров до 7х7. Правда нет в моей реализации команды stop после первого найденного и пока 4 потока не отработают - процесс продолжает активность. Впрочем такой задачи я себе не ставил. Для DFS я пока не дождался решения 8х8. Мне жалко мой ноутбук Core-i3. Да батарея выгорает быстро когда он под нагрузкой. Но думаю завтра-послезавтра я доделаю Варнсдорфа и тоже добавлю его в список алгоритмов как плагин. И если у меня хватит сил - UI c графиками и статистикой. Есть еще несколько мыслей. Надо попробовать доску-тор. И доску-лабиринт где будут стоять другие фигуры. Чтоб не было явного преимущества у "беготни вдоль забора". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2017, 00:11 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2123306]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
165ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
112ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 548ms |

| 0 / 0 |
