Родовыми целямиОптимального расположения узлов в небольшой сетке, где выходной узел является функцией того, что узлов это рядом с
Скажет, у нас есть «небольшая» 10x10 сетка с некоторыми фиксированными узлами @ размещена в случайных позициях
. . . . . . . . . .
. . . . . . . . . .
. . . @ . . . . . .
. . . @ . . . . . .
. . . . . . . . . .
. . . . . @ . . . .
. . . . . . . . . .
. . . . . . . @ . .
. . . . . . . . . .
. . . . . . . . . .
И у нас есть ~ 30 узлов, стоимость которых зависит от того, что узлы это рядом (с смежности определяется как любой из 8 пунктов, окружающих место). То есть, если мы рассмотрим узлы А и B размещены на карте
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . A @ . . B . . . . . A @ . . . . . .
. . . @ . . . . . . . B . @ . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . @ . . . . . . . . . @ . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . @ . . . . . . . . . @ . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
выход А и В может быть различным в этих двух картах, потому что А и В примыкают во второй, но не в первый.
Наша цель состоит в том, чтобы поместить все узлы на карте таким образом, чтобы сумма всех узлов является максимальным (или по крайней мере очень хорошо.)
Дополнительные ограничения для моей конкретной проблемы
- Существует около 8 'классов' узлов. Все узлы в каждом классе ведут себя одинаково, поэтому это можно использовать для уменьшения пространства поиска.
- Определенные узлы доминируют над общим значением, поэтому знание этого позволяет мне оптимизировать вокруг этих основных узлов.
- У каждого узла обычно есть только два или три других класса узлов, которые увеличивают его значение, когда оно смежно с узлом этих классов.
- Все значения являются ≥ 0.
- Я хотел бы найти хорошие припадки в считанные секунды .. так что есть некоторые возможности для вычислений, но довольно хорошее решение в течение 5 секунд лучше, чем идеальное решение в 2 дней.
Наивные жадный подход
Что я делаю сейчас принимает простой жадный подход, то подстройка результат.
Я просматриваю все места на сетке и рассматриваю их для всех узлов, которые я еще не разместил, и выбираю лучшее место размещения, которое я нахожу. Если есть несколько «лучших» позиций, я выбираю их случайным образом. Я делаю это до тех пор, пока не будут размещены все узлы.
После этого первоначального процесса я выбираю узел наугад и стараюсь найти лучшее место для него, глядя на все открытые места. Я рассматриваю эффект, который перемещает узел на самом узле, а также соседние соседи, поэтому я не перемещаю его, если он уже находится в лучшем месте в целом. Я делаю это несколько тысяч раз, чтобы «точно настроить» мой макет.
Из-за случайных факторов я могу получать очень разные выходы с одинаковыми входами, поэтому я выполняю этот процесс несколько раз и беру наилучший результат.
Вопрос
Как я могу сделать лучше, чем этот наивный жадный подход?
Я чувствую, что должно быть гораздо лучшее решение, которое учитывает априорную информацию о смежности, но это ускользает от меня. Любые мысли, ссылки или советы будут очень благодарны!
Возможно, стоит определить оптимальное размещение на нескольких небольших случайных сетках, используя меньшее количество узлов (например, что-то сговорчивое) - это может помочь предложить эвристику, которую вы можете применить к полной проблеме. –
Таким образом, мой страх с оптимизацией небольших сеток заключается в том, что я начну искать локальные оптимумы и зависеть там. Думаете ли вы, что это справедливая проблема? – hexist
Это актуальная проблема - идея состоит в том, чтобы использовать что-то вроде исчерпывающего поиска в поиске по меньшей сетке, чтобы вы гарантированно нашли глобальный оптимум. Если повезет, появится очевидная картина того, как выглядит оптимальный. –