Adopt wrote: > Здравствуйте, raskin, Вы писали: > > R>Разные похожие ошибки повторяются иногда. Я к тому же не всегда их > R>замечаю. А Setup Board, например, здесь нет. Из-за отсутствия истории с > R>указанием всех ходов и принадлежностей всех клеток после каждого поиск > R>нестыковок ручной => трудоёмкий. А опыта .jar -> .class -> .java или > R>писания на Java у меня нет, поэтому самому добавлять мне не хочется. > R>Если получится могу написать и отладить переворот фишек на Pascal и > R>отослать вам хоть .exe, хоть ELF (с исходником, не вопрос) — вам какой > R>формат ближе (я не уверен, что сделаю, но шанс есть)? > > Вот новая версия где исправлен баг > http://rsdn.ru:80/File/39660/ReversiUpd.jar > > Здесь все нормально? > > история будет выводиться в консоль в следующей версии
Adopt wrote: > Здравствуйте, raskin, Вы писали: > > R>Adopt wrote: >> > Здравствуйте, raskin, Вы писали: >> > > R>Код верификатора (консольный на Паскаль; ELF — по просьбе/когда соберусь > R>выложу архив EXE): > R>http://rsdn.ru:80/File/40778/reversi_src.zip > R>http://rsdn.ru:80/File/40778/reversi_elf.zip > > Спасибо. > > Но не очень понятно что делает функция make_move? > она делает ход компьютера?
Нет. Это же верификатор. Программа работает как доска, ругающаяся при
нарушении правил. Вход описан write_usage, а структура такова:
good_piece — этот символ является чьей-то фишкой
good_field — этот символ может описывать поле
TBoard:
init — заполнить доску пустыми клетками
to_string — строка описания доски
set_field — задать состояние заданной клетки (для установки позиции)
make_move — сделать ход заданной стороны в заданную клетку (с контролем
возможности и переворотами)
num_flip — подсчитать сколько вражеских фишек надо перевернуть вдоль
луча в заданном направлении при ходе в заданную точку
do_flips — перевернуть фишки в условиях предыдущего пункта
make_four — поставить на доске начальную позицию
read_it — считать доску с консоли в кратком формате
do_keyboard_query — запросить и выполнить действие
соответственно, "s62b" поставит чёрную фишку в 6:2, что бы ни стояло на
доске, а "m62b" поставит её туда только если можно, причём сделает
перевороты (тестировал — ошибок не нашёл). Аналогично set_field(6,2,'b')
и make_move(6,2,'b') .
Здравствуйте, raskin, Вы писали:
R>Adopt wrote: >> Здравствуйте, raskin, Вы писали: >> >> R>Adopt wrote: >>> > Здравствуйте, raskin, Вы писали: >>> >
R>соответственно, "s62b" поставит чёрную фишку в 6:2, что бы ни стояло на R>доске, а "m62b" поставит её туда только если можно, причём сделает R>перевороты (тестировал — ошибок не нашёл). Аналогично set_field(6,2,'b') R>и make_move(6,2,'b') .
Вот новая версия с полностью передаланными ходами,
так же во втором файле исходник на Java как расчитываются ходы
Добавлен лог, то есть все ходы выводятся на консоль
Adopt wrote: > Здравствуйте, raskin, Вы писали: > > R>Adopt wrote: >> > Здравствуйте, raskin, Вы писали: >> > >> > R>Adopt wrote: >> >> > Здравствуйте, raskin, Вы писали: >> >> > > > R>соответственно, "s62b" поставит чёрную фишку в 6:2, что бы ни стояло на > R>доске, а "m62b" поставит её туда только если можно, причём сделает > R>перевороты (тестировал — ошибок не нашёл). Аналогично set_field(6,2,'b') > R>и make_move(6,2,'b') . > > Вот новая версия с полностью передаланными ходами, > так же во втором файле исходник на Java как расчитываются ходы > > Добавлен лог, то есть все ходы выводятся на консоль > > http://rsdn.ru:80/File/39660/ReversiNUP.jar > http://rsdn.ru:80/File/39660/src.java > > Спасибо.
Придирка насчёт консоли: перезапуск игры не выводится.
Насчёт правил: здорово, что обрабатывается пропуск хода компьютера.
Хуже, что не обрабатывается пропуск хода игроком.
Остальное, вроде бы правильно (сверял окончательную позицию с тем, что
говорила проверяющая программа в консоли).
Замечание (не попытка наехать, я понимаю, что Вы сначала отладили
правила): то, что программа не ценит углы, помогло мне выиграть всухую.
Здравствуйте, raskin, Вы писали:
R>Adopt wrote: >> Здравствуйте, raskin, Вы писали: >>
R>, но не поняла, что Iagno пропускает ход.
R>Iagno уровень 2 : Iagno выиграл.
R>А так — уже здорово. Теперь можно подбирать оценочную функцию.
Да, осталось самое сложное....
решил что надо строить дерево на несколько ходов вперед,
количество ходов на которое будет построено дерево
является уровенем сложности. Однако это не оптимально ведь требуется довольно много ресурсов.
В этой версии целевая функция просто выбирает
какой ход даст больше очков, то есть само дерево
не строится, а оценивается текущая ситуация.
Adopt wrote: > Здравствуйте, raskin, Вы писали: > R>А так — уже здорово. Теперь можно подбирать оценочную функцию. > > Да, осталось самое сложное.... > решил что надо строить дерево на несколько ходов вперед, > количество ходов на которое будет построено дерево > является уровенем сложности. Однако это не оптимально ведь требуется > довольно много ресурсов.
А куда дели Alpha-Beta поиск? Исходно же был он? Ресурсов не так много —
на три полухода надо при полном переборе 8000 позиций, т.е. <10^6
операций с полями. А отсечение ещё сокращает перебор. > > В этой версии целевая функция просто выбирает > какой ход даст больше очков, то есть само дерево > не строится, а оценивается текущая ситуация.
Играть стала слабее. Iagno1 у неё выиграл. Просчитывать хотя бы ответ
противника необходимо. > > http://rsdn.ru:80/File/39660/ReversiAlp.jar
За индикацию New game — спасибо. Правда, теперь она используется мало —
история нужна была при поиске ошибок в обработке правил. > > Как можно еще реализовать целевую функцию?
А ценность полей Вы учитываете? Но все равно перебор с отсечением
реализовать в конце концов придётся.
Здравствуйте, raskin, Вы писали:
>> В этой версии целевая функция просто выбирает >> какой ход даст больше очков, то есть само дерево >> не строится, а оценивается текущая ситуация. R>Играть стала слабее. Iagno1 у неё выиграл. Просчитывать хотя бы ответ R>противника необходимо. >> >> http://rsdn.ru:80/File/39660/ReversiAlp.jar R>За индикацию New game — спасибо. Правда, теперь она используется мало — R>история нужна была при поиске ошибок в обработке правил. >> >> Как можно еще реализовать целевую функцию? R>А ценность полей Вы учитываете? Но все равно перебор с отсечением R>реализовать в конце концов придётся.
Возможен ли такой алгоритм?
1) Найти возможные ходы
2) Поставить ход в позицию x, y одну из найденных
3) Рассчитать очки, которые получаются при ходе
3) Рассчитать возможные ходы противника
4) В цикле рекурсивно вызвать функцию для каждой из них (перейти в п. 2)
только с указанием другого цвета
и вычесть возвращенное этой функцией значение из очков п.3
5) вернуть очки из п.3
6) Сделать сортировку по очкам и выбрать найбольши эелемент
+ к этому алгоритму сдлелать альфа бета отсечения,
то есть проверять только самые лучшие ходы противника....
Adopt wrote: > 1) Найти возможные ходы > 2) Поставить ход в позицию x, y одну из найденных > 3) Рассчитать очки, которые получаются при ходе > 4) Рассчитать возможные ходы противника > 5) В цикле рекурсивно вызвать функцию для каждой из них (перейти в п. 2) > только с указанием другого цвета > и вычесть возвращенное этой функцией значение из очков п.3 > 6) вернуть очки из п.3 > 7) Сделать сортировку по очкам и выбрать найбольши эелемент > > + к этому алгоритму сдлелать альфа бета отсечения, > то есть проверять только самые лучшие ходы противника....
Отсекать по оценочным очкам, полученным противником, по-моему, не
оптимально. Лучше традиционно (разве в первых версиях было не так?).
Поскольку часто съесть больше всего означает отдать угол-другой. Лучший
ход быстро оказывается худшим. Но попробовать можно. С Iagno (если
дойдёт — с KReversi) я сравнивать помогу, а личную встречу Вы им сами
организуете. Если дать возможность выбирать, кто первый ходит.
R>Отсекать по оценочным очкам, полученным противником, по-моему, не R>оптимально. Лучше традиционно (разве в первых версиях было не так?). R>Поскольку часто съесть больше всего означает отдать угол-другой. Лучший R>ход быстро оказывается худшим. Но попробовать можно. С Iagno (если R>дойдёт — с KReversi) я сравнивать помогу, а личную встречу Вы им сами R>организуете. Если дать возможность выбирать, кто первый ходит.
Вот версия в которой реализовано alpha — beta отсечения + еще дополнительно ограничена глубина
проверки до 4
Adopt wrote: > Вот версия в которой реализовано alpha — beta отсечения + еще > дополнительно ограничена глубина > проверки до 4 >
Так и делают. Качество зависит от глубины и от оценочной функции. > http://rsdn.ru:80/File/39660/ReversiNUP.jar > > Интересно ли с ней играть?
Во-первых, когда у неё остаётся 3 фишки против 48 и ни одного хода она
не пишет "Заставили пропустить", а кидает Exception.
Во-вторых, я не показатель — мне с Iagno:level 3 играть иногда скучно.
Метод лобовой атаки к Вашей программе применим вполне: аккуратно
громится угол, после чего вокруг него собирается >32 фишек, которые
нельзя взять.
Кроме того, она проиграл Iagno:level 1. У Вас же была версия, играющая
сильнее, но ошибающаяся иногда — может ладно, что изредка подтормаживала?