Have you ever been curious how is WatchBot picking the games to observe and save? Here is the explanation.
Due to the FICS limitations WatchBot can observe at most 30
simultaneous games (see
Observed games). While I
could workaround it by creating extra guest watchers, I feel that
polite bot should respect such a limit.
As a few games must be kept in reserve for operational purposes, the true limit is 25 games.
There are also some limits on the database size, memory used etc (watchbot runs on a small machine). Network connection is also limited, so no blitz watching
So, the aim is to watch small selection of the most interesting games, giving particularly strong preference to TeamLeague, STCBunch, or OCL, and avoiding engine games.
Preliminary decision whether some game may be interesting, or not,
is made using
gin notification data:
- names of both players
- game variant (standard/blitz/wild fr/zh/...)
- whether the game is rated
Currently WatchBot accepts only
wild fr games
at this stage.
The games which passed the preliminary stage are examined in more detail (in fact, WatchBot starts observing them, at least for a short moment, to avoid possible move loss).
At this stage games are scored, WatchBot tries to estimate the game value, using the following data:
- names of both players (which are compared against
=computerlist to detect engines)
- players ratings
- game variant
- game clock (base and increment)
- whether the game is rated.
Having computed the score, WatchBot makes the following decision:
minimum, the game is rejected (
minimumis fairly low and mostly rejects computer-versus-computer games)
minimum, and there is a spare room, watchbot starts watching the game
minimum, but there is no spare room (25 games are being observed), WatchBot compares score of the new game with the score of worst currently observed game. If new score is significantly higher then the old one (
delta), old game is abandoned to make room for the new game, otherwise new game is rejected.
Note significantly higher. This clause is expected to guarantee the following:
if WatchBot is busy watching relays/15 0 games/... and something important starts (like teamleague game), the new important game will be watched, but
if the new game is similar to those currently handled (worse or only marginally better), it does not make sense to switch (after all, the old game has already been watched for some time).
Here is the current scoring algorithm. I play with details from time to time, but the general shape remains fixed.
The game score is calculated as the sum of the following:
variant specific bonus: standard gets +100, wild/fr gets +50
player specific bonus: some particularly interesting players (those whose games I like most) get bonus (+50 or +100),
clock-based bonus to promote special tournaments: 45+45, 60+15 and 90+5 clocks get bonus +300
clock-based bonus to promote slower games: games with 30 minutes of time to think (time calculated in a FICS way as
base + 40 * increment) get bonus +50, slower games get linearly increasing bonus up to +100 for 120 minutes or more,
rating-based bonus, calculated for both players separately: for standard chess growing from +50 for rating 1600 to +200 for rating 2500 (in slightly non-linear way), for wild growing from 50 for 1700 to 100 for 2000 or more,
engine penalty: -500 for every player who is a computer,
unrated penalty: -100 if the game is unrated.
The current minimum is 100 (games with score below 100 are not watched).
The delta (score difference to replace the old game) is also 100.
At least under the current load the algorithm seems to work reasonably well, and to catch all important games. I am considering some updates, like:
detecting relays and treating them in a special way (although I am not yet sure whether I'd like to eliminate them, or maybe to promote them),
using the information about the game length and comments count while deciding whether (and which) game to drop in favor of the new more interesting game,
giving people a chance to ask for being watched (and granting them some extra bonus).
Still, don't fix it if it is not spoiled.