JavaRush/Java блог/Архив info.javarush/Реализация стратегии.
Joysi
41 уровень

Реализация стратегии.

Статья из группы Архив info.javarush
участников
Судя по записям задач поиска контуров, brainfuck кодирования многим интересна алгоритмика, как одна из сторон программирования. Предлагаю вам реализовать "мозги" следующей игры. И если, авторов решения будет несколько, можно устроить "соревнование". Я накидал код реализации игры с выдачей результатов на консоль. Исходники на https://github.com/maratsr/MatrixGame Для реализации своего алгоритма необходимо создать реализацию интерфейса IGameStrategy и реализовать в нем: 1) метод getTurn(). Где собственно и происходит поиск оптимального хода 2) метод toString(). Просто вывод информации о вашем методе. Достаточно: 1) добавить код в getTurn() класса MyGameStrategy, где прописать алгоритм. Весь упор именно на алгоритмику, а не собственно знание Java. 2) добавить его одним из игроков в метод static main класса Game для игры. Всего то пару десятков строк реализации... Для облегчения написания собственного алгоритма я привел примеры реализаций (как заготовки): NonZeroFirstValueGameStrategy - Поиск первого доступного элемента MaxValueGameStrategy - Поиск максимального значения в строке или колонке RandomValueGameStrategy - Случайный ход Для тестирования вашего алгоритма можете посоревноваться с ними. Можете также изменить кол-во игроков, размер начальной матрицы и т.п. Game - основной класс, реализующий игру: - Генерирует поле игры. - Создает игроков с их стратегиями. - В процессе игры передает ход стратегиям и ограничивает время принятия решения (в случае его превышения, прерывает стратегию). - Выводит в консоль ход игры и ее результат. Вариантов реализации прочих стратегий вагон: Перебор на первые 2,3,4... хода с выбором лучшего ("ветви и границы"). Можете по ходу нахождения хода присваивать его аргументу функции move, процесс перебора программа прервет и в качестве решения возьмет ход, найденный до этого момента. Подсчет сумм элементов колонок или строк матрицы + поиск с учетом этого... Можно добавить элементы случайности... и т.п. и т.д. P.S. Буду также благодарен, если кто подскажет более правильный способ (чем Executor + Future) для ограничения времени работы любого метода (который не знает что его время выполнения лимитировано).">
Комментарии (4)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
fatfaggy
Уровень 26
1 ноября 2017, 22:33
перед первым ходом строим граф/дерево всех возможных ходов. выбираем самый оптимальный (у кого результат даст максимальное число).
это если у каждого игрока свое поле.

если же на одном поле играет одновременно сразу несколько игроков — тогда придется строить такой граф на каждом ходе. точнее, «вычеркивать» невозможные ходы. при поле 10*10 я думаю построение графа займет несколько секунд максимум. это если работать с примитивами, конечно же)) редактирование — значительно быстрее (просто выкидываем из деревьев ненужные ветки).

ну или если совсем просто — тогда обычный жадный алгоритм. который, в принципе, можно улучшить введя «пропуск хода», если есть реальная возможность на следующем ходу получить число значительно большее, чем на этом (например, ход доступен для поиска по рядку, в рядке остались цифры 1, 3, 7, 9. но если пропустить ход — станет доступен поиск по столбцу, где цифры 81, 94, 97, 99). но если его еще улучшить — тогда надо смотреть на два шага вперед, а если еще улучшить — то на три, итд. в итоге снова же задача сводится к построению дерева))

так что я думаю, основная задача тут — выбрать такую структуру данных, которая бы давала хороший результат именно в момент обновления весов в графе/дереве, а это уже дискретка и всякий матан)) так что кто знает такую структуру — пишите))
fatfaggy
Уровень 26
1 ноября 2017, 22:46
или же смесь обоих вариантов.

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

но против такого противника может быть легко играть)) сам просчитываешь его дерево шагов, получаешь тот, по которому противник «идет» и «выбиваешь» ему оттуда цифры)) ну это когда у самого уже есть большое преимущество. ну или наоборот, когда сильно отстаешь и выиграть уже нет возможности и можно просто не дать противнику набрать рекордные суммы)) но насколько я знаю, то согласно теории игр, обычно более эффективными оказываются «добрые» алгоритмы))
в общем, тут уже все зависит от времени, которое выделяется на каждый шаг.
DefNeo
Уровень 36
10 марта 2017, 19:20
Типа героев что ли?))
JuriMik
Уровень 26
2 марта 2017, 01:39
Почти неделя без комментов. Мне кажется, достаточно объемное задание по времени. Да и по сложности не для джунов (ИМХО, разумеется). Это так, на первый взгляд. Я попробовал бы заняться, т.к. реально интересная задача для меня, но занят на работе, свободного времени пока нет