Сколько ходов хранить в хеше?

Discussion in 'Машинное отделение' started by WildCat, 11 Nov 2006.

  1. WildCat
    Оффлайн

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

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

    У меня в хеше как раз было свободно 8 бит на каждую позицию. В них я стал записывать старый лучший ход.
    Но после 461 игры результат -9 пунктов (контроль 2+1), т.е. скорее всего это вообще никак не повлияло на силу. Вряд ли ситуация изменится после большего колическтва игр или при более длинном контроле.

    Какие будут соображения по этому поводу?
     
  2. NS
    Оффлайн

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

    Репутация:
    3
    У меня схема:
    Для первого хода хранится Depth, Для второго - нет.
    Схема замены первого - по Depth. (больше либо равно сохраненному)
    Второго - заменять всегда.
    Если в хеше два хода, то они всегда разные.
    Если опровергающий ход уже есть в хеше, но он второй - то если он удовлетворяет Depth то он становится первым. (Ходы в хеше меняются местами)
    и т.д.
    Если ход опровергающий, но он не удовлетворяет Depth, и его нет на первом месте в Хеше, то он Всегда записывается вторым.

    Если у нас новый опровергающий ход удовлетворяющий Depth, то предыдущий сдвигается на второе место.

    Сказывается второй ход в хеше ТОЛЬКО на Длинных контролях :)
     
  3. NS
    Оффлайн

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

    Репутация:
    3
    Проверяется элементарно - сколько раз второй ход из хеша был опровергающим... (то есть первый не стал опровергающим, второй ход в хеше есть, и он опровергающий) Можно просто собирать статистику.
    На коротких контролях - практически всегда первый ход опровергающий, а если не опровергающий - то второго хода в хеше просто нет! :)
     
  4. NS
    Оффлайн

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

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

    Как делаю я, в хеше хранится
    DepthBestM
    BestM1
    BestM2

    По окончании перебора лучший ход (либо опровергающий, либо лучший с оценкой больше Альфа), если он есть (если не случилось опровержение по Альфе)
    BestM

    Теперь

    if BestM=BestM1 Then DepthBestM:=max(Depth,DepthBestM)
    Else
    // Опровергающий ход не равен лучшему из Хеша.
    Begin
    if Depth>=DepthBestM then
    Begin
    DepthBestM:=Depth;
    BestM2:=BestM1;
    BestM1:=BestM;
    end
    Else BestM2:=BestM;
    End;
     
  5. WildCat
    Оффлайн

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

    Репутация:
    0
    Эту фишку я как-то упустил.
     
  6. NS
    Оффлайн

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

    Репутация:
    3
    Если упустить - то два раза в переборе будешь смотреть один и тот-же ход, и получишь ослабление движка.

    Хотя у меня в любом случае не будет два раза смотреть один ход.
    У меня в сортировке просто ходу из хеша присваивается максимальная оценка -первому больше, второму меньше. (до версии 0.08 я просто смотрел их в первую очередь, а потом пропускал в просмотре остальных ходов, и если бы дублировался ход в хеше - он просматривался бы два раза подряд)

    Храню 0, если хода опровергающего нет, и номер хода (нумерация с единицы) в неотсортированном списке в ином случае.
    В процедуре очистки Хеша, обнуляю оба хода.
    2x8 бит на ходы и 6 бит на DepthBestM, итого на ходы 22 бит.

    А ты хранишь в хеше тоже номер хода, а не сам ход?
     
  7. WildCat
    Оффлайн

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

    Репутация:
    0
    У меня ходы из хеша используются только для сортировки. Так что никак два одинаковых ходы просмотреть не могу. Просто я чуть попутал. Вообще в структуре было лишних 5 байт. Из них 4 байта на второй ход.