За последние 24 часа нас посетили 20189 программистов и 1009 роботов. Сейчас ищут 364 программиста ...

Реализация алгоритма поиска пути на php

Тема в разделе "PHP для профи", создана пользователем Ondottr, 22 окт 2018.

Метки:
  1. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    Есть карта размером 600х300(180 000 клеток)
    Два типа местности суша и вода
    Нужно сделать алгоритм передвижения для наземных и морских юнитов по карте, учитывая скорость каждого юнита.
    Вся карта храниться в БД(MySQL)

    Чтобы не обращаться каждый раз к БД для проверки типа местности, сделал файл в котором 180 000 единиц(суша) и нолей(вода)
    PHP:
    1. $section = file_get_contents('includes/map_type.txt', FALSE, NULL, $loc_id - 1, 1);
    2. If($section == 0) {
    3.     //Вода
    4. }else {
    5.     //Суша
    6. }
    Напишите с чего начать, что подучить или сделайте за меня(не беспласплатно естественно)

    Карту можно посмотреть здесь: ondottr.ho.ua
     
  2. MRSgiba

    MRSgiba Активный пользователь

    С нами с:
    22 дек 2017
    Сообщения:
    200
    Симпатии:
    32
    А по диагонали ходить можно???
     
  3. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    Да
     
  4. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    выкинуть свой "велосипед" (зима на пороге) и научиться работать с БД
     
  5. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    Я умею работать с БД
     
  6. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    подпишусь на ответы)) мне всегда было интересно как маршруты на картах строятся)
     
  7. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    я бы не назвал SELECT * FROM `table` умением работать с БД
     
  8. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    Интересно по чем вы судите мое умение работать с БД?
     
  9. MRSgiba

    MRSgiba Активный пользователь

    С нами с:
    22 дек 2017
    Сообщения:
    200
    Симпатии:
    32
    Я бы карту перевел в вид массива cell[a,b]=N, a-col, b-row, N- число 0-255(т.к. направлений всего 8, то 255 = 11111111 - кругом суша, 0 = 00000000-кругом вода). И в зависимости от текущей ячейки знал бы возможный следующий ход. А хранить это в базе или в файле или в оперативной памяти держать, это другой вопрос
     
  10. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    и так вы уже точно не сможете работать с данными на уровне СУРБД :)
     
  11. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    #11 Ondottr, 22 окт 2018
    Последнее редактирование: 22 окт 2018
  12. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Ondottr, определяешь расстояние между точкой начала А и следующей точкой В, потом от этой точки шагаешь еще один раз С, а потом сравниваешь если АС короче АВ+ВС, то точку В выкидываешь нафиг.
     
  13. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Вообще тут умение работать с БД ни при чем. Тут нужно иметь небольшое представление о теории графов и алгоритмах поиска кратчайшего пути. Кроме ячеек потребуется функция поиска соседних ячеек и дополнительный массив для поиска пути.
    А использовать можно алгоритм "заливка".
    Берется исходная ячейка (она помечается как пройденная). Загоняется все в цикл while(), из которого можно выйти либо по достижении требуемой ячейки, либо при невозможности добавить еще одну ячейку в список пройденных.
    Находятся соседние с пройденными ячейками. Они добавляются в массив и помечаются из какой ячейки в них осуществлен переход. За каждую итерацию цикла внутри этих ячеек делается шаг
    Когда в ячейке сделано необходимое количество шагов - она помечается как пройденная.
    Снова находятся соседние (но не все, а только те, на которых еще не ступала нога) ячейки и для каждой алгоритм повторяется.
    Когда будет достигнута требуемая ячейка - путь получится при движении в обратную сторону по меткам в каждой ячейке - откуда в нее попали.
    Вот тут еще есть алгоритмы.

    Если использовать ООП и паттерн "Компоновщик", то можно обойтись без массива.
     
    #13 Maputo, 22 окт 2018
    Последнее редактирование: 22 окт 2018
    Fell-x27, alexforce2 и Ondottr нравится это.
  14. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    @Maputo Спасибо, буду пробовать:)
     
  15. Ondottr

    Ondottr Новичок

    С нами с:
    24 ноя 2017
    Сообщения:
    46
    Симпатии:
    5
    Как сделать это все я разобрался)
    Большое спасибо за это @Maputo

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

    пример массива:
    array(6) {
    [0]=>int(0)
    [1]=>int(1)
    [2]=>int(1)
    [3]=>int(0)
    [4]=>int(0)
    [5]=>int(1)
    }
    индекс как id клетки карты(180000 клеток) => тип местности(0 или 1)

    а в файле просто цифры 1/0
     
    #15 Ondottr, 25 окт 2018
    Последнее редактирование: 25 окт 2018
  16. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
  17. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
  18. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Хороший вопрос. Реализация ложится на ваши плечи.
    Данный пример я привел к тому, что ваша задача схожа на нахождение пути в лабиринте.
    И так как тема мне немного знакома привел вам демонстрацию примеров.
    Не забывайте, про большое количество алгоритмов для решения задачи. Выбор (написание своего) ложится на ваши плечи
     
  19. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
  20. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    А еще можно использовать прегенерированную карту оптимальных маршрутов от каждой клетки в каждую клетку, чтобы не париться с пасфайндингом в реальном времени. Карту как раз можно хранить в БД. В качестве ключей использовать стартовую и финальную клетку, составным индексом. Если подразумевается, что на протяжении всего маршрута от А до Б каждый шаг оптимален, то, как следствие, оптимальный маршрут от А до Б протяженностью N клеток включает в себя N оптимальных маршрутов. Подвозим деревья или бор и хранилище стало более оптимизированным.
     
    Valick нравится это.