как найти точку, ближайшую к большинству точек, когда у нас есть несколько блоков между ними! (в массиве 2D - Змейка)

Я работаю над игрой со змеями (Nibbles в Linux), в которую играют на поле 60 * 60, где четыре змеи соревнуются за яблоко, которое расположено случайным образом.

Я реализовал движение своей змеи с помощью алгоритма A* (A star).

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

Пожалуйста, предложите любой хороший способ или любой алгоритм, который может помочь мне найти это место.

Вот изображение игры. Красные точки — это головы змей.

снимок SnakeGame


person M0εiπ    schedule 26.03.2012    source источник


Ответы (4)


Я протестировал несколько способов и, наконец, решил использовать этот способ:

Я думаю, что лучший способ - создать 2D-массив размером: 60 * 60 , затем для каждого узла (x) массива вычислить, сколько узлов поля, по которым можно пройти! (не блокировать), является ли этот узел ( х) ближайший к.

то ответ будет Максимальное количество, то я ставлю этому узлу цель.

но поскольку я должен найти следующий ход менее чем за 0,1 секунды, и для выполнения этой работы есть 4 цикла размером: 60, (60 ^ 4), и когда я его найду, алгоритм A * тоже будет запущен, эта работа будет никогда не выполняться менее чем за 0,1 сек.

Итак, поскольку Змея не может двигаться по диагонали и движется только вверх, вниз, вправо, влево, я решил не проверять все узлы, так как в каждом цикле (0,1 сек) я могу двигаться только на 1 единицу, я решил чтобы проверить только 4 узла (вверх, вниз, влево, вправо) и перейти к узлу, количество которого равно Max.

теперь он работает почти правильно. ;)

person M0εiπ    schedule 28.03.2012
comment
Кажется, это хорошее решение, но я не думал об ошибках вашего решения, конечно, если вы считаете, что это лучше, чем другие ответы, вы можете пометить это как ответ. - person Saeed Amiri; 03.04.2012

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

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

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

Изменить: см. комментарии ниже для более выгодного решения.

person Community    schedule 26.03.2012
comment
не то, что просят, однако, не так ли? то, о чем просят, зависит от положения других змей. - person andrew cooke; 26.03.2012
comment
@andrewcooke Он ищет место, которое ближе всего ко всем остальным местам. Вот куда он хочет направиться, если он не самый близкий к текущему яблоку, в ожидании того, что он будет быстрее к следующему. - person ; 26.03.2012
comment
я так не думаю. Я думаю, оптимальное место ближе к большему количеству мест, чем любая другая змея. нет смысла приближаться ко многим местам, если другие змеи находятся ближе. - person andrew cooke; 26.03.2012
comment
на самом деле, перечитывая вопрос, вы можете быть правы (в этом случае они задают не самый лучший вопрос, но это проблема спрашивающего). если вы отредактируете свой ответ (чтобы разблокировать мой голос), я удалю отрицательный голос. - person andrew cooke; 26.03.2012
comment
@andrewcooke Готово. Вы также должны предложить свой ответ, который, хотя и может быть не совсем тем, о чем вас просят, является лучшим ответом на суть проблемы. - person ; 26.03.2012
comment
К сожалению, я не вижу эффективного способа его расчета. - person andrew cooke; 26.03.2012
comment
@andrewcooke, KG, спасибо за ваши комментарии, скажем еще раз, я ищу место, которое в моей текущей ситуации, узлы, к которым я ближе всего, для меня Макс. это количество может быть меньше, чем количество Других Змей, я имею в виду, что вероятно, что другая Змея будет Ближайшей к большему количеству мест, я просто ищу место, в котором это количество для меня максимальное, поэтому я старался изо всех сил; ) - person M0εiπ; 26.03.2012
comment
@КГ. ,andrewcooke... Я думаю, что найти оптимальное решение непросто, и вам лучше знать, что я должен найти следующий ход менее чем за 0,1 секунды... Так что, если у вас есть решение, даже не оптимальное, я буду рад узнать... вот простой пример: координация следующего хода (60-avgX , 60-avgY) где 60 высота и ширина поля и 'avgX' , 'avgY' средняя координация других голов Змеи. - person M0εiπ; 26.03.2012

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

Вы можете разделить карту на четыре масштаба (по часовой стрелке), верхний левый, верхний правый, нижний правый и нижний левый (1,2,3,4). Мы проверяем это между двумя змеями: если яблоко в настоящее время находится в масштабе 1 (предположим, что центр находится в среднем), а вы находитесь в центре карты, ваш противник может быть в масштабе 1,2,3,4 (опять же предположим, что оно находится в центре этой карты). масштабирует, чтобы получить среднее значение более простым способом), если он находится в масштабе 1, у него больше шансов (1-0), если он в масштабе 2 или 4, ваше расстояние равно sqrt (2)/2, а расстояние до вашего противника равно 1, поэтому вы ближе всего , и, наконец, если ваш противник находится в масштабе 3, ваше расстояние равно sqrt (2)/2, а расстояние вашего противника равно sqrt (2), поэтому в 3 случаях с одним противником у вас больше шансов.

Но поскольку ваша фигура имеет несколько блоков, вы должны вычислить положение центра другим способом, фактически, для каждой точки в вашей сетке вычислите ее расстояние до всех других точек. это займет 60 ^ 2 * 60 ^ 2, что можно сделать быстро. и найдите ячейки с минимальной общей суммой (вы можете выбрать лучшие 10 ячеек), эти ячейки могут быть вашими центрами, каждый раз, когда вы должны перемещаться из одного центра в другой (за исключением случаев, когда вы находитесь ближе всего к яблоку или ваша змея ест яблоко и хочет вернуться к ближайшему центры).

person Saeed Amiri    schedule 26.03.2012
comment
опять же, это не то, о чем просят. если есть один конкурент в крайнем левом углу, то лучше всего находиться справа от него. это дает вам преимущество перед конкурентом для любого яблока, не входящего в первые два столбца. ваше решение не так хорошо, как это. - person andrew cooke; 26.03.2012
comment
извините - см. мой другой комментарий здесь. если вы отредактируете этот ответ (что угодно, просто чтобы обойти ограничения stackoverflow), я удалю отрицательный голос. - person andrew cooke; 26.03.2012

Ближайшим к максимальному количеству мест является центр, как заявляли другие. Ближе к максимальному количеству локаций, чем у других змей, есть гораздо, разные и более сложные вопросы. В этом случае я бы A* голову каждой змеи, чтобы увидеть, у кого больше квадратов под контролем. Это базовая оценка. Затем, когда я рисую пустое место, я выбрал Монте-Карло случайный набор точек на карте и выбрал точку, которая дала наивысший балл, в качестве пункта назначения. Если бы у вас была вычислительная мощность, вы могли бы попробовать каждую точку сетки и выбрать лучшую, как К.Г. предложено, но это может стать довольно интенсивным.

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

person Michael Dorgan    schedule 26.03.2012
comment
+1 за измерение А* с головы змеи. Это включает в себя некоторые опасения Эндрю Кука по поводу оптимизации вашей целевой области для ваших противников и некоторые идеи Саида Амири по зонированию. Я хотел бы увидеть видео работы этого алгоритма! - person ; 27.03.2012