1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-05-01 17:19:36 +00:00

Time management: move faster if PV is stable

Move faster but compensate by allocating more
time when the best move changes.

Passed short TC at 15+0.05
LLR: 2.93 (-2.94,2.94)
Total: 13895 W: 3030 L: 2882 D: 798

Long TC at 60+0.05
LLR: 2.96 (-2.94,2.94)
Total: 9266 W: 1777 L: 1624 D: 5865

At time increment 30+0.5
LLR: 2.96 (-2.94,2.94)
Total: 6703 W: 1238 L: 1134 D: 4331

And at fixed game number, longer TC 120+0.05
ELO: 5.17 +-2.8 (95%) LOS: 100.0%
Total: 19306 W: 3378 L: 3091 D: 12837

bench: 4728533
This commit is contained in:
Uri Blass 2013-08-24 19:29:44 +03:00 committed by Marco Costalba
parent 6e6c5b6103
commit e6482b7d97
4 changed files with 12 additions and 12 deletions

View file

@ -84,7 +84,7 @@ namespace {
size_t PVSize, PVIdx; size_t PVSize, PVIdx;
TimeManager TimeMgr; TimeManager TimeMgr;
int BestMoveChanges; float BestMoveChanges;
Value DrawValue[COLOR_NB]; Value DrawValue[COLOR_NB];
HistoryStats History; HistoryStats History;
GainsStats Gains; GainsStats Gains;
@ -304,13 +304,14 @@ namespace {
void id_loop(Position& pos) { void id_loop(Position& pos) {
Stack stack[MAX_PLY_PLUS_6], *ss = stack+2; // To allow referencing (ss-2) Stack stack[MAX_PLY_PLUS_6], *ss = stack+2; // To allow referencing (ss-2)
int depth, prevBestMoveChanges; int depth;
Value bestValue, alpha, beta, delta; Value bestValue, alpha, beta, delta;
std::memset(ss-2, 0, 5 * sizeof(Stack)); std::memset(ss-2, 0, 5 * sizeof(Stack));
(ss-1)->currentMove = MOVE_NULL; // Hack to skip update gains (ss-1)->currentMove = MOVE_NULL; // Hack to skip update gains
depth = BestMoveChanges = 0; depth = 0;
BestMoveChanges = 0;
bestValue = delta = alpha = -VALUE_INFINITE; bestValue = delta = alpha = -VALUE_INFINITE;
beta = VALUE_INFINITE; beta = VALUE_INFINITE;
@ -332,14 +333,14 @@ namespace {
// Iterative deepening loop until requested to stop or target depth reached // Iterative deepening loop until requested to stop or target depth reached
while (++depth <= MAX_PLY && !Signals.stop && (!Limits.depth || depth <= Limits.depth)) while (++depth <= MAX_PLY && !Signals.stop && (!Limits.depth || depth <= Limits.depth))
{ {
// Age out PV variability metric
BestMoveChanges *= 0.8;
// Save last iteration's scores before first PV line is searched and all // Save last iteration's scores before first PV line is searched and all
// the move scores but the (new) PV are set to -VALUE_INFINITE. // the move scores but the (new) PV are set to -VALUE_INFINITE.
for (size_t i = 0; i < RootMoves.size(); i++) for (size_t i = 0; i < RootMoves.size(); i++)
RootMoves[i].prevScore = RootMoves[i].score; RootMoves[i].prevScore = RootMoves[i].score;
prevBestMoveChanges = BestMoveChanges; // Only sensible when PVSize == 1
BestMoveChanges = 0;
// MultiPV loop. We perform a full root search for each PV line // MultiPV loop. We perform a full root search for each PV line
for (PVIdx = 0; PVIdx < PVSize; PVIdx++) for (PVIdx = 0; PVIdx < PVSize; PVIdx++)
{ {
@ -437,7 +438,7 @@ namespace {
// Take in account some extra time if the best move has changed // Take in account some extra time if the best move has changed
if (depth > 4 && depth < 50 && PVSize == 1) if (depth > 4 && depth < 50 && PVSize == 1)
TimeMgr.pv_instability(BestMoveChanges, prevBestMoveChanges); TimeMgr.pv_instability(BestMoveChanges);
// Stop search if most of available time is already consumed. We // Stop search if most of available time is already consumed. We
// probably don't have enough time to search the first move at the // probably don't have enough time to search the first move at the

View file

@ -76,10 +76,9 @@ namespace {
} }
void TimeManager::pv_instability(int curChanges, int prevChanges) { void TimeManager::pv_instability(float bestMoveChanges) {
unstablePVExtraTime = curChanges * (optimumSearchTime / 2) unstablePVExtraTime = int(bestMoveChanges * optimumSearchTime);
+ prevChanges * (optimumSearchTime / 3);
} }

View file

@ -26,7 +26,7 @@
class TimeManager { class TimeManager {
public: public:
void init(const Search::LimitsType& limits, int currentPly, Color us); void init(const Search::LimitsType& limits, int currentPly, Color us);
void pv_instability(int curChanges, int prevChanges); void pv_instability(float bestMoveChanges);
int available_time() const { return optimumSearchTime + unstablePVExtraTime; } int available_time() const { return optimumSearchTime + unstablePVExtraTime; }
int maximum_time() const { return maximumSearchTime; } int maximum_time() const { return maximumSearchTime; }

View file

@ -83,7 +83,7 @@ void init(OptionsMap& o) {
o["Emergency Base Time"] = Option(200, 0, 30000); o["Emergency Base Time"] = Option(200, 0, 30000);
o["Emergency Move Time"] = Option(70, 0, 5000); o["Emergency Move Time"] = Option(70, 0, 5000);
o["Minimum Thinking Time"] = Option(20, 0, 5000); o["Minimum Thinking Time"] = Option(20, 0, 5000);
o["Slow Mover"] = Option(100, 10, 1000); o["Slow Mover"] = Option(50, 10, 1000);
o["UCI_Chess960"] = Option(false); o["UCI_Chess960"] = Option(false);
o["UCI_AnalyseMode"] = Option(false, on_eval); o["UCI_AnalyseMode"] = Option(false, on_eval);
} }