Программирование Го

Тема в разделе "Машинное отделение", создана пользователем WildCat, 11 май 2006.

  1. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    В качестве теста предлагаю партию против ГнуГо с глубиной, установленной в ноль или единицу.
    Ну, могу и сам потестировать. Сколько вам камней форы на большой доске дать? Девять? Двенадцать? Шестнадцать? (программе Many Faces я с переменным успехом давал девять, но сильно поймать на компьютерных ошибках не старался, играл как с человеком).
  2. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Я не собираюсь считать количество камней. Точнее собираюсь, и каждый камень дает очко, но есть еще и территория.
    Которая и считается в "санти-камнях";)))
    И алгоритмы которые я использовал в убитом наброске (на этом форуме я о них говорил)
    - соответствуют описанным по приведенным вами ссылкам;))) Как оказалось...
  3. dees Учаcтник

    • Участник
    Рег.:
    09.05.2006
    Сообщения:
    17
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Если есть группа, которая не имеет глаз и при правильной игре не сможет их построить или убежать, то

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

    если пытаться "вытянуть" такую мертвую группу, то это обычно заканчиваются укреплением противника.

    А ведь еще есть ко-борьба, после которой такие мертвые группы могут внезапно ожить.

    Так что для нормальной игры нужно уметь определять живые и мертвые группы не доигрывая позиции до конца. По-моему очевидно.

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

    NS, вы в го давно играете?
  4. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Первую партию в жизни в Го я сыграл в 80-ых годах... После прочтения книги Гик-а.
    Или после цикла статей в "Наука и жизнь" - точно не вспомню.
    Многое очевидно... но прытаясь атаковать группу, которая способна выжить - мы всего лишь ухуджаем свою позиционную оценку - так же как давая бессмысленные шахи, либо нападая на фигуры соперника в шахматах....
  5. dees Учаcтник

    • Участник
    Рег.:
    09.05.2006
    Сообщения:
    17
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Атаковать стоит лишь те группы, которые могут выжить, но при этом слабы. Смысл атаки - не в убийстве, а в построении территории или влияния с сохранением инициативы, т.е. атакуя игрок получает очки, заставляя противника защищаться, загоняя его в переконцентрированную позицию. Иногда атака может закончиться убийством, но обычно - нет.

    Вообще мой пост был вызван фразой:
    Как я понял под ФВ вы понимаете форсированный вариант или что-то типа этого?
    Давайть атари это один из возможных ответов. Советую также посмотреть в сторону такого понятия как накадэ (если конечно вы еще еще не сделали):
    http://senseis.xmp.net/?nakade

    К вопросу о том, как думает человек: я, когда пытаюсь убить группу, имеющую один большой глаз обычно пытаюсь "ужать" его до одной из форм, перечисленных на http://senseis.xmp.net/?UnsettledEyeshapes
    Скорее всего я в этом не оригинален :)
  6. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Насчет форм - Это очень трудоемкий процесс, таблицы весьма большие, а заимствовать я ничего не хочу - мне это неинтересно.
    Поэтому добавлять я их буду позже, и это займет достаточно много времени (особенно выбор весов) - больше, чем в шахматах - так как в шахматы я играю значительно сильнее, чем в ГО - и мне достаточно легко принимать в них решение о весе того или иного поз. признака, и формализовывать и реализовывать те или иные признаки.
    Накаде Достаточно сложно реализовать - так как группа в общем случае может состоять не только из горизонтального/вертикального соединения камней. Но для глаза из трех пунтов добавить ходы в них в ФВ можно попробовать реализовать. И можно формализовать как "наличие трех/четырех степеней свободы у камней соперника внутри территории полностью окруженной своими камнями"
    Я попробую реализовать - но не в первой версии.
    ФВ - да, форсированный вариант.
  7. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Тут я не согласен с NS. Если где-то в глубине дерева перебора мы имеем большой материальный перевес и нам ставят мат в один ход, то в 99,9% случаев мы могли предотвратить мат отжертвовав чего-нибудь. Т.е. все равно хорошо.

    А в Го все иначе. На доске тут и там (повсюду) разбросаны кучи мертвых камней с большим числом свобод. И перебора не хватит, чтобы хотя бы найти пару-тройку мертвых групп. А если перебор в конце начнет еще и сам ставить мертвые камни (опять же с большим количеством свобод)?

    WinPooh!
    У нас все-таки нет цели (может быть только пока) написать движок играющий сопоставимо с людьми. Просто мы ходим развлекаться :) Есть вероятность что выйдет нечто путное, т.к. за Го всерьез еще не брались. А не выйдет так для меня процесс приятнее результата. По-любому!!!

    Вот зачем ты делаешь Греку? Ведь она так тупит по сравнению с Рыбкой? Но ведь все равно делаешь :)
  8. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    "Потому что мне это интересно" © Энрико Ферми :)
  9. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Я не говорю о том, что плохо локализовать и нормально оценить группу...
    Я говорю о том, что я не представляю себе четко - как это сделать.
    Может быть, что если удачно решить этот вопрос - то сила ГОшных программ вырастет на порядки...

    "А в Го все иначе. На доске тут и там (повсюду) разбросаны кучи мертвых камней с большим числом свобод. И перебора не хватит, чтобы хотя бы найти пару-тройку мертвых групп. А если перебор в конце начнет еще и сам ставить мертвые камни (опять же с большим количеством свобод)?"

    А вот эта проблема у меня решена... (во всяком случае в теории) Ход на край доски и в угол приносит много очков в моей ОФ (за счет оценки пустых полей)... А ход в "мертвую зону" кроме одного камня практически ничего не принесет...
  10. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Удалось мне формализовать угрозу группе и полезность продления на такой угрозе (исходя из текущей глубины), так же сделал разделение на активные и неактивные ходы, на неактивных (без угроз, или угроза не может быть реализована на текущей глубине) делаю сокращение перебора.
    Продление на ходе ставящем положение группы соперника в состояние атари, и ходе снимающем камни соперника с доски.
    Удалось формализовать понятие мертвой группы (неважно образованной вертикальными/горизонтальными соединениями, либо без них) пока для случая глаза из трех клеток (только для случая когда группа не имеет внешних степеней свободы) и т.д.
    То есть процесс пошел...
  11. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Нашел как определить мертвые камни...
    На доске одиночные камни помечаем, затем находим нейтральные и захваченные области, считая помеченные камни тоже пустым пунктом. Затем, если камень одной стороны находится на территории другой стороны, то он снимается с доски, иначе снимаем пометку. Перед этим нужно обязательно снять камни в состоянии атари, причем сначала той стороны, чей ход. (она всегда могла в ФВ уйти от атари)

    Вот с мертвой группой проблемы... Простейший случай. Группа с двумя степенями свободы - на шахматной доске.

    Вся третья горизонталь белая,
    Вся вторая - черная
    На первой поля с b1 по g1 белые. a1 и h1 пустые. Забыл термин для этой ситуации....
  12. dees Учаcтник

    • Участник
    Рег.:
    09.05.2006
    Сообщения:
    17
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
  13. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Новая версия: www.igorkorshunov.narod.ru/gotm.rar

    - исправил глюк, когда человек не мог пасовать.
    - поменял цвета на черный и белый (раньше смотрелось веселее).
    - заменил функцию перерисовки RedrawWindow() на InvalidateRect(). Вроде если вызывать из потока, то первая может завалить прогу из-за проблем с синхронизацией (перерисовывать экран может только главный поток).
    - исправил глюк, когда если кончалось основное время не включался переодический контроль.
    - движки запускаются в своем каталоге (раньше запускались в каталоге оболочки).
  14. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Начал делать - небольшая поправка к определению мертвых камней. Одиночные камни помечаются, от них не идет закраска, они сами закрашиваются, но через них закраску вести нельзя. То есть закрашивая мертвый камень/ потенциально мертвый камень (когда определяем чья территория) в стек закраски его не заносим. В отличии от настоящего пустого пункта.
    Решил проблему с Сэки.;))) Точно так-же.
  15. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
  16. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Во наворотили;)
    Спасибо.
    Сегодня вечером потестирую.
    Последняя - просто какое-то жуткое КО;)
    Хотя нет... КО вроде нет.
    Или это всё-таки Сэки?
  17. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Нет, это просто пример максимального количества неживых групп, одновременно присутствующих на доске.
    Любой ход снимет сразу несколько камней, так что это не ко.
  18. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Кстати, интересно будет узнать, какой branching factor получится на этих патологических позициях у твоей альфа-беты, с любой оценочной функцией :)
  19. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
  20. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Небольшая неприятность... Секи бывает с Атари. ФВ эту конструкцию Разрушит, и решить эту проблему врятли реально. Я не вижу как это можно сделать...
    Кстати, пробовал ставить различные тестовые позиции GO++ v.5 - то мало того, что очень неудобно ставить (нет расстановки, надо наигрывать позиции), но и вдобавок она вообще ничего решить не может...
  21. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Придумал идею как сделать в ОФ ценность камней так, что мертвые будут иметь почти нулевую ценность (тоже используя закраску).
    Скоро сделаю движок. Интересно как эта идея покажет себя на практике. ФВ пока делать вообще не собираюсь.

    ЗЫ
    Хорошие идеи очень часто на практике оказываются вредными.
  22. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Тот вариант ФВ который я делаю - как оказалось есть в играющих программах;)
    Так что это не очень плохая идея. (Так же как и оценка)
    Я когда это придумывал(и оценку и ФВ) - я не знал алгоритмы играющих программ;)
    (правда и сейчас смотреть не буду, случайно увидел по ссылкам приведенным Винни - буду разбирать алгоритмы существующих программ только после того, как заиграет своё)

    ФВ не хочешь делать - чтоб все позиции были с одинаковой очередью хода?
  23. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Мой перебор пока не будет нуждаться в ФВ.
  24. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Кто-то, помнится, обещал к концу этой недели что-то показать.
    Конец недели, типа, завтра... :)
  25. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Ну тогда завтра и покажу. :)
    У Игоря, как я понял, еще не готова - готовится к чемпионату в Чеккерс.
  26. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Надеюсь завтра начну заниматься движком. Идея есть, но ее реализация представляется затруднительной. Но, буду пытаться.

    А где твой движок?
  27. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Вопрос не по теме: как в Delphi очистить буфер файла? На Си++ это file.flush();
    Нужно для вывода лога.
  28. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Ну и где?
  29. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Чуть задерживается - сейчас ковыряю Хистори Редукшн. Классная вешь!!! И точно будет работать в ГО.
  30. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Первая версия уже работает:

    - обыгрывает RandyPlus (движок, делающий случайные ходы) !!!
    - не знает правила Ко
    - суицид запрещен
    - нет перебора
    - ОФ глючит

    Если кому интересно, могу эту версию завтра выложить.
    Но без правила Ко, даже против WallyPlus (у которого тоже проблемы с Ко) доиграть партию до конца не удается из-за зацикливания.
    Однажды сняла у ГнуГо все камни, из-за этого правила. Но злой ГнуГо все равно победу засчитал себе :)


    Как лучше реализовать это правило? Может через хэш-ключи?


    На следующей неделе буду отлаживать ОФ, потом добавлю перебор.
  31. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Повторение отслеживать так-же как и в шахматах.
    (то есть список позиций) Хеш - тоже как и в шахматах (Зорбист), только нужно учесть, что в Китайских правилах запрещено позиционное повторение (позицию нельзя повторять независимо от очереди хода)
  32. Мобуту спаситель нации

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    15.02.2006
    Сообщения:
    6.916
    Симпатии:
    3.969
    Репутация:
    141
    Адрес:
    Заир
    Оффлайн
    Интереснее запрограммировать что-нибудь на неограниченном поле, чтобы перебор вариантов был невозможен. Крестики-нолики до 5 в ряд, к примеру. Или обычную игру в точки. Можно и шахматное что-нибудь придумать, на неограниченной доске.
  33. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Выложил версию 1.02: www.igorkorshunov.narod.ru/gotm.rar

    - ОФ
    - суицид запрещен
    - правило китайского Ко (на совпадение проверяется 6 предыдущих позиций)

    Обыгрывает RandyPlus 0.1.2, Brown 1.0

    Проигрывает WallyPlus (но с ней плохо играть, т.к. понимает только простое Ко и может повторять позиции).

    С ГнуГо пока лучше вообще не играть.
  34. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    А почему нельзя проверить все позиции, а не только 6 последних? :)
    Завтра выложу свою первую версию. Пока без поддержки протола.
  35. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Извиняюсь, только сейчас заметил вопрос :)

    Empties the buffer of a text file opened for output.

    Unit
    System

    Syntax


    [Delphi] function Flush(var t: Text): Integer;


    Description
    F is a text file variable.

    When a text file is opened for output using Rewrite or Append , Flush empties the file's buffer. This guarantees that all characters written to the file at that time have actually been written to the external file. Flush has no effect on files opened for input.

    Flush returns 0 if the operation succeeded. Otherwise, it returns the error code. When compiled using the {$I-} flag, the IOResult method returns this value.
    Note:
    {$I+} handles runtime errors using exceptions. When using {$I-}, use IOResult to check for I/O errors.

    То есть
    var f:Text;
    ....
    Flush(f)

Поделиться этой страницей