Автоматический подбор параметров движка

Тема в разделе "Машинное отделение", создана пользователем WildCat, 16 фев 2007.

  1. Orlov
    Оффлайн

    Orlov Учаcтник

    Репутация:
    0
    Спасибо Владимир!
     
  2. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    30 особей в 10 кругов должны порождать хотя-бы 5% особей не хуже существующих хороших (при максимальных прибавках 5 пунктов Эло), иначе метод не сходится, идет в случайном направлении. С 2000 измерениями это невозможно.
     
  3. Fruit
    Оффлайн

    Fruit Александр баннер

    Репутация:
    3
    1. 21.prs 48
    2. 58.prs 47
    3. 28.prs 46
    4. 13.prs 40
    5. 36.prs 39
    6. 0.prs 38
    7. 17.prs 24
    8. 30.prs 18
    9. 54.prs 18
    10. 23.prs 15
    11. 27.prs 15
    12. 50.prs 13
    13. 43.prs 11
    14. 20.prs 3
    15. 11.prs 0
    16. 55.prs -1
    17. 49.prs -1
    18. 24.prs -3
    19. 53.prs -5
    20. 18.prs -6
    21. 31.prs -6
    22. 52.prs -19
    23. 51.prs -22
    24. 42.prs -29
    25. 48.prs -34
    26. 56.prs -34
    27. 57.prs -39
    28. 60.prs -43
    29. 59.prs -60
    30. 47.prs -73

    После третьего турнира на первом месте то, что я настраивал в ручную! Причем, в предыдуших турнирах 21.pst так высоко не забирался.
     
  4. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Похоже, что вероятность порождения лучшей версии очень мала.
    Пока перехожу на шашки, т.к. там меньше параметров. Да и к тому же через месяц нужна новая версия шашечной проги.
     
  5. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    См. мой пост #368 от 13/03/2007 11:58:58 :)
     
  6. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    В шашках у меня нормальная вероятность, достаточная для сходимости.
    У меня сходится (имеет достаточную скорость сходимости) если 5% порождается хороших особей с средней прибавкой 10 пунктов Эло. Рост на текущих алгоритмах с таким процентом порождения где-то 1.5 пункта Эло на 10000 партий. (посчитано на мат. модели)

    При этом из-за накопления партий и подсчета более точного результата не нужно тысяч партий на итерации (Меньше тысячи партий на итерации), и теперь провожу матчи только с "хорошими" особями:

    На модели это выглядит так:
    Код:
       // сначала "крутки"
       for k:=1 to kolOst-1 do
            for l:=k+1 to kolOst do
              Begin
              kolPart:=kolpart+1;
              if rezPart(Rating[k]-Rating[l])=1 then
                Begin
                  rez[1,k]:=rez[1,k]+1;
                  rez[1,l]:=rez[1,l]-1;
                end else
                Begin
                  rez[1,k]:=rez[1,k]-1;
                  rez[1,l]:=rez[1,l]+1;
                end;
                end;
    
           // "теперь новички"
            for k:=1 to kolOst do
            for l:=kolOst+1 to kolO do
              Begin
              kolPart:=kolpart+1;
              if rezPart(Rating[k]-Rating[l])=1 then
                Begin
                  rez[1,l]:=rez[1,l]-1;
                end else
                Begin
                  rez[1,l]:=rez[1,l]+1;
                end;
              end;
    Ну и вдобавок оказалось что свежим особям лучше немного "подпортить" результат, чтоб плохие особи не могли случайно попасть в оставляемые.
     
  7. Fruit
    Оффлайн

    Fruit Александр баннер

    Репутация:
    3
    1. 0.prs 51
    2. 13.prs 50
    3. 28.prs 45
    4. 64.prs 42
    5. 58.prs 36
    6. 67.prs 30
    7. 27.prs 27
    8. 62.prs 24
    9. 63.prs 20
    10. 23.prs 20
    11. 36.prs 20
    12. 17.prs 16
    13. 21.prs 12
    14. 61.prs 12
    15. 50.prs 6
    16. 54.prs 5
    17. 71.prs 1
    18. 43.prs -9
    19. 70.prs -10
    20. 74.prs -10
    21. 66.prs -16
    22. 65.prs -17
    23. 20.prs -19
    24. 75.prs -21
    25. 76.prs -26
    26. 30.prs -38
    27. 72.prs -50
    28. 68.prs -54
    29. 73.prs -68
    30. 69.prs -79

    Думал, вот будет смешно, если победит дефолтная, а она взяла и победила :mad:....Не нравятся мне результаты. Версии меняются местами каждый турнир. Мож приостановить?
     
  8. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Можно останавливать.
     
  9. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Я выше описал алгоритмы при которых версии порядком часто не меняются, в оставляемые особи попадают действительно сильные, и новый лидер с огромной достоверностью сильнее предыдущего.
    Могу выложить код...
     
  10. Fruit
    Оффлайн

    Fruit Александр баннер

    Репутация:
    3
    Выложи, если не трудно. Может быть это как-то поможет.
     
  11. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    До дома доеду, и сразу выложу.
    Но в ветке я их в принципе описал...
     
  12. Orlov
    Оффлайн

    Orlov Учаcтник

    Репутация:
    0
    Мне понадобился простенький генератор случайных чисел, который бы выбирал случайно число в промежутке 100..150. я тут накатал что-то похожее, вроде бы работает. Гляньте пож.код, на предмет багов. Может быть можно как-нибудь проще сделать? Жалко отдельную ветку создавать, да и не нужно пожалуй.

    int MIN = 100;
    int MAX = 150;
    unsigned int rnd;
    srand( (unsigned)time( NULL ) );
    for (;;) {
    rnd = (((double) rand() / (double) MAX) * MAX + MIN);
    if (rnd >= 100 && rnd <= 150) break;
    }
    printf("rnd - %d\n",rnd);

    Заранее благодарен.
     
  13. Orlov
    Оффлайн

    Orlov Учаcтник

    Репутация:
    0
    Остановлено. А результаты нужны?
     
  14. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    rnd = rand() * (MAX-MIN) + MIN;
     
  15. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    rnd = rand() % (MAX-MIN) + MIN;

    Не знаю как у вас в Дельфи :) а у нас в C функция rand() возвращает целое от 0 до RAND_MAX.
     
  16. Orlov
    Оффлайн

    Orlov Учаcтник

    Репутация:
    0
    без цикла почему-то не работает :( Выдает 5-6-ти значные числа.
     
  17. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Давай.
     
  18. Orlov
    Оффлайн

    Orlov Учаcтник

    Репутация:
    0
    Оппссс ... заработало! Прекрасный пример для начинающих программеров :)
    Спасибо Владимир.
     
  19. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Плохая у вас функция :)
    У нас без параметров выдает число в интервале [0,1)
    С параметром - выдает целое в интервале [0,Параметр-1]

    Если выдает целое - тогда уж
    (double rand())/(double (RAND_MAX-1)) * (MAX-MIN) + MIN;

    А у тебя выдает только целое - в постановке задачи такого не было :)
    И причем в интервале [MIN,MAX-1] - вроде просили немного в другом интервале :)
     
  20. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Верно подмечено. Надо не забыть прибавить единичку куда следует.
     
  21. Orlov
    Оффлайн

    Orlov Учаcтник

    Репутация:
    0
    1. 0.prs 50
    2. 128.prs 37
    3. 116.prs 35
    4. 89.prs 35
    5. 72.prs 29
    6. 49.prs 28
    7. 15.prs 24
    8. 48.prs 22
    9. 104.prs 20
    10. 69.prs 17
    11. 111.prs 9
    12. 68.prs 8
    13. 95.prs 7
    14. 99.prs 6
    15. 26.prs 6
    16. 85.prs 2
    17. 119.prs 2
    18. 122.prs -8
    19. 100.prs -9
    20. 124.prs -9
    21. 123.prs -9
    22. 56.prs -10
    23. 117.prs -21
    24. 120.prs -23
    25. 121.prs -27
    26. 125.prs -29
    27. 115.prs -35
    28. 127.prs -49
    29. 126.prs -52
    30. 118.prs -56

    122.prs - died
    129.prs << 116.prs
    100.prs - died
    130.prs << 49.prs
    124.prs - died
    131.prs << 104.prs
    123.prs - died
    132.prs << 72.prs
    56.prs - died
    133.prs << 69.prs
    117.prs - died
    134.prs << 95.prs
    120.prs - died
    135.prs << 116.prs
    121.prs - died
    136.prs << 0.prs
    125.prs - died
    137.prs << 104.prs
    115.prs - died
    138.prs << 104.prs
    127.prs - died
    139.prs << 72.prs
    126.prs - died
    140.prs << 72.prs
    118.prs - died
    141.prs << 116.prs

    это после 8-ми суток на 3 пне 600-м.
     
  22. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    хи-хи-хи :(
     
  23. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Судя по результатам - либо слишком много параметров, либо плохие алгоритмы генерации новых особей, либо с текущим набором параметров сидим слишком близко к экстремуму.

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

    И проуентов 5-10 новых особей нужно всё-таки генерировать путем усереднения параметров двух хороших особей, это очень сильно увеличивает процент появления хороших особей.
    Случайными направлениями попадает в лучшую точку очень редко (но метко :) ), но случайных направлений (окресность одной точки) должно быть процентов 90, иначе происходит вырождение процесса.
     
  24. Orlov
    Оффлайн

    Orlov Учаcтник

    Репутация:
    0
    да, смахивает на "заводские настройки" -)))))
     
  25. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    У меня - это слишком редко. Надо как-то по другому.
     
  26. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Люди попробуйте вручную написать свои настройки с нуля.
    И сравним результаты. Может действительно очень сложно улучшить "заводские" настройки? И случайным тыканием это вообще нереально.
     
  27. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Так я и говорю - сочетание случайных направлений с усереднением.

    Обяснение почему плохо работают только случайные направления очень простое.

    Возмем точку на плоскоти - пусть это экстремум. Мы сейчас находимся в некоторой другой точке. Лучшие точки находятся внутри оскружности с центом в экстремуме, и проходящей через текущую точку.
    Генерируем мы особь - так-же рисуя окружность, только с центром в текущей точке.
    В случае плоскости (двух параметров) и малом радиусе окружности с центром в экстемуме - площадь пересечения областей двух окружностей - явно меньше 50%. В случае 30 параметров - площадь пересечения очень мала.

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

    Только нельзя переборщить с усереднением, так как очень быстро произойдет вырождение процесса.

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

    И еще неплохо бы делать контроль - что особь полученная усереднением уникальна.
     
  28. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Мне кажется, причина неудач - слишком большое число параметров. Даже миллионы партий и тысячи персоналий не дают сканирования пространства с достаточным разрешением.

    Как если бы мы взяли хрестоматийных мартышек за пишущими машинками, но не просто предоставили им сочинять Шекспира наугад, а за каждую верную букву давали бы банан...
     
  29. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Это откуда следует?
     
  30. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    У меня сходится на 82 :)
    И получила значения намного лучшие того что я задал вручную...
    Но я их всё-таки подробил на группы, а оценка простой это всего лишь 28 параметров, из которых как минимум 6 малозначимы...

    И с небольшим процентом усереднений будет сходимость при любом количестве параметров :) хоть 2000, хоть 10000. Если у нас 10% порождений усереднением, то в идеале будем получать эти десять процентов хороших особей при любом количестве параметров.
    Только чем больше параметров - тем больше нужно сохраняемых хороших особей, чтоб было нормальное стягивание пространства.
     
  31. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Самое время оптимизнуть Анечку! ;)
     
  32. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Сначала Skifi :)
    Анечка - это проба пера, впопыхах сделанная "на коленке".
    Мне было интересно в какую силу можно написать программу практически без подготовки, с нуля, не заглядывая в код других программ.
    Её нужно полностью переписывать. Её практически невозможно дорабатывать.
     
  33. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Попробую найти автоматикой более-менее приличную таблицу для коня. 64 параметра - вроде не так и страшно.
     
  34. Orlov
    Оффлайн

    Orlov Учаcтник

    Репутация:
    0
    Лучше поиск улучшать. Эвристики какие-нибудь новые придумывать, не забывая по-ходу, что все гениальное просто :)
     
  35. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Это нужно делать в других ветках, а здесь это офтопик :p