|
|
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Добрый день , друзья. Помогите дилетанту . Не могу разобраться , почему моя рекурсивная функция переполняет кучу. Тупая реализация классической задачки на обход конем доски. Я правда так и не разобрался пока как закончить её выполнение. Но это не сильно и важно. (на данный момент просто хотелось бы добиться чтобы высветилось хотя бы одно решение, пусть и с зацикливанием) Пытаюсь даже выводить грубо глубину рекурсии - она теоретически не должна превышать 64 - так и есть. Однако при длительной работе (а дерево разрастается очень стремительно) высвечивает Java heap space. Код: 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. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 12:05 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
2 ** 64 ~ 10 ** 18 Терабайт это 10 ** 12 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 12:12 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov2 ** 64 ~ 10 ** 18 Терабайт это 10 ** 12 то есть вы хотите сказать, что когда 64 процедуры вызывают последовательно друг друга , то памяти отъедается более терабайта ? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 12:50 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Я хочу сказать, что есть "рекурсия вглубь" и "рекурсия вширь". P.S. Мне лень разбираться в попытках решить методом полного перебора задачу, которую (насколько мне изменяет склероз) умные люди давно решили вручную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 12:57 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, эта именно тупо вглубь . что значит решили вручную ? )))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:06 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Ну, например, в старом журнале ("Наука и жизнь", если правильно помню) была статья, где в качестве одного из способа запоминания ходов автор придумал стихи, строчки которых были мнемониками шахматных клеток. Журнал - не младше середины-конца восьмидесятых. P.S. Насколько я помню вполне классическую "Алгоритмы + структуры данных = программы", принципиально разных решений всего двенадцать. Издание начала восьмидесятых. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:19 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Хотя, вру - у Вирта решается задача расстановки восьми ферзей. Чтобы рекурсия была вглубь требуются две вещи стратегия обхода и запоминание "границы отсечения". Когда на каждом шаге перебираются все возможные варианты это именно что рекурсия вширь. P.S. Я бы предложил разбираться с рекурсией на гораздо более простой задаче: лабиринт без циклов, где на каждом шаге можно повернуть или влево или вправо и глубина любого пути не превышает заданного (небольшого) числа шагов. Начинать с лабиринтов, которые можно нарисовать на листе школьной тетради в клеточку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:38 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, да, совершенно верно , есть у меня такая . там приведён даже шаблон перемещения по дереву с возвратом. именно им я и воспользовался. возможно различие решений только лишь в представлении данных . Но моё решение судя по всему рабочее. дерево обходится в глубину как надо. Но это всё не суть... Разбираться в моём коде я никого не прошу. просто хочу для себя разобраться почему происходит переполнение памяти. максимально в любой период времени работы программы может быть не более 64 вызова процедуры. одна процедура резервирует грубо говоря: 3 переменных int (96 байт), один массив (64 байта) переменная типа String может в последней проблема ? я толком не понимаю пока эта переменная фиксированной длины или же переменной ? почему вы насчитали, что памяти должно резервироваться более терабайта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:45 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovХотя, вру - у Вирта решается задача расстановки восьми ферзей. нет, не врете. кони тоже решаются в моем издании ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:46 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
И ещё: чтобы не путать глубину рекурсии с числом (активных) рекурсивных вызовов - сделайте статическую, которая будет увеличиваться на входе в рекурсивный метод и уменьшаться на выходе. Ну и печатайте значение этой переменной по мере надобности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:47 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovИ ещё: чтобы не путать глубину рекурсии с числом (активных) рекурсивных вызовов - сделайте статическую, которая будет увеличиваться на входе в рекурсивный метод и уменьшаться на выходе. Ну и печатайте значение этой переменной по мере надобности. так и делал . за исключением статики ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:49 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, стоп. статическую что вы имеете ввиду ? переменную или метод вызова статический ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:51 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, это вы имеете ввиду ? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. у меня переменная depth сейчас считается так же за исключением того , что объявлена она не как static. честно говоря не чувствую разницы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 13:57 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Статика непринципиальна. Просто вы считаете именно что глубину рекурсии, а считать надо число активных вызовов. Цепочка вызовов активна до тех пор пока мы или не нашли (очередное) решение или не обнаружили, что эта цепочка ходов решением не является. Когда вы осознаете, что каждый узел в цепочке вызовов порождает свою цепочку вызовов, вам станет понятнее "куда девается память". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 14:01 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, как я понимаю мой алгоритм в любой момент времени хранит только лишь текущую самую глубокую ветку и всю цепочку до неё . остальные пройденные субдеревья и не приведшие к удаче в данный момент не хранятся. Или нет ? вот на рисунке мы скажем в данный промежуток времени проделали маршрут 1->7->8->9->12. мы этот маршрут и храним. пусть даже до этого были маршруты 1->2-> 3-> 4 1->2-> 3-> 5 1->2-> 3-> 6 а так же 1->7->8->9->10->11 но они не привели к решению . ну значит мы по ним и выполнили всюду return-ы , а это значит и память по ним расчистилась. Или же нет ? а маршрут 1->7->8->9->12 это 5 вызовов. и глубина = 5. или же нет ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 14:30 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovЦепочка вызовов активна до тех пор пока мы или не нашли (очередное) решение или не обнаружили, что эта цепочка ходов решением не является. верно и это понятно. но цепочка вызовов не может превышать 64 (число ходов, а значит клеток на шахматной доске). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 14:58 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Кстати, об ограничениях ... Чтобы шестьдесят четвёртым ходом оказаться в точке (0,0), на шестьдесят третьем ходу надо быть или в точке (2,1) или в точке (1,2). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 18:17 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, блин, да нет же. задача стоит проще: просто обойти абсолютно все клетки , закрасив их. кстати, я Вам соврал. похоже, что ругается консоль . "io console updater java heap space" я наверно превысил допустимое число вывода на экран . кстати , можно ли выводить не в консоль , а в файл (Eclipse) ? гугл не помог. а "ругань" превышения допустимых вызовов рекурсивной функции выглядит иначе. достаточно накидать программу n! и поставить в качестве входного параметра скажем громадное число. там со стэком будет ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 18:32 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, P.s. стоит задача обойти все клетки конем побывав ровно по одному в каждой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2016, 18:33 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, =) помню сдавал такую курсовую два раза за обучение :) Вот пример . тут даже с графикой ) http://5fan.ru/wievjob.php?id=49236 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 16:12 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 16:53 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Atum1, спасибо , конечно, интересней самому решить, что я и сделал. для начальной точки 1,1 выдаёт решения за время меньше минуты. а вот на точке 1,2 выходит в ступор. дерево разрастается настолько , что и за 40 минут ни одного решения не выдаёт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 18:47 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Atum1 http://algolist.manual.ru/maths/combinat/knight.php хотя интересное правило Варнсдорфа описано. но я правило такого не знал. поэтому у меня тупой перебор всего дерева. поэтому видимо и долго ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 18:58 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Лет 10 назад я кодил на С++/Win32 GDI приложение для решения horse problem. Чтоб рекурсия не заходила в слишком глубокие поиски я разработал правила построения кориродов (только для прямоугольной доски) чтобы ограничить для коня следущие несколько N ходов. Для этого я выбирал ширину коридора (4 клетки) и змейкой заполнял всю доску. К сожалению сорцы потерял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 19:31 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton, мне не сильно важна оптимизация пока моего алгоритма. важен сам факт - ищет / не ищет. тем более решение кое-какие находит. А вообще я пытаюсь разобраться с рекурсией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 19:43 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Субъективно. Много лишних непонятных действий. Что это? Почему 2? Что это за магическая константа? Код: java 1. 2. Далее. System.out флудит беспощадно и блокирует скорость вычислений. Даже с заглушкой в /dev/null все равно будет обеспечет терафлоп ненужной работы которую никто не смотрит. Вобщем вынести в slf4j или JUL с уровнем trace. Результат вычислений возвращается через строковую константу. Это странно. Так обычно не делают. Есть flow где имеет смысл добавить линию else чтобы отключить избыточные расчеты. Есть повторы вычисления одного выражения которые можно зарефакторить через introduce temp variable. Очень много замечаний к codeStyle. Классы с маленькой буквы а имена переменных с dash. Это ломает зрение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 22:16 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton, большое спасибо за критику и за то, что не поленились изучить мой код ) 1) 2 это потому, что одного коня мы ставим уже в конструкторе , его координата int i_start=1;int j_start=1;. поэтому в рекурсивную функцию уже подаём 2. 2) System.out я использовал чтобы видеть, что он делает. о протоколировании по средствам slf4j даже и не догадывался. изучу . спасибо 3) Конечно же Вы правы. исправлю на boolean 4) Где вы предлагаете добавить ? 5) Поясните какие , пожалуйста. 6) Конечно, учту ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 22:42 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81mayton, большое спасибо за критику и за то, что не поленились изучить мой код ) 1) 2 это потому, что одного коня мы ставим уже в конструкторе , его координата int i_start=1;int j_start=1;. поэтому в рекурсивную функцию уже подаём 2. 2) System.out я использовал чтобы видеть, что он делает. о протоколировании по средствам slf4j даже и не догадывался. изучу . спасибо 3) Конечно же Вы правы. исправлю на boolean 4) Где вы предлагаете добавить ? 5) Поясните какие , пожалуйста. 6) Конечно, учту ! Ничего страшного, немного причесал код. Память расходует от 120 до 260 МБ хипа, вроде сбрасывает до 140 примерно, особо ждать времени не было когда закончится цикл или хип. 1. Поставьте хипа хотя бы 512МБ, дефолтные размер может переполниться. Пример с гигом: java -Xmx1024m 2. Настройте логгирование, полезная вещь, читать и скачивать jar для log4j фасада и реализации в вашем случае скорее всего logback standalone http://logback.qos.ch/ 3. Придерживайтесь рекомендуемого стиля Java кода: Sun (Oracle) http://www.oracle.com/technetwork/java/codeconvtoc-136057.html Google https://google.github.io/styleguide/javaguide.html Код после легкой рехтовки, возможно легкомысленно изменил перебор if/if/if на if else/if else/.. в паре мест, проверьте, это просто пример. В алгоритм не вникал. PS используйте переносы, разделяйте блоки кода, хотя на вкус и цвет товарищей нет... Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 00:40 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
uid unique, вот допустим, на 64 ходу найдено решение. Вопрос: выйдет ли код из цикла? Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 10:20 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Поскольку исходник живет своей жизнью то я буду комментировать последнюю версию независимо от автора. Я сделал еще один машинальный рефакторинг. 1) Магические константы типа размер доски = 8 я вынес в отдельную static final переменную. Это упрощает анализ кода и делает его более строгим. 2) StringBuilder можно инстанциировать заведомо известным размером. Это избавит нас от реаллокаций. 3) Была большая путаница в локальных переменных и переменных класса. Я заменил x,y на i,j и ушел this и загадочный ...x[x].... 4) Я использовал temp variable чтобы убрать повторные вычисления в блоках if. Вот что получилось. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 10:24 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Далее. Код: java 1. используя математику неравенств константы слева и справа от знака сравнения можно переносить в обе стороны и избавляться от ненужных калькуляций. Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 10:27 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
ivanrauid unique, вот допустим, на 64 ходу найдено решение. Вопрос: выйдет ли код из цикла? Код: java 1. я в курсе не завершится никогда . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 10:28 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
По поводу multidimensional arrays в Java. Код: java 1. есть основания говорить о том что они не очень эффективны. Правильнее сказать что их реализация для нашей задачи (шахматная доска) весьма избыточна. Нам хватит и обычного одномерного массива. Код: java 1. для доступа к элементу (i,j) мы должны использовать следующий getter Код: java 1. 2. 3. Сеттер кодится точно также. Почему i умножается на размер доски а не j - это вопрос договорённостей. Можно и наоборот. Это влияет на обход доски слева-направо-сверху-вниз или сверху-вниз ... и.т.д. Обычно на больших матрицах выбирают обход таким образом чтобы доступ к линейным участкам памяти не сильно "распылялся". Это тоже один из хинтов перформанса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 10:37 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Стоп я ошибся. Размер доски в квадрате от стороны. Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 10:38 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81ivanrauid unique, вот допустим, на 64 ходу найдено решение. Вопрос: выйдет ли код из цикла? Код: java 1. я в курсе не завершится никогда . Не так, он завершится при mc == 9. На самом деле, код вроде должен перебирать все решения, но вот с определением, что решение найдено - проблемы. Во-первых, tryHorse всегда возвращает false, почему бы не преобразовать этот метод в void и не убрать лишнюю переменную? Во-вторых, опять посмотрим на 64-й ход (horseIndex==64). При найденном решении мы заходим в if(), а там: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. это решение признано ошибочным Конечно, правильное решение было выведено строчкой раньше Код: java 1. , но как мы найдем его среди всего этого флуда (до первого решения может быть выведено на консоль хот миллион неправильных)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 11:22 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Если посмотреть на исходник глазами статического анализатора то можно видеть The Cyclomatic Complexity of this method "moveHorse" is 33 which is greater than 10 authorized. Complex code can perform poorly and will in any case be difficult to understand and therefore to maintain. Я не знаю откуда он взял 33. Возможно просуммировал все предикаты в if-else и посчитал их ветками логики. Но нам повезло что порядок проверки - декартовый и этот список условий более-менее ясен. А если их заменить на некие абстрактные f1(), f2() то тогда надо раскуривать сорс очень долго. Кстати есть мысль что стоит отмечать свободые позиции битовой маской. Кажется я так делал в своём С++ horse route. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 13:50 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
uid unique1. Поставьте хипа хотя бы 512МБ, дефолтные размер может переполниться. Пример с гигом: java -Xmx1024m 2. Настройте логгирование, полезная вещь, читать и скачивать jar для log4j фасада и реализации в вашем случае скорее всего logback standalone http://logback.qos.ch/ возможно надо выполнить пункт №1, но я не знаю как это сделать. сделал я только №2. у меня всё та же привычная ошибка : "io console updater java heap space" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 13:55 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonКстати есть мысль что стоит отмечать свободые позиции битовой маской. вы имеете ввиду что наш двухмерный массив должен быть boolean ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 13:59 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Я думаю о том как свести арифметические операции проверки координат к проверке масок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:10 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonЯ думаю о том как свести арифметические операции проверки координат к проверке масок. это, конечно , здорово но это уж совсем слишком вы заморочились с оптимизацией алгоритма. )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:16 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Совершенству нет предела. А учитывая бесконечные возможности параллелизма данной задачи (мы можем не шарить шахматную доску между процессами) то эта задача скейлируется достаточно выгодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:28 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonСовершенству нет предела. А учитывая бесконечные возможности параллелизма данной задачи (мы можем не шарить шахматную доску между процессами) то эта задача скейлируется достаточно выгодно. многопоточность тогда давайте прикрутим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:34 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81 учитывая бесконечные возможности параллелизма данной задачи вот странно если начальная точка 1:1, то решения находятся довольно быстро - меньше минуты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:38 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Надо подумать как задачи раздать. Чтоб повторов не было. У вас уже есть мысли по этому вопросу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:39 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonНадо подумать как задачи раздать. Чтоб повторов не было. У вас уже есть мысли по этому вопросу? да это я так про многопоточность. это очень серьёзный вопрос. боюсь , что мне не по зубам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:49 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton, легче воспользоваться Правилом Варнсдорфа как тут советовали ранее: Правило формулируется очень просто: следующий ход коня нужно делать на клетку, откуда существует наименьшее количество возможных ходов. Если клеток с одинаковым количеством ходом несколько, то можно выбрать любую. На практике это реализуется, например, следующим образом. Перед каждым ходом коня вычисляется рейтинг ближайших доступных полей - полей, на которых конь еще не был, и на которые он может перейти за один ход. Рейтинг поля определяется числом ближайших доступных с него полей. Чем меньше рейтинг, тем он лучше. Потом делается ход на поле с наименьшим рейтингом (на любое из таковых, если их несколько), и так далее, пока есть куда ходить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:54 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, и выход , завершение нужно при нахождении хотя бы одного решения прописать каким-то образом как верно подмечал ivanra ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:56 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
uid unique, еще неплохо было бы улучшить копипастный код метода moveHorse(). Например, итерацией по массиву Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 15:14 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81mayton, легче воспользоваться Правилом Варнсдорфа как тут советовали ранее: Данное правило, насколько я понял меняет некоторые характеристики базового однопоточного алгоритма. Возможно улучшает o(n). Но к предлагаемому мной вопросу (параллельный запуск нескольких процессов и способ раздачи работ) Варнсдорф не имеет отношения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 15:27 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
ivanrauid unique, еще неплохо было бы улучшить копипастный код метода moveHorse(). Например, итерацией по массиву Код: java 1. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 15:45 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, отваливается всё равно по ошибке IOConsole Updater "An internal error has occurred. Java heap space" даже прикрутив логатер . Вопрос: можно ли чтобы он сохранял лог в файл , а не на выводил на экран ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 15:51 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, чувак я-же тебе писал. Подключи нормальные библиотеки логгирования. Настрой appenders. Настрой их на запись в текстовые файлы. Вот тебе ссылки. https://logging.apache.org/log4j/2.x/manual/appenders.html http://logback.qos.ch/manual/appenders.html А текстовое окошко внизу которое тебе ЛЮБЕЗНО предоставляет среда разработки перепоелняет heap и правильно делает ибо нефиг слать терабайты текста в ИНФОРМАЦИОННОЕ (!) на минуточку окошко. Да вообще ничего писать не надо! Напиши только резалт когда функция закончит работу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 16:10 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton Да вообще ничего писать не надо! Напиши только резалт когда функция закончит работу. закончит , но не скоро ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 16:12 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
У меня на С++ в 2003 году на Celeron-300 эта задача решалась за минут пять. А щас учитывая рост перформанса можно просто умножать на десять. Тоесть за полминуты должна решаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 16:49 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonУ меня на С++ в 2003 году на Celeron-300 эта задача решалась за минут пять. А щас учитывая рост перформанса можно просто умножать на десять. Тоесть за полминуты должна решаться. вы когда о процессах говорили вы многопоточность имели ввиду ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 17:07 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Я говорил о способности этой задачи исполнятся параллельно. А будь это процесссы (ProcessBuilder) или потоки (Thread) - это уже детали реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 17:09 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton, хорошо, тогда я не вижу иного способа как иметь n разных массивов и работать с ними параллельно. а ещё вести один глобальный массив куда складывались бы тупиковые маршруты . таким образом мы исключим повторений по тупиковым путям в разных потоках ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 17:12 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Зачем вам нужен глобальный массив? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 17:41 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonЗачем вам нужен глобальный массив? глобальный , ну я честно говоря уже запамятовал как потоками пользоваться, я сказал так в предположении , что каждый поток это отдельный класс. мне видимо надо эту тему освежить. не пинайте сильно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 17:54 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonУ меня на С++ в 2003 году на Celeron-300 эта задача решалась за минут пять. для стартовой точки 1:1 выдает менее чем за минуту кучу решений . а вот для других уходит в думы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 17:55 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81maytonЗачем вам нужен глобальный массив? глобальный , ну я честно говоря уже запамятовал как потоками пользоваться, я сказал так в предположении , что каждый поток это отдельный класс. мне видимо надо эту тему освежить. не пинайте сильно :) Давай порассуждаем. У тебя - идеальная задача. Она идеально параллелится. Можно в 4 Thread запустить разные экземпляры расчетов только задав им разные условия чтобы пути коней не пересекались. Это нужно для повышения КПД а вовсе не для решения коллизий. Задейстовать либо Random с разными seed либо hash-функции. Или если рассматривать проблему коня как поиск маршрутов в дереве то нам достаточно описать простой алгоритм расщепления дерева на 4 поддерева. Включать в эту модель какой-то глобальный массив нет смысла. Во первых это замедлит прозводительность. 4 потока будут конкурентно писать туда. Во вторых единой точкой соприкосновения этих потоков реально будет только публикация отчота. Или финал работы. Число 4 я взял просто для примера. Пока - необоснованно. Но можно брать и другие числа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 18:13 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
ivanrauid unique, вот допустим, на 64 ходу найдено решение. Вопрос: выйдет ли код из цикла? Код: java 1. там достаточно Код: java 1. было потому что когда мс 9, то success = false. пардон, в алгоритм не вникал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 18:18 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonandron81, чувак я-же тебе писал. Подключи нормальные библиотеки логгирования. Настрой appenders. Настрой их на запись в текстовые файлы. Вот тебе ссылки. https://logging.apache.org/log4j/2.x/manual/appenders.html http://logback.qos.ch/manual/appenders.html А текстовое окошко внизу которое тебе ЛЮБЕЗНО предоставляет среда разработки перепоелняет heap и правильно делает ибо нефиг слать терабайты текста в ИНФОРМАЦИОННОЕ (!) на минуточку окошко. Да вообще ничего писать не надо! Напиши только резалт когда функция закончит работу. Положите вот такой файлиk logback.xml в папку с библиотеками или в корень класс файлов Код: xml 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. main метод запускайте установив переменную Java Xmx (максимальный размер памяти) java -Xmx1024m ru.sql.forum.samples.Horse (поправьте имя класса) Скачайте и добавьте в путь logback-classic-<VERSION>.jar и slf4j-api-<VERSION подходящая к версии logback>.jar Библиотеки и инструкции/примеры здесь: http://logback.qos.ch/download.html По уменьшению расхода памяти можно предложить если вам достаточно бинарного массива (аналог boolean), вначале создаете массив бит из нулей и ставите единички когда нужно. 1. замена массива int[64] на 2 int или 1 long (64 bit). Доступ к битам с помощью маски, это быстрая операция. 2. для больших массивов можно использовать bitset https://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html вам он скорее всего не нужен так как в этом классе накладные расходы не окупятся для 64 бит (2 int | 1 long). пример работы с маской Код: java 1. 2. 3. 4. 5. 6. Аналогично работа с нулями (логический &) и считыванием (маска и сдвиг вправо на нужное кол-во позиций) Как выше заметили, задача хорошо распараллеливается но вам пожалуй пока рано за это браться. Если будет желание посмотрите java thread api, task executor. https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executor.html http://winterbe.com/posts/2015/04/07/java8-concurrency-tutorial-thread-executor-examples/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 18:45 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonМожно в 4 Thread запустить разные экземпляры расчетов только задав им разные условия чтобы пути коней не пересекались. Это нужно для повышения КПД а вовсе не для решения коллизий. Задейстовать либо Random с разными seed либо hash-функции. то есть вы предлагаете просто рандомно , а не последовательно как у нас выбирать следующего кандидата в разных независимых потоках. не ведя никаких проверок на совпадения (а они будут, но не велика проблема) Верно ? может что-то хорошего и выйдет maytonИли если рассматривать проблему коня как поиск маршрутов в дереве то нам достаточно описать простой алгоритм расщепления дерева на 4 поддерева. это вообще трудно себе представить . как вы сделаете, чтобы в одном потоке робот не лез на клетки другого дерева ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 22:52 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, кажется вы меня не слышите. Я уже говорил о том что данное ПО не требует шаринга шахматной доски. В этом суть моего месседжа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 22:54 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonandron81, кажется вы меня не слышите. это непросто . вы про это ? maytonВключать в эту модель какой-то глобальный массив нет смысла. Во первых это замедлит прозводительность. 4 потока будут конкурентно писать туда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 08:27 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
uid uniquemain метод запускайте установив переменную Java Xmx (максимальный размер памяти) java -Xmx1024m ru.sql.forum.samples.Horse (поправьте имя класса)Не нужно этой задаче столько памяти. Похоже, там консоль эклипса валится от флуда Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 09:24 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
ivanrauid uniquemain метод запускайте установив переменную Java Xmx (максимальный размер памяти) java -Xmx1024m ru.sql.forum.samples.Horse (поправьте имя класса)Не нужно этой задаче столько памяти. Похоже, там консоль эклипса валится от флуда Код: plaintext 1. 2. я об этом уже давно твердил. но в слабость моей компетентности в JAVA к моему мнение никто не прислушивается ))) конечно , не надо. максимальная глубина 64. подумаешь ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 09:27 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton, хотел у Вас спросить . Вот это имеет ли шанс на удачу или же чушь несусветная ? andron81то есть вы предлагаете просто рандомно , а не последовательно как у нас выбирать следующего кандидата в разных независимых потоках. не ведя никаких проверок на совпадения (а они будут, но не велика проблема) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 09:31 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81Atum1 http://algolist.manual.ru/maths/combinat/knight.php хотя интересное правило Варнсдорфа описано. но я правило такого не знал. поэтому у меня тупой перебор всего дерева. поэтому видимо и долго Есть еще правило Эйлера (см вики по данной проблеме) делаете до упора рекурсию а на остальные ходы делает обход с конца с 64 клетки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 11:36 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Atum1 делаете до упора рекурсию а на остальные ходы делает обход с конца с 64 клетки. не. не прикольно . вероятность, что с 64-ой клетки мы попадём не в стартовую клетку довольно большая. а задача стоит с известной клетки вести вот интересно послушать mayton . Верно ли я его понял, что он предлагал обход дерева осуществлять не последовательно от ветки к ветке , а брать случайную. и всё это в нескольких потоках вести юзая разные массивы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 11:47 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
ну вот 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. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 16:47 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81ну вот 8 потоков зарядил. задумывал как в предыдущем своём сообщении https://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 16:49 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, то есть я сделал туфту ? ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 16:53 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81Blazkowicz, то есть я сделал туфту ? ))) Просто самое время изучить что-то новое и уменьшить немного накал говнокода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 16:57 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Blazkowiczandron81Blazkowicz, то есть я сделал туфту ? ))) Просто самое время изучить что-то новое и уменьшить немного накал говнокода. Да. Собственно для юноши-джуниора сейчас важно научится правильно использовать инструмент разработки язык и среду. Скажу честно что я глубоко не разбирал его алгоритм. Я даже не вижу толком как он работает. Единственно - машинально отметил какую-то избыточность в return-параметрах (зачем они вообще там?) и неумение делать простейшие трансформации кода для достижения краткости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 17:06 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81mayton, хотел у Вас спросить . Вот это имеет ли шанс на удачу или же чушь несусветная ? andron81то есть вы предлагаете просто рандомно , а не последовательно как у нас выбирать следующего кандидата в разных независимых потоках. не ведя никаких проверок на совпадения (а они будут, но не велика проблема) Давайте вернемся немножко к теории самой задачи. Если вы планируете найти 1-е попавшееся решение - то вам пойдет вариант с запуском десятка вычислительных потоков с разной старовой клеткой и с разным раскладом "проб коня". Какой-то из потоков первый завершит работу - и это будет успех. Второй вариант - вы хотите найти минимум N обходов. Нам также подходит этот алгоритм единственный нюанс надо искать зеркальные отражения и повороты на 90 градусов базового решения (это самые первые которое мы найдем) и учитывать их как не-уникальные. Третий вариант - вы хотите искать все решений 100% покрытий конём доски. Здесь я затрудняюсь. Я не знаю разумное ли это число? Возможно оно астрономически велико. Но даже для такого варианта надо что-то предложить. Я здесь я предложу еще раз рассмотреть все решения как набор деревьев 8-чатого порядка и просто разрезать это множество на M частей и раздать это M потокам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 17:11 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81вот интересно послушать mayton . Верно ли я его понял, что он предлагал обход дерева осуществлять не последовательно от ветки к ветке , а брать случайную. и всё это в нескольких потоках вести юзая разные массивы. Это мозговой штурм. Я не говорю что это единственно верное решение. Чтобы потоки не "лупили" по одним и тем-же маршрутам надо: 1) Инстанциировать потоки разной стартовой клеточкой. Например new HorseThread(1,new Position("a1"); new HorseThread(2,new Position("g8"); 2) При выборе следующего хода из одинаково вероятных "проб коня" брать псевдослучайное число инстанциированное уникальным seed-ом. Этот seed можно взять из порядкового номера потока (1,2,3,) 3) Как только все потоки сформируют теоретическое количество X ответов (которое мы вычислим или вычитаем в умных книжках) то мы скажем что все решения найдены и больше в природе не существует и прервем работу всех потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 17:19 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton1) Инстанциировать потоки разной стартовой клеточкой. Например new HorseThread(1,new Position("a1"); new HorseThread(2,new Position("g8"); не пойдет. старт должен исходить из одной определённой клетки - условие задачи. maytonnew HorseThread(1,new Position("a1"); new HorseThread(2,new Position("g8"); ... потоки нагибают систему конкретненько. попробовал с одним потоком поискать решения на полях 5x5 , 6x6 с разных начальных точек. ищет все решения и довольно быстро. а вот поля 7x7 ? 8x8 надолго сильно задумывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 09:20 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81потоки нагибают систему конкретненько. попробовал с одним потоком поискать решения на полях 5x5 , 6x6 с разных начальных точек. ищет все решения и довольно быстро. а вот поля 7x7 ? 8x8 надолго сильно задумывается. Это норм. Так и нужно. Утилизация ибо. После топика рендеринга картинок я пришел к выводу что для процессов которые интенсивно используют CPU и почти не конкурируют по памяти (типа численный метод; один раз получил задание и ушел в себя надолго) оптимальная формула числа Java- потоков Jt = m * n + 1 Где m - число ядер и n - число hyper-threads на ядро. Для моего слабого ноутбука это было 5. Дальнейшее увеличение числа потоков не повышало эффективности алгоритма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 10:01 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81не пойдет. старт должен исходить из одной определённой клетки - условие задачи. Хорошо. Пускай они стартуют с одной точки. Тогда нам нужны несколько потоков параметризованные только генератором случайных чисел с разным начальным вектором. Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 10:05 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton, мозговой штурм , а именно : рандомно , а не последовательно как у нас выбирать следующего кандидата в разных независимых потоках. не ведя никаких проверок на совпадения" быстрых решений не приносит - более часа ни одного решения не найдено. а оно даже немного и понятно. Ведь на каждом шаге 9 вариантов которые выбираются случайно (9 - выход на уровень выше). таким образом в данной ветке мы можем как сразу выйти к предку , так и побродить - 9-ка может не выпадать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 14:14 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, а про метод Варнсдорфа прочитал, что может в тупик заводить. контр.примеры писали что существуют. остаётся метод деления дерева на поддеревья подсказанный mayton. но я не представляю как этот способ реализуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 14:49 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81mayton, мозговой штурм , а именно : рандомно , а не последовательно как у нас выбирать следующего кандидата в разных независимых потоках. не ведя никаких проверок на совпадения" быстрых решений не приносит - более часа ни одного решения не найдено. а оно даже немного и понятно. Ведь на каждом шаге 9 вариантов которые выбираются случайно (9 - выход на уровень выше). таким образом в данной ветке мы можем как сразу выйти к предку , так и побродить - 9-ка может не выпадать. Ну и зачем ты сразу выходишь наверх? Обойди все восемь узлов дерева в рандом порядке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 15:56 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonandron81mayton, мозговой штурм , а именно : рандомно , а не последовательно как у нас выбирать следующего кандидата в разных независимых потоках. не ведя никаких проверок на совпадения" быстрых решений не приносит - более часа ни одного решения не найдено. а оно даже немного и понятно. Ведь на каждом шаге 9 вариантов которые выбираются случайно (9 - выход на уровень выше). таким образом в данной ветке мы можем как сразу выйти к предку , так и побродить - 9-ка может не выпадать. Ну и зачем ты сразу выходишь наверх? Обойди все восемь узлов дерева в рандом порядке. нет, ну не сразу, а волею случая. а вы уверены , что если проверять рандомно все 8 узлов и в случае ни одного успешного выходить на уровень выше, то это будет выигрыш по сравнению последовательного обхода ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 16:04 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81maytonпропущено... Ну и зачем ты сразу выходишь наверх? Обойди все восемь узлов дерева в рандом порядке. нет, ну не сразу, а волею случая. а вы уверены , что если проверять рандомно все 8 узлов и в случае ни одного успешного выходить на уровень выше, то это будет выигрыш по сравнению последовательного обхода ? А ты думал о том что при последовательном обходе у тебя все threads будут делать одну и ту же работу дублируя друг друга? И зачем такой параллелизм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 17:21 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonА ты думал о том что при последовательном обходе у тебя все threads будут делать одну и ту же работу дублируя друг друга? И зачем такой параллелизм? нет, конечно. я думал и запрограммировал вот так : пусть точка отсчета 1:1 во всех потоках. в каждой вершине дерева случайно выбираем одно из возможных направлений + направление назад, делаем это в разных независимых потоках ( в результате будут разные маршруты). не ведя нигде никаких проверок на совпадения. таким образом в каждой вершине случайным образом выбирается одно из возможных направлений или может выбраться путь к предку назад. Путь обратно может быть выбран как сразу так и потом , волей случайности . Этот алгоритм успеха не принёс вы же предлагаете рандомить возможные направления , а по их исчерпанию возвращаться назад. Вот я и предположил , что вот последовательный ход по вершинам и случайный ход. И там и там обход всех вершин . поэтому и вопрос откуда такая уверенность , что последний приведёт к успеху. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 17:52 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81maytonА ты думал о том что при последовательном обходе у тебя все threads будут делать одну и ту же работу дублируя друг друга? И зачем такой параллелизм? нет, конечно. я думал и запрограммировал вот так : пусть точка отсчета 1:1 во всех потоках. в каждой вершине дерева случайно выбираем одно из возможных направлений + направление назад, делаем это в разных независимых потоках ( в результате будут разные маршруты). не ведя нигде никаких проверок на совпадения. таким образом в каждой вершине случайным образом выбирается одно из возможных направлений или может выбраться путь к предку назад. Путь обратно может быть выбран как сразу так и потом , волей случайности . Этот алгоритм успеха не принёс вы же предлагаете рандомить возможные направления , а по их исчерпанию возвращаться назад. Вот я и предположил , что вот последовательный ход по вершинам и случайный ход. И там и там обход всех вершин . поэтому и вопрос откуда такая уверенность , что последний приведёт к успеху. Да ладно. Нигде я не предлагал ходить назад. Я ещё раз предложу тебе публиковать актуальный исходник а то получается что мы просто ведем философской дискурс Причём ты весьма вольно дополняешь мои мысли своими и потом говоришь театрально "успеха не принёс".. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 19:14 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonДа ладно. Нигде я не предлагал ходить назад. а тут ? maytonНу и зачем ты сразу выходишь наверх? Обойди все восемь узлов дерева в рандом порядке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 21:58 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, смутило слово "СРАЗУ" . словно ход назад вы всё же не отрицаете ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 22:00 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Мне лень спорить. Я-то свои мысли знаю. Мдя. А с тебя - должок. Гони сорцы. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 22:16 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton, Код: 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. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 22:30 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Ну йошкин крот. Мой рефакторинг ты конечно проигнорировал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 22:32 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonНу йошкин крот. Мой рефакторинг ты конечно проигнорировал. так всё ужасно читается ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 22:38 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Да не в том дело. Яж тебе совет давал и по performance. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 23:09 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonДа не в том дело. Яж тебе совет давал и по performance. 1. System.out флудит беспощадно и блокирует скорость вычислений. Даже с заглушкой в /dev/null все равно будет обеспечет терафлоп ненужной работы которую никто не смотрит. Вобщем вынести в slf4j или JUL с уровнем trace. ну честно , я не увидел разницы по скорости с протоколированием slf4j. Если на то пошло можно принты и поотключать. оставить только вывод матрицы. и протокол по средствам slf4j так же вызывает перегруз кучи. на замене System.out.print протоколирование по средствам slf4j в данном случае не хотел бы заострять внимание. 2. Результат вычислений возвращается через строковую константу. Это странно. Так обычно не делают. любезно с этим помогли. теперь булеан 3. Есть flow где имеет смысл добавить линию else чтобы отключить избыточные расчеты. Есть повторы вычисления одного выражения которые можно зарефакторить через introduce temp variable. боюсь где-нибудь подкосячить добавлением Else . поэтому не делал. 4. Очень много замечаний к codeStyle. Классы с маленькой буквы а имена переменных с dash. Это ломает зрение. ну извиняюсь. пока мало опыта. Глаза разбегаются там от требований после того как погуглил. я это делать буду пол. дня. пока как я должен по минимуму: 1) классы с большой буквы , переменные с маленькой и никаких подчеркиваний ? 2) в наименовании методов, классов, переменных использование английских слов. подскажите , я перепишу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 14:11 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81ну извиняюсь. пока мало опыта. Отличная отмазка чтобы ничего не делать. andron81Глаза разбегаются там от требований после того как погуглил. я это делать буду пол. дня. Ерунда. Переименовать все переменные через рефакторинг и попросить IDE отформатировать код. 15 минут, на придумать внятные имена. andron81подскажите , я перепишу Пример Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Никаких mс, t, j, is, js, xs и прочих угадаек. Имя точно должно объяснять нафига тут эта переменная и что в ней. i допускается только в циклах. Иногда можно сокращать b, s, c для временных переменных byte, String, char, но их область видимости должна быть минимальной - 2-3 рядом стоящие строки. У вас же такие переменные шатаются по всему коду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 17:16 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron811. System.out флудит беспощадно и блокирует скорость вычислений. Даже с заглушкой в /dev/null все равно будет обеспечет терафлоп ненужной работы которую никто не смотрит. Вобщем вынести в slf4j или JUL с уровнем trace. ну честно , я не увидел разницы по скорости с протоколированием slf4j. Если на то пошло можно принты и поотключать. оставить только вывод матрицы. и протокол по средствам slf4j так же вызывает перегруз кучи. на замене System.out.print протоколирование по средствам slf4j в данном случае не хотел бы заострять внимание. Смотри раз уж пошла такая пьянка. Давай сделаем так. Я помаркирую твой исходник секциями Код: java 1. и понадписываю что сделать в каждой строчке или блоке кода для улучшения перформанса. И ты, позадавав уточняющие вопросы это сделаешь. А после этого запустишь еще этого "блуждающего коня" померяешь эффект. И скажешь - помогло или нет. ОК? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 21:27 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton, хокей ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 08:05 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Держи. Я поставил отметки TODO: только там где на мой взгляд имеет место недостаток performance. TODO не удаляй до тех пор пока фактически не будет сделано по ним исправление. Задавай вопросы. Отвечу. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 09:23 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonДержи. Я поставил отметки TODO: только там где на мой взгляд имеет место недостаток performance. TODO не удаляй до тех пор пока фактически не будет сделано по ним исправление. Задавай вопросы. Отвечу. постараюсь выполнить за выходные . сделал при помощи правила Варнсдорфа для любых размеров (рассматривал только квадратную доску) и для любой стартовой точки. одно решение находит быстро, причем алгоритм модифицируется и сразу сыпет множество решений, читал, что там пределы какие-то размеров существуют для данного метода. но блин код вышел это полный трэш . никуда не годиться ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 16:23 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
и сразу вопрос mayton // TODO: заименить int[][] x на int[] x. Переписать логику соотв. int[][] x = new int[lll+1][lll+1]; а как вы собираетесь проверять был ли конь в клетке i,j ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 17:36 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81и сразу вопрос mayton // TODO: заименить int[][] x на int[] x. Переписать логику соотв. int[][] x = new int[lll+1][lll+1]; а как вы собираетесь проверять был ли конь в клетке i,j ? это же простая развертка двумерного массива в одномерный, на пальцах: массив а=int[8][10] приводим в b=int[80]; a[5][3] = b[5 *10 + 3] = b[53] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 17:54 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
uid uniqueandron81и сразу вопрос пропущено... а как вы собираетесь проверять был ли конь в клетке i,j ? это же простая развертка двумерного массива в одномерный, на пальцах: массив а=int[8][10] приводим в b=int[80]; a[5][3] = b[5 *10 + 3] = b[53] зачем ? в чем выигрыш ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 18:20 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81зачем ? в чем выигрыш ? Оптимизация по скорости и расходу памяти, ведь каждый объект занимает дополнительное место (описание и связи), каждый вызов метода примерно на 15% медленнее выполнения inline кода или доступа к полю напрямую. Нашел такой тест, не поленился его запустить в микро-бенчмарке Код: 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. Результат (на 8 Java): # Run complete. Total time: 00:00:16 Benchmark Mode Cnt Score Error Units Measure.sumMulti avgt 5 0.655 ± 0.037 ns/op Measure.sumSingle avgt 5 0.288 ± 0.023 ns/op Примерно в 2 раза медленне подсчет суммы (из за циклов / проверок) в многомерном массиве чем в одномерном. В вашем случае большой экономии не будет, можно не обращать внимания. Вам эта оптимизация сейчас не нужна, отработайте алгоритм вначале. Аналогично, целочисленное деление и умножение быстрее примерно в 2 раза чем с плавающей точкой (но это тоже не нужно, просто к сведению) По расходу памяти когда запускал пример (с первой страницы форума), хип был в пределах 120 - 270 МБ, периодически сбрасывался на 120-140 те расход небольшой. Out of memory мог быть вызван тем что использовался размер хипа по умолчанию близкий к 250МБ Как проверить размер хипа по умолчанию java -XX:+PrintFlagsFinal -version | findstr HeapSize или на юниксе/линуксе/маке java -XX:+PrintFlagsFinal -version | grep HeapSize У меня вывела 256МБ начальный размер хипа по умолчанию: uintx ErgoHeapSizeLimit = 0 {product} uintx HeapSizePerGCThread = 87241520 {product} uintx InitialHeapSize := 268435456 {product} uintx LargePageHeapSizeThreshold = 134217728 {product} uintx MaxHeapSize := 4294967296 {product} PS пардон что не вникаю в тему, у меня сейчас разгребания Java кода конца 90х (почти Java 1.1) нaписанного в стиле 80х (даже коллекций нет и процедурное программирование к зачатками объектов), голова уже не соображает, особенно в пятницу... ;-) Хороших выходных! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 22:37 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonДержи. Я поставил отметки TODO: только там где на мой взгляд имеет место недостаток performance. TODO не удаляй до тех пор пока фактически не будет сделано по ним исправление. Задавай вопросы. Отвечу. Код: javascript 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. не справился с inline функцией . то есть погуглив я выяснил(не знаю правда ошибочно или нет), что inline методы в java создать не выйдет. Можно сделать только статик. Но даже это если и так , то как мне избавится от returnValue совсем неясно. можете привести простой пример ? скажем функцию вычисляющая x + 10 как сделать inline ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:12 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81 скажем функцию вычисляющая x + 10 как сделать inline ? инлайн и без рreturnValue ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:14 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
uid unique Вам эта оптимизация сейчас не нужна, отработайте алгоритм вначале. согласен, думаю пример не для отработки (не лёгкий), но раз уж понеслась , то придется ) uid uniqueКак проверить размер хипа по умолчанию java -XX:+PrintFlagsFinal -version | findstr HeapSize петрушками типа -XX: вообще не умею пользоваться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:22 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Сейчас поясню суть рефакторинга с inline. Я обратил внимание на то что функция Код: java 1. Используется 1 единственный раз. При этом она использует return int[] с одной целью - обеспечить возврат пары координат (moving[]). Поскольку стандарт Java language не дает возможности делать out-parameters то автор это решает за счет возврата array. Далее я рассудил так. Если мы тело функции перенесем в 1 единственную точку ее вызова то мы избавляемся от такого странного способа возврата. А результат работы moveHorse мы можем записать в переменные. Код: java 1. 2. Из алгоритма уходят операции индексации moving и операция передачи через стек ссылки на array. Сам array и его аллокация new[] тоже уходит т.к. массив становится не нужен. +положительный эффект - меньше нагрузка на heap. С точки зрения Мартина Фаулера - мы сделали не очень хорошо т.к. увеличиваем размер метода. Но с точки зрения performance и GC - мы улучшим картину. Если-бы функция moveHorse использовалась много раз или была-бы рекурсивной то мы не смогли-бы такой фокус провернуть. Сам термин inline пускай вас не смущает. Можете заменить его на копи-пасту. Это тоже самое. Так в C++ например работают механизмы развёртывания макросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 22:07 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81зачем ? в чем выигрыш ? Это мой старый добрый рефакторинг который я юзаю уже много лет. В основном он эффективен в растровой графике. Задавать картинку и работать с ней удобнее через int[] rgbColors чем через int[][] rgbColors. Так скорость выше. Это я знаю еще со времен С++. В некоторых случаях длину строки выравнивают на число байт кратных машинному WORD процессора. Типа padding строки. Плюс есть еще много нюансов связанных с тем как аллокатор int[][] размещает суб-массивы в куче. При удачном стечении обстоятельств (обходим массив слева направо и сверху вниз) канал памяти получает тразнакции чтения по линейным адресам. Это благоприятный кейс. Но возможно будет и не-благоприятный. Когда я задаю матрицу или куб (или гиперкуб) через линейный массив то я сам вручную обеспечиваю линейный порядок доступа к элементам памяти. Некий господин выше не поленился и даже привел бенчмарк с использованием JMH и с прогревом компиллятора как положено. Что-ж. Я не буду с ним спорить. Мои последние бенчмарки я делал еще во время JDK6 а тогда и деревья были выше и оптимизатор был попроще. Возможно сейчас и нет острой необходимости выключать int[][] но я лишний раз замечу что наша задача выгодно отличается от других. У нас - квадратное поле (а не зубчатое) и ширина строки заведомо известна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 22:17 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonНекий господин выше не поленился и даже привел бенчмарк с использованием JMH и с прогревом компиллятора как положено. Что-ж. Я не буду с ним спорить. Мои последние бенчмарки я делал еще во время JDK6 а тогда и деревья были выше и оптимизатор был попроще. JMH тест как раз показываeт большую производительность у линейного массива (> 2 раз) чем у многомерного, как и ожидалось. Если без микробенчмарка делать, с System.currentTime, то скорее всего разница будет менее заметна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 01:02 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
о гспди....обалденно почитать всё это нубу ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 02:54 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonСейчас поясню суть рефакторинга с inline. Я обратил внимание на то что функция Код: java 1. Используется 1 единственный раз. При этом она использует return int[] с одной целью - обеспечить возврат пары координат (moving[]). Поскольку стандарт Java language не дает возможности делать out-parameters то автор это решает за счет возврата array. Далее я рассудил так. Если мы тело функции перенесем в 1 единственную точку ее вызова то мы избавляемся от такого странного способа возврата. А результат работы moveHorse мы можем записать в переменные. Код: java 1. 2. Из алгоритма уходят операции индексации moving и операция передачи через стек ссылки на array. Сам array и его аллокация new[] тоже уходит т.к. массив становится не нужен. +положительный эффект - меньше нагрузка на heap. С точки зрения Мартина Фаулера - мы сделали не очень хорошо т.к. увеличиваем размер метода. Но с точки зрения performance и GC - мы улучшим картину. Если-бы функция moveHorse использовалась много раз или была-бы рекурсивной то мы не смогли-бы такой фокус провернуть. Сам термин inline пускай вас не смущает. Можете заменить его на копи-пасту. Это тоже самое. Так в C++ например работают механизмы развёртывания макросов. понял. переделаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 10:33 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81понял. переделаю Вроде немного очухался за выходной. Если будете делать перебор в нескольких потоках, то придется либо лочить общий ресурс, либо делать его volatile, что для больших объектов плохо. Для отдельных локов на чрение и запись, можете использовать подобный код: (Предупреждаю что сам по себе код бессмысленный, просто пример с расшареным ресурсом): Код: 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. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. Без обид но код я не понял, те если за 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. Позиция, можно использовать что то готовое из awt пакета, там вроде был подобный класс. Для учебного процесса лучше свое написать Код: 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. На десерт, тест класс. Нужно его доработать, убрать сортировку и сделать сравнение коллекций покультурнее, без печати в строку Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2016, 21:11 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
uid uniqueНа десерт, тест класс. Нужно его доработать, убрать сортировку и сделать сравнение коллекций покультурнее, без печати в строку что этот тест класс делает ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2016, 10:31 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
uid uniqueЕсли будете делать перебор в нескольких потоках у меня складывается впечатление , что потоки тут не помощники. помогло только Правило Варнсдорфа. находит множество решений (я правда не уверен , что все они уникальные, но это пустяк) причем с любых начальных точек . обычный перебор находил только для досок 6x6 и с начальной точки 1:1. НО код вышел просто ужасный . Ужасней чем последний, что я выкладывал. боюсь его показывать - запинаете ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2016, 10:41 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, даже не знаю стоит ли его прилизывать , чтобы выложить сюда . будет кто-нибудь читать разбираться - не знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2016, 10:41 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81uid uniqueНа десерт, тест класс. Нужно его доработать, убрать сортировку и сделать сравнение коллекций покультурнее, без печати в строку что этот тест класс делает ? Запускает тесты для проверки кода, даете входные условия и ожидаемый результат. статья для начанающих https://habrahabr.ru/post/169381/ Сайт http://junit.org/junit4/ В примере вызов рекурсивный, коллекция передается как параметр но можно обращаться к ней как к полю. По тест классу - iмейте в виду (в будущем) что запуск тест методов может делаться как из одного потока (последовательно) так и параллельно, поэтому расшаренные статические ресурсы в тест классе делать нежелательно (лочить придется). Тест методы должны быть thread safe (поддерживать многопоточность) Поставьте простой мавен проект и работайте в нем, будет проще прогонять тесты и тд http://www.apache-maven.ru/ https://habrahabr.ru/post/77382/ Учитесь сразу делать правильно, нет ничего затратнее чем переучивание в будущем (двойная работа). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2016, 11:24 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonandron81зачем ? в чем выигрыш ? Это мой старый добрый рефакторинг который я юзаю уже много лет. В основном он эффективен в растровой графике. Задавать картинку и работать с ней удобнее через int[] rgbColors чем через int[][] rgbColors. Так скорость выше. Это я знаю еще со времен С++. В некоторых случаях длину строки выравнивают на число байт кратных машинному WORD процессора. Типа padding строки. Плюс есть еще много нюансов связанных с тем как аллокатор int[][] размещает суб-массивы в куче. При удачном стечении обстоятельств (обходим массив слева направо и сверху вниз) канал памяти получает тразнакции чтения по линейным адресам. Это благоприятный кейс. Но возможно будет и не-благоприятный. Когда я задаю матрицу или куб (или гиперкуб) через линейный массив то я сам вручную обеспечиваю линейный порядок доступа к элементам памяти. Некий господин выше не поленился и даже привел бенчмарк с использованием JMH и с прогревом компиллятора как положено. Что-ж. Я не буду с ним спорить. Мои последние бенчмарки я делал еще во время JDK6 а тогда и деревья были выше и оптимизатор был попроще. Возможно сейчас и нет острой необходимости выключать int[][] но я лишний раз замечу что наша задача выгодно отличается от других. У нас - квадратное поле (а не зубчатое) и ширина строки заведомо известна. ну понял вас. по самому алгоритму всё же неясность. Вы говорите , что как-то удавалось получать решения (видимо используя поточную технологию) . бродить по возможным ходам вы предлагаете случайно, а вот Варнсдорф предлагает брать сначала ветки с наименьшим кол-вом ходов и довольно успешный метод (проверял), в любом случае выходим на уровень выше в случае исчерпания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2016, 16:38 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81ну понял вас. по самому алгоритму всё же неясность. Вы говорите , что как-то удавалось получать решения (видимо используя поточную технологию) . бродить по возможным ходам вы предлагаете случайно, а вот Варнсдорф предлагает брать сначала ветки с наименьшим кол-вом ходов и довольно успешный метод (проверял), в любом случае выходим на уровень выше в случае исчерпания. Так. Стоп-машина. Давай вернемся в самое начало. Я не знаю алгоритма Варнсдорфа. Но мне это и не важно. Я утверждаю. Что почти все (99.9%) алгоритмов поиска в шахматах можно запускать параллельно. Отсюда мы имеем в нашем топике 4 возможных варианта реализации. 1. Обычный (он-же - "поиск в глубину") 2. Варнсдорф. 3. Обычный многопточный (при условии что все потоки старуют из одной точки A1) 4. Варнсдорф многопоточный (при условии что все потоки старуют из одной точки A1) Ты согласен этим? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2016, 23:25 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonandron81ну понял вас. по самому алгоритму всё же неясность. Вы говорите , что как-то удавалось получать решения (видимо используя поточную технологию) . бродить по возможным ходам вы предлагаете случайно, а вот Варнсдорф предлагает брать сначала ветки с наименьшим кол-вом ходов и довольно успешный метод (проверял), в любом случае выходим на уровень выше в случае исчерпания. Так. Стоп-машина. Давай вернемся в самое начало. Я не знаю алгоритма Варнсдорфа. Но мне это и не важно. Я утверждаю. Что почти все (99.9%) алгоритмов поиска в шахматах можно запускать параллельно. Отсюда мы имеем в нашем топике 4 возможных варианта реализации. 1. Обычный (он-же - "поиск в глубину") 2. Варнсдорф. 3. Обычный многопточный (при условии что все потоки старуют из одной точки A1) 4. Варнсдорф многопоточный (при условии что все потоки старуют из одной точки A1) Ты согласен этим? согласен. 1. - работает крайне очень медленно. терпения дождаться хотя бы одного решения не хватает. 2. - вышло . 3. - вот этот хочу реализовать. Вы тут предлагаете поиск в глубину используя потоки ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 08:11 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, тогда как будем строить алгоритм ? допустим у нас 8 потоков в каждом свой массив с полем - x[]. предположим мы находимся в одной из вершин как Вы предлагаете будем двигаться от ветки к ветке ? Выше обсуждалось , что будем случайно выбирать по какой ветке двигаться . На уровень выше переходим только в случае исчерпания веток куда можно ступить или же плюс к этому на уровень выше делаем тоже как возможный 9-ый ход кот тоже может выбраться случайно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 08:45 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron813. - вот этот хочу реализовать. Вы тут предлагаете поиск в глубину используя потоки ? Я предлагаю еще раз описать условие задачи (новое условие). Потому-как я и другие мемберы не понимают конечную цель. Типа: Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 09:58 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton, ок. Но оставим Варнсдорфа в покое. так как в общем случае мы этого правила не знаем. и им вышло, а мне этого мало. Формулирую. Реализовать мультипоточный (4 - потока = const) алгоритм методом обхода в глубину . Исходные данные: 4 потока(константа) - задано жестко в программе. M - минимальное число маршрутов коня которые нужно найти. i,j - стартовая точка. M,i,j - задаются в виде аргументов командной строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 10:34 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, надо написать полное условие задачи в т ч что речь идёт о шахматном коне ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 14:46 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton, Требуется реализовать задачу обхода шахматного коня всей шахматной доски 8x8 из клетки (i,j) так, чтобы в каждой клетке он побывал ровно по одному разу. Способ реализации мультипоточный (4 - потока = const) алгоритм методом обхода в глубину . Исходные данные: 4 потока(константа) - задано жестко в программе. M - минимальное число маршрутов коня которые нужно найти. i,j - стартовая точка. M,i,j - задаются в виде аргументов командной строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 15:55 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Ок нормально. Я б предложил стартануть с нового топика а этот попросить модера закрыть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 19:01 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
оффтоп: да, это в традициях этого форума - через шесть страниц сформулировать, что-же все-таки требуется. шесть страниц коту под хвост... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 22:05 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
rema174, в мой огород камень или нет ? ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 22:10 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, я ж говорю - оффтоп )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 22:12 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
rema174andron81, я ж говорю - оффтоп )) ну по сути я давно получил ответ на свой вопрос (см. тему). возможно надо было раньше закончить и открыть новую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2016, 22:16 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2123359]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
144ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
162ms |
get tp. blocked users: |
2ms |
| others: | 231ms |
| total: | 583ms |

| 0 / 0 |
