Гомоку: время поиска ограничено - PullRequest
3 голосов
/ 17 октября 2010

Я создаю программу на C для воспроизведения Gomoku . Он использует Minimax поиск, чтобы выбрать лучший ход. Тем не менее, он может искать лучший ход только в течение 10 секунд. Как определить, когда моя функция поиска потратила 10 секунд на поиск. Если бы вы могли предоставить мне пример или ссылку на документацию, которая была бы очень благодарна.

Ответы [ 5 ]

5 голосов
/ 17 октября 2010
#include <time.h>
time_t start_time = time(NULL);
while (((int)(time(NULL) - start_time)) < 10) {
  //search
}

То есть, что приходит мне в голову.Хотя это не проверено.

3 голосов
/ 09 августа 2011

Проверка единственного времени не сработает! Минимакс - это рекурсивный алгоритм поиска в глубину, который может тратить, например, 30 секунд на изучение очень неправильных ходов, когда есть некоторые явно намного лучшие ходыза последнюю 1 секунду, чтобы найти хороший ход!

Вы должны использовать какой-то алгоритм, который находит довольно хороший ход за короткое время, а затем, с увеличением количества доступного времени, он улучшает решение!Вы должны изменить минимаксный (или альфа-бета) алгоритм на стратегию поиска в ширину .Тогда вы можете отрезать его в любое время, имея неплохие ходы.

3 голосов
/ 17 октября 2010

Я думаю, что ваша проблема не в самой функции времени. Вы упомянули алгоритм Minmax, который является рекурсивным. Критерием остановки алгоритма Minmax является заданная глубина поиска. Если вы хотите иметь критерий остановки по времени, вы должны расширить свой алгоритм с помощью Итеративного углубления и позволить рекурсивной функции Minmax возвращать Значение Стража , если время истекло. 1005 *

1 голос
/ 17 октября 2010

Вы можете использовать сигнал alarm.Просто попросите обработчик сигнала установить глобальный флаг с именем okWereDoneNow и начать поиск, проверить и сбросить его.

Преимущество этого перед функциями таймера состоит в том, что для каждой итерации требуется только одно сравнениепоиска.Сигнальная работа стоит дорого, но запускается только один раз.При интенсивной повторной операции, предположительно связанной с процессором, это может быть существенным преимуществом.Но не верьте мне на слово - тестируйте!

0 голосов
/ 17 октября 2010

Вы можете использовать функцию time () в time.h. Обычно возвращаемое значение указывается в секундах. Даже если это не так, вы можете просто использовать difftime () из того же заголовка.

Этот является хорошим ресурсом по необходимым функциям.

Приведенная выше ссылка взята со ссылочного сайта C ++, но этот заголовок и примеры представляют собой код C.

...