Создание лабиринта Tower Defense (самый длинный лабиринт с ограниченными стенами) - эвристика, близкая к оптимальной?

В игре Tower Defense у вас есть сетка NxM с началом, концом и несколькими стенами.

Image1

Враги выбирают кратчайший путь от начала до конца, не проходя сквозь стены (обычно они не привязаны к сетке, но для простоты скажем так. В любом случае они не могут пройти через диагональные "дыры"). ")

Image2

Проблема (по крайней мере, для этого вопроса) состоит в том, чтобы разместить до K дополнительных стен, чтобы максимально увеличить путь, по которому должны пройти враги. Например, для K = 14

Image3

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

Но есть ли какие-нибудь достойные эвристики для почти оптимальных решений?


[Edit] Я отправил связанный вопрос здесь.


person BlueRaja - Danny Pflughoeft    schedule 26.04.2012    source источник
comment
Это смутно напоминает мне использование нормализованных разрезов для сглаживания сегментированных областей в изображениях, где каждый пиксель представлен в виде узла на графике. Это NP-полный, так что то, что вы описываете, тоже может быть. В любом случае, в этом случае (то есть сегментации изображения) приближения могут быть найдены на основе методов теории спектральных графов. Только мои 2 цента.   -  person Dhruv Gairola    schedule 26.04.2012
comment
добавление еще одной стены внизу сделало бы карту неразрешимой, разве это не максимум?   -  person Karoly Horvath    schedule 30.04.2012
comment
@KarolyHorvath: Извините, я предполагал, что большинство людей воспримут как данность, что вам не разрешено блокировать выход.   -  person BlueRaja - Danny Pflughoeft    schedule 30.04.2012
comment
Просто небольшое примечание. Ваша проблема потенциально неразрешима, если вы разрешите сетке быть сеткой NxM, потому что вы можете легко заблокировать все пути от начала до конца, используя достаточно большие K.   -  person theJollySin    schedule 01.05.2012
comment
Вас интересуют решения с использованием графовых алгоритмов? Я несколько раз использовал алгоритмы графа, чтобы найти кратчайшие пути на традиционных картах на основе графов. (И, знаете ли, если этого достаточно для Google Maps, должно быть достаточно и для вас.)   -  person theJollySin    schedule 01.05.2012
comment
@theJollySin: Пожалуйста, прочтите мой предыдущий комментарий. И я не прошу кратчайшего пути (очень простую проблему для решения), я прошу размещения башен, которые создают самый длинный кратчайший путь.   -  person BlueRaja - Danny Pflughoeft    schedule 01.05.2012
comment
@BlueRaja - Если вы хотите быть на 100% уверены в правильности своего решения, я считаю, что вам нужно будет найти множество «кратчайших путей». В постановке проблемы подразумевается, что «самый длинный путь», который вы ищете, на самом деле является кратчайшим путем вокруг новых стен. Ваш трехэтапный анализ будет включать: (1) разумное размещение новых стен рядом со старыми, (2) поиск кратчайшего пути вокруг новых стен и (3) сравнение всех новых конструкций стен. Хотя, возможно, вы могли бы определить какие-то почти 100% краткие рекомендации по возведению стен, которые обычно работают. Не знаю, легко ли найти такие правила.   -  person theJollySin    schedule 01.05.2012
comment
Помните, что вопросы программирования в виде интерактивной доски очень актуальны на сайте Разработка программного обеспечения.   -  person    schedule 02.05.2012


Ответы (8)


Я представляю жадный подход, и он, возможно, близок к оптимальному (но я не смог найти коэффициент приближения). Идея проста, мы должны заблокировать ячейки, находящиеся в критических местах Лабиринта. Эти места могут помочь измерить связность лабиринта. Мы можем рассмотреть возможность соединения вершин и найти минимальный разрез вершины, который разделяет начало и конец: (s, f). После этого удаляем несколько критических ячеек.

Чтобы превратить его в граф, возьмем двойник лабиринта. Найдите на этом графе минимальное сечение вершины (s, f). Затем мы исследуем каждую вершину этого разреза. Мы удаляем вершину, ее удаление увеличивает длину всех путей s, f или, если она находится в пути минимальной длины от s до f. После удаления вершины рекурсивно повторите описанный выше процесс в течение k раз.

Но здесь есть проблема, это когда мы удаляем вершину, которая пересекает любой путь от s до f. Чтобы предотвратить это, мы можем утяжелить узел резки как можно выше, что означает сначала вычислить минимум (s, f) вырезать, если результатом вырезания является только один узел, сделайте его взвешенным и установите высокий вес, например n ^ 3, для этой вершины, теперь снова вычислить минимум s, f cut, единственная вершина разреза в предыдущем вычислении не принадлежит новому разрезу из-за ожидания.

Но если есть только один путь между s, f (после нескольких итераций), мы не сможем его улучшить. В этом случае мы можем использовать обычные жадные алгоритмы, такие как удаление узла из одного из кратчайших путей от s до f, который не принадлежит ни одному разрезу. после этого мы можем иметь дело с минимальным разрезом вершины.

Время работы алгоритма на каждом шаге:

min-cut + path finding for all nodes in min-cut
O(min cut) + O(n^2)*O(number of nodes in min-cut)

И поскольку количество узлов в минимальном разрезе не может быть больше, чем O (n ^ 2), в очень пессимистической ситуации алгоритм - O (k n ^ 4), но обычно он не должен занимать больше, чем O (k < / em> n ^ 3), поскольку обычно алгоритм min-cut доминирует при поиске пути, также обычно поиск пути не занимает O (n ^ 2).

Я полагаю, что жадный выбор - хорошая отправная точка для алгоритмов имитации отжига.


PS: минимальное вырезание вершины аналогично минимальному вырезанию вершины, и аналогичный подход, такой как max-flow / min-cut, может применяться к минимальному вырезанию вершин, просто предположим каждая вершина как две вершины, одна V i, одна V o, означает ввод и вывод, также преобразование неориентированного графа в ориентированный несложно.

person Saeed Amiri    schedule 01.05.2012
comment
Привет, Саид. Извините, у меня еще не было времени попробовать это. Я согласен с тем, что это, вероятно, станет хорошей отправной точкой для имитации отжига и будет по-прежнему полезен в более сложных ситуациях, которые меня действительно интересуют (несколько контрольных точек между началом и концом; телепорты и т. Д.) . Я дам за этот ответ награду, если в следующий час не появится что-нибудь получше. Я дам вам знать, как это работает - спасибо! - person BlueRaja - Danny Pflughoeft; 07.05.2012
comment
Также вас может заинтересовать связанный с этим вопрос, который я только что разместил здесь - person BlueRaja - Danny Pflughoeft; 07.05.2012
comment
@ BlueRaja-DannyPflughoeft, Хороший вопрос :), Кажется, это место лучше, но CS.StackExchange тоже неплох для этого. - person Saeed Amiri; 07.05.2012

легко показать (доказательство пусть в качестве упражнения для читателя), что достаточно найти решение, чтобы каждая из K блокад была помещена на текущий маршрут минимальной длины. Обратите внимание: если существует несколько маршрутов минимальной длины, необходимо учитывать их все. Причина в том, что если вы не наложите какие-либо из оставшихся блокад на текущий маршрут минимальной длины, он не изменится; следовательно, вы можете поставить первую доступную блокаду сразу во время поиска. Это ускоряет даже поиск методом перебора.

Но есть еще оптимизации. Вы также всегда можете решить поставить следующую блокаду так, чтобы она стала ПЕРВОЙ блокадой на текущем маршруте минимальной длины, т. Е. Вы работаете так, чтобы, если вы разместите блокаду на 10-м квадрате маршрута, вы отметите квадраты 1 ..9 как «постоянно открытый», пока вы не вернетесь назад. Это снова экономит экспоненциальное количество квадратов для поиска во время поиска с возвратом.

Затем вы можете применить эвристику, чтобы сократить пространство поиска или изменить его порядок, например сначала попробуйте те размещения блокады, которые больше всего увеличивают длину текущего маршрута минимальной длины. Затем вы можете запустить алгоритм поиска с возвратом в течение ограниченного периода времени в реальном времени и выбрать лучшее решение, найденное на данный момент.

person Antti Huima    schedule 07.05.2012
comment
Вы всегда можете решить поставить следующую блокаду так, чтобы она стала ПЕРВОЙ блокадой на текущем маршруте минимальной длины - я не понимаю, как это правда. Возможно, все башни K нужно разместить в середине маршрута (скажем, есть проем размером K, обход которого займет много времени). - person BlueRaja - Danny Pflughoeft; 08.05.2012
comment
Я думаю, это плохо сформулировано. Это означает, что вы можете организовать поиск таким образом, чтобы всякий раз, когда вы блокируете квадрат текущего минимального маршрута, вы обязуетесь не ставить блокаду ни на один из предыдущих квадратов на том же маршруте позже во время поиска. Легко показать, что это не исключает никаких решений из поиска. - person Antti Huima; 08.05.2012
comment
Я совершенно забыл, что это было здесь, и на самом деле заново открыл ваш алгоритм, пытаясь найти способ поиска улучшений для существующих лабиринтов (хотя это не очень полезно для фактического создания лабиринтов, так как пространство поиска WAYYY слишком велико - даже для небольшого лабиринта больше всего башен, в которых я могу проверить улучшения менее чем за час, составляет 3). Спасибо! - person BlueRaja - Danny Pflughoeft; 18.06.2012

Я считаю, что мы можем свести содержащуюся проблему максимального многообразия к логической удовлетворяемости и показать NP-полноту с помощью любого зависимость от этой подзадачи. Из-за этого предоставленные алгоритмы spinning_plate приемлемы в качестве эвристики, предварительные вычисления и машинное обучение разумны, и уловка сводится к поиску наилучшего эвристического решения, если мы хотим сделать здесь грубую ошибку.

Рассмотрим такую ​​доску:

..S........
#.#..#..###
...........
...........
..........F

Это имеет множество проблем, которые приводят к сбою жадных и привязанных к воротам решений. Если мы посмотрим на этот второй ряд:

#.#..#..###

Наши логические элементы расположены в двумерном массиве с нулевым значением, отсортированном как [row][column]:

[1][4], [1][5], [1][6], [1][7], [1][8]

Мы можем перерисовать это как уравнение, чтобы удовлетворить блок:

if ([1][9] AND ([1][10] AND [1][11]) AND ([1][12] AND [1][13]):
    traversal_cost = INFINITY; longest = False # Infinity does not qualify

Исключая бесконечность как неудовлетворительный случай, мы возвращаемся назад и передаем это как:

if ([1][14] AND ([1][15] AND [1][16]) AND [1][17]:
    traversal_cost = 6; longest = True

И наши скрытые логические отношения попадают в эти ворота. Вы также можете показать, что геометрические доказательства не могут фрактализироваться рекурсивно, потому что мы всегда можем создать стену ровно N-1 ширины или высоты, и это представляет собой важную часть решения во всех случаях (следовательно, разделяй и властвуй вам не поможет).

Кроме того, поскольку отклонения в разных строках значительны:

..S........
#.#........
...#..#....
.......#..#
..........F

Мы можем показать, что без полного набора вычислимых геометрических тождеств полное пространство поиска сводится к N-SAT.

В дальнейшем мы также можем показать, что это тривиально для проверки и неполиномиально для решения, когда количество ворот приближается к бесконечности. Неудивительно, что именно поэтому игры в жанре Tower Defense остаются такими увлекательными для людей. Очевидно, желательно более строгое доказательство, но это лишь скелет.

Обратите внимание, что вы можете значительно уменьшить число n в соотношении n-select-k. Поскольку мы можем рекурсивно показать, что каждое возмущение должно лежать на критическом пути, и поскольку критический путь всегда вычислим за время O (V + E) (с некоторыми оптимизациями для ускорения работы для каждого возмущения), вы можете значительно уменьшить свои область поиска за счет поиска в ширину каждой дополнительной башни, добавленной на доску.


Поскольку мы можем допустить O (n ^ k) для детерминированного решения, эвристический подход является разумным. Таким образом, мой совет находится где-то между ответом spinning_plate и Soravux, посвященный методам машинного обучения, применимым к этой проблеме.

Нулевое решение: используйте приемлемый, но неоптимальный ИИ, в котором spinning_plate предоставляет два пригодных для использования алгоритма. На самом деле, это приблизительное количество наивных игроков, подходящих к игре, и этого должно быть достаточно для простой игры, хотя и с высокой степенью использования.

Решение 1-го порядка: Используйте базу данных. Учитывая формулировку проблемы, вы не совсем продемонстрировали необходимость вычислять оптимальное решение на лету. Следовательно, если мы ослабим ограничение приближения к случайной плате без информации, мы можем просто предварительно вычислить оптимум для всех K допустимых значений для каждой платы. Очевидно, это работает только для небольшого числа плат: с V! потенциальными состояниями платы для каждой конфигурации мы не можем терпимо предварительно вычислить все оптимумы, поскольку V становится очень большим.

Решение 2-го порядка: используйте этап машинного обучения. Продвигайте каждый шаг по мере того, как вы закрываете пробел, который приводит к очень высокой стоимости обхода, до тех пор, пока ваш алгоритм не сойдется или не будет найдено более оптимальное решение, чем жадное. Здесь применимо множество алгоритмов, поэтому я рекомендую преследовать классику и литературу для выбора правильного который работает в рамках ограничений вашей программы.

Лучшая эвристика может быть простой тепловой картой, созданной локальным рекурсивный обход в глубину с учетом состояния, сортировка результатов по наиболее или менее часто просматриваемым после обхода O (V ^ 2). Просматривая этот вывод, вы жадно идентифицируете все узкие места, и сделать это, не сделав пути невозможным, вполне возможно (проверка на O (V + E)).

Собирая все вместе, я бы попробовал пересечь эти подходы, объединив тепловую карту и идентификационные данные критического пути. Я предполагаю, что здесь достаточно, чтобы предложить хорошее функциональное геометрическое доказательство, удовлетворяющее всем ограничениям задачи.

person MrGomez    schedule 01.05.2012
comment
Еще немного поиграв с этим, я понял, что это n choose k, где подзадача замыкания поднимает его до NP-полноты. Простите за каламбур, но это можно обойти с помощью геометрических тождеств и наблюдения, что по крайней мере одно из возмущений должно лежать на критическом пути. Поскольку это выполняется рекурсивно, ВСЕ возмущения должны лежать на критическом пути! Хм. Думаю, мне нужно еще поиграть с этим, чтобы увидеть, смогу ли я предложить закрытое решение проблемы. А пока мы можем показать, что каждое возмущение должно быть в наборе, вычисляемом в O (V + E) в результате поиска в ширину. - person MrGomez; 01.05.2012
comment
Я думал об этом (каламбур) со своим решением, хотя, конечно, я не предлагаю кода :) - person robert king; 01.05.2012
comment
Я не думаю, что эвристика вращающейся тарелки вообще будет работать хорошо по причинам, которые я упомянул в его ответе. Не могли бы вы еще подробнее рассказать о тепловой карте? Боюсь, я не понимаю предложения. - person BlueRaja - Danny Pflughoeft; 02.05.2012
comment
@ BlueRaja-DannyPflughoeft Конечно. Краткая идея состоит в том, чтобы создать глобальную таблицу для каждого узла в графе, а затем выполнить обход узлов в глубину с привязкой к стеку от начала до конца, увеличивая их соответствующие элементы в глобальной таблице каждый раз, когда вы сталкиваетесь с ними. Затем отсортируйте элементы таблицы в порядке убывания количества встреч, жадно выбирая их спереди, чтобы определить простые и сложные узкие места. Это не особенно быстрый подход (O (V ^ 2)), и его можно улучшить (см. Мое краткое доказательство о рекурсивном поиске элементов на критическом пути). - person MrGomez; 02.05.2012
comment
Хитрость здесь в том, что каждый обход должен также поддерживать свое собственное состояние. Уместно обновить быстрый ответ, чтобы убедиться, что он четко выражен. - person MrGomez; 02.05.2012

Рискуя заявить очевидное, вот один алгоритм

1) Find the shortest path
2) Test blocking everything node on that path and see which one results in the longest path
3) Repeat K times

Наивно, это займет O (K * (V + E log E) ^ 2), но вы можете с небольшой работой улучшить 2, только пересчитав частичные пути.

Как вы упомянули, просто попытаться разорвать путь сложно, потому что, если в большинстве разрывов просто добавляется длина 1 (или 2), трудно найти узкие места, которые приводят к большому выигрышу.

Если вы сделаете минимальный разрез вершины между началом и в конце вы найдете узкие места для всего графика. Один из возможных алгоритмов:

1) Find the shortest path 
2) Find the min-cut of the whole graph
3) Find the maximal contiguous node set that intersects one point on the path, block those.
4) Wash, rinse, repeat

3) является большой частью, и почему этот алгоритм тоже может работать плохо. Вы также можете попробовать

  • наименьший набор узлов, который соединяется с другими существующими блоками.
  • поиск всех групп смежных вершин в разрезе вершин, проверка каждой из них на самый длинный путь по первому алгоритму

Последний из них может быть наиболее многообещающим.

Если вы найдете минимальную вершину, вырезанную на всем графе, вы найдете узкие места для всего графа.

person dfb    schedule 26.04.2012
comment
№1 терпит неудачу в простом (и чрезвычайно распространенном) случае, когда у вас есть дроссельная заслонка шириной в два пробела. Закрытие этих двух пространств заставит врагов ходить вокруг, но закрытие только одного места будет иметь очень небольшой эффект. Ваше второе предложение интересно, но мне трудно понять, как его можно эффективно применить. - person BlueRaja - Danny Pflughoeft; 26.04.2012
comment
@ BlueRaja-DannyPflughoeft - Согласен. Вот тут-то и появляется часть минимального сокращения. Я собираюсь немного отредактировать свой ответ, чтобы сделать его более ясным, но я не знаю, не экспериментируя, сработает ли что-нибудь из этого. - person dfb; 26.04.2012
comment
Если все еще неясно, скажите, какая часть сбивает меня с толку, чтобы я мог попробовать (я просто конкретизирую ответ, заметьте), чтобы уточнить. Моя интуиция подсказывает, что поиск групп смежных вершин в максимальном разрезе вершин может дать хорошие результаты. - person dfb; 27.04.2012
comment
Я до сих пор не следую вашему алгоритму - если максимальный набор смежных узлов, который пересекает одну точку на пути, равен min-cut, то мы не можем его разрезать, так как это заблокирует начать с финиша. В приведенном выше примере это произойдет после размещения только одной башни. Что нам тогда делать? Обратите внимание, что эта проблема гарантированно возникнет после того, как мы заблокируем все, кроме одного исходного min-cut. - person BlueRaja - Danny Pflughoeft; 02.05.2012
comment
В случае, когда вы определяете единственную точку разреза, которую нельзя удалить, мы знаем, что этот узел никогда не будет разрезан и что через него также есть путь. Таким образом, вы бы снова запустили алгоритм, как если бы начальной точкой был узел, примыкающий к нему. - person dfb; 02.05.2012
comment
В конце концов, вы заблокируете большинство узких мест. Если у вас есть дополнительные барьеры, которые нужно разместить, то вы делаете зигзагообразный узор после этого, так как на самом деле не имеет значения, находитесь ли вы (в примере) в верхнем левом углу или ближе к раковине. - person dfb; 02.05.2012
comment
Я реализовал ваш вариант №1 и в некоторых случаях обнаружил, что он близок к оптимальному. github.com/ChrisLundquist/Tower-Defense-Mazer/blob/ master / @ BlueRaja-DannyPflughoeft, проблема с двумя космическими дросселями не является проблемой. Вы пересчитываете путь и блокируете второе пространство, если это будет кратчайший путь. Вы повторяете, пока нет пути, затем отменяете последний шаг. - person EnabrenTane; 10.05.2013
comment
@EnabrenTane: Это не проблема; это фактически доказательство того, что этот алгоритм неоптимален (ваше предложение также неоптимально, поскольку оно не работает для случая с тремя блоками). Однако я реализовал этот алгоритм; но, к сожалению, он очень редко бывает близким к оптимальному. Например, попробуйте решить головоломки на pathery.com. Отжиг оказался намного лучше. - person BlueRaja - Danny Pflughoeft; 11.05.2013

Вот такая мысль. В вашей сетке сгруппируйте соседние стены в острова и рассматривайте каждый остров как узел графа. Расстояние между узлами - это минимальное количество стен, необходимое для их соединения (блокирования врага).

В этом случае вы можете начать максимизировать длину пути, заблокировав самые дешевые дуги.

person Vladimir Sinenko    schedule 26.04.2012

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

Я предлагаю использовать модифицированный поиск в ширину с приоритетной очередью длины K, отслеживающей лучшие пути K между каждым островом.

Для каждого острова из соединенных стен я бы сделал вид, что это свет. (специальный свет, который может излучать только горизонтальные и вертикальные лучи света)

Используйте трассировку лучей, чтобы увидеть, на какие другие острова может попасть свет

скажем, Island1 (i1) попадает в i2, i3, i4, i5, но не попадает в i6, i7 ..

тогда у вас будет строка (i1, i2), строка (i1, i3), строка (i1, i4) и строка (i1, i5)

Отметьте, что расстояние до всех точек сетки равно бесконечности. Установите начальную точку как 0.

Теперь используйте поиск в ширину с самого начала. Для каждой точки сетки отметьте расстояние от этой точки сетки как минимальное расстояние до ее соседей.

Но .. вот в чем загвоздка ..

каждый раз, когда вы добираетесь до точки сетки, которая находится на линии () между двумя островами, вместо того, чтобы записывать расстояние как минимум его соседей, вам нужно сделать ее приоритетной очередью длиной K. И записать K кратчайших путей на эту строку () из любой другой строки () s

Затем эта приоритетная очередь остается неизменной, пока вы не дойдете до следующей строки (), где она объединяет все приоритетные вопросы, поступающие в эту точку.

person robert king    schedule 01.05.2012
comment
Хм. Это почти похоже на Флойда-Уоршалла с очередями приоритета вместо расслабления. Обратите внимание, что можно показать, что решение Scanline работает тогда и только тогда, когда можно распознать узкие места. Если повернуть этот угол на 180 градусов, хорошей эвристикой будет тепловая карта для каждого узла, обнаруженного во время обхода вслепую. Думаю, мне нравится эта идея. - person MrGomez; 01.05.2012
comment
Спасибо друг. В то время я думал о Флойд-Уоршалле. Моя идея заключалась в том, что вместо необходимости перечислять все возможные пути, перечислять только пути, которые пересекают различные комбинации линий, и из них лучше всего запоминать только K. - person robert king; 01.05.2012
comment
Прекрасно. Такой подход определенно имеет свои достоинства. Хитрость заключается в расширении очереди приоритетов для случаев, которые делают невозможным переход. Если каждый элемент в K подвержен этому, вам потребуется еще K и так далее. Если бы не это ограничение, это работало бы как шарм. :) - person MrGomez; 01.05.2012

Вы не показали, что этот алгоритм должен работать в реальном времени, но я могу ошибаться в этом предположении. Затем вы можете предварительно рассчитать позиции блоков.

Если вы можете сделать это заранее, а затем просто заставить ИИ построить лабиринт по камню, как если бы он был своего рода деревом, вы могли бы использовать генетические алгоритмы, чтобы облегчить вашу потребность в эвристике. Вам нужно будет загрузить любую структуру генетического алгоритма, начать с популяции неподвижных блоков (ваша карта) и случайно размещенных подвижных блоков (блоков, которые будет размещать ИИ). Затем вы развиваете популяцию, делая пересечения и трансмутации над подвижными блоками, а затем оцениваете индивидуумов, давая больше вознаграждения за самый длинный рассчитанный путь. Тогда вам просто нужно будет написать эффективный с точки зрения ресурсов калькулятор путей без необходимости использования эвристики в вашем коде. В вашем последнем поколении вашей эволюции вы возьмете человека с наивысшим рейтингом, который будет вашим решением, таким образом, вашим желаемым шаблоном блока для этой карты.

Доказано, что генетические алгоритмы приведут вас в идеальной ситуации к локальным максимумам (или минимумам) за разумное время, чего может быть невозможно достичь с помощью аналитических решений на достаточно большом наборе данных (т. Е. Достаточно большой карте в вашей ситуации).

Вы не указали язык, на котором собираетесь разрабатывать этот алгоритм, поэтому я не могу предложить фреймворки, которые могут полностью удовлетворить ваши потребности.

Обратите внимание, что если ваша карта динамическая, а это означает, что карта может меняться во время итераций защиты башни, вы можете захотеть избежать этого метода, поскольку он может быть слишком интенсивным, чтобы повторно развивать все новое население каждую волну.

person Soravux    schedule 28.04.2012
comment
чтобы эффективно перекрыть короткую дорогу, вам может понадобиться 3-4-5 соседних ячеек ... любая из них сама по себе вряд ли вообще изменит результат ... из-за этого я боюсь, что у популяций, содержащих эти элементы, не так много шансов выжить и объединиться .. - person Karoly Horvath; 30.04.2012
comment
@Karoly: Верно, по этой причине отжиг, вероятно, сработает лучше. Но я надеялся, что для этой конкретной проблемы есть более интеллектуальная эвристика, чем обычная старая генетическая / отжигающая глобальная оптимизация, которая может быть применена практически к любой проблеме, но обычно дает только полуприличные результаты. - person BlueRaja - Danny Pflughoeft; 02.05.2012

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

У вас уже есть мера физической подготовки по длине пути крипов, поэтому вы можете выбрать лучшего соответственно. Я не знаю, насколько хорошо (если вообще) это приблизит лучший путь, но было бы интересно использовать его в решении.

person ehdv    schedule 03.05.2012