
ããã¯ãç§ãå ãšäžç·ã«ãã§ã¹ã®ã²ãŒã ã«åãšããšããæ¹æ³ã®è©±ã§ãããã£ã1ã€ã®ã¯ãœã²ãŒã ãäœããããªã«ç¹å¥ãªã®ã§ããïŒç§ã¯ãã§ã¹ãåŸæã§ããïŒã©ãããããŸããŠãéãã§ãããã¡ã«äœããåŠã³ãŸãããïŒãŸãããããããã¶ãããã¯ãç®æšã§ã¯ãªããæ ã®ããã®æ ã«ã€ããŠã®è©±ã§ããïŒãããŸããç§ããããæ¥œããã ã®ã§ããïŒããããªãã
ããã¯ãäžçã§æãç ç©¶ãããŠããã²ãŒã ã®1ã€ã§ãå¿ èŠã®ãªããœãããŠã§ã¢éçºã®çµéšã䜿çšããŠããªãªãžãã«ãç®æããç§ã®è©Šã¿ã«ã€ããŠã®è©±ã§ãã
ç§ã®ãã§ã¹ã«å¯Ÿãã絶察çãªæãããšãã²ãŒã ãæ¹åããããšãã人ã ã«ãšã£ãŠãã®èšäºã¯ãŸã£ãã圹ã«ç«ããªãã«ããããããããšã³ãžãã¢ãªã³ã°ã®ååãåé¡ã«é©çšããç¬èªã®æ¹æ³ãå ±æãã䟡å€ã¯ãã£ããšæããŸããç§ã¯æåããŠããŸããïŒæåŸã«ããã«ã€ããŠåŠã³ãŸãã
ãªããã§ã¹ã«é¢ãã£ãã®ã
2020幎ã®ãã³ãããã¯ã®éãç§ã®å ã¯ä»ã®å€ãã®äººã ãšåæ§ã«ããªã³ã©ã€ã³ãã§ã¹ã«å€¢äžã«ãªããŸãããæ°ã¶æãã¬ã€ããåŸã圌ã¯ãã®ã²ãŒã ã«ã€ããŠéåžžã«åºæ¿çã«è©±ãå§ããä»ã®å®¶æã«ææŠãå§ããŸãããç§ãã¡ã®ç¶ã¯é»è©±ã«åºãŸãããïŒåœŒã¯ããžã¿ã«ã®å€§å€±æã«èŠèãããŸãããïŒãç§ã¯è«ŠããŸããã§ãããå¶éèŠå ã®1ã€ã¯ãéåžžã«æéã®ãããå¯èœæ§ã®ããè¶£å³ã«é£ã³èŸŒãããšã«æµæãæããããšã§ããç§ã¯ãã®ã²ãŒã ã«ã€ããŠååã«ç¥ã£ãŠããã®ã§ãäžçŽè ã«ãªãã«ã¯æ°åæéãšãŸã§ã¯ãããªããŠãæ°çŸæéãè²»ããå¿ èŠãããããšãçè§£ããŸãããåæã«ãç§ã¯ãåœæãã§ã«100以äžã®ã²ãŒã ããã¬ã€ããŠããå ã«è² ãããšããèãã«ãè§Šçºãããªãã£ãããšãèªããŸããç§ã¯äžäººã§ã¯ãããŸããã
ãããããæ¥ãç§ã¯åœŒã®ææŠã«å±ãããèšããŸã§ããªããæå€±ã¯å£æ» çãªãã®ã§ãããåäŸã®é ããã²ãŒã ã®ã«ãŒã«ãåºæ¬ãç¥ã£ãŠããŸããããåŒã®ã¹ãã«ãšã¯æ¯ã¹ç©ã«ãªããŸããã§ãããåŸã§ãchess.comã§ã²ãŒã ã®åæ ãèŠããšãç§ã®æŠè¡çãªã©ã°ã¯ã+ 9ã®ããŒã¯ã«éãããŸã§ãç§»åããšã«å¢å ããã ãã§ããããšãããããŸããïŒããã¯ãäžåšã«å¯ŸããŠã«ãŒã¯ããã·ã§ãããããŒã³ã倱ãããšã«çããïŒæµã®æå€±ã®ïŒããã®ç¬éããã¹ãŠã®åžæã倱ã£ãŠãç§ã¯ãããããŸãããããã«ã€ããŠäœããããå¿ èŠãããããšã«æ°ä»ãããšããåæ§ã®ç¶æ³ãããã«2ã3ã®ã²ãŒã ã§ç¹°ãè¿ãããŸããã
ç§ã®æåã®æ±ºæã¯ãã²ãŒã ãããæ·±ãæãäžããããšã§ããã
詊ã¿1ïŒç ç©¶
ã²ãŒã ã®åè³ªãæ¹åããããã®ç§ã®æåã®è©Šã¿ã¯æçœã§ãããä»ã®åŠçããã®æšå¥šäºé ã«ã€ããŠã¯ãRedditãšYouTubeã«ã¢ã¯ã»ã¹ããŠãã ãããGM Naroditskyããã®ã¬ãã¹ã³ã® åéã«ãLichessã®åé¡ãèªãã§è§£æ±ºãã éãç§ã¯ã€ã³ã¿ãŒãããäžã§ã©ã³ãã ãªå¯ŸæŠçžæãšããã€ãã®ã²ãŒã ããã¬ã€ããŸãããããããã¹ãŠã«ãããããããç§ã®è©äŸ¡ã¯äœããŸãŸã§ããïŒ1300ã1400 Rapid on LichessïŒã

å ãšã®è©Šåãããã«æ°åè¡ã£ãåŸãåã€ãã£ã³ã¹ããªãããšã«æ°ã¥ããŸãããç§ã¯ãã¹ãŠåãéçºæ¹æ³ïŒæŒå¥ããã¯ããã¯ã®å匷ããããªã®èŠèŽïŒã«åŸãç¶ããŸããããããã«è²»ããæéã¯å ããã¯ããã«å°ãªãã£ãã§ããåœæã圌ã¯ãã§ã«æã«æ°çŸã®ã²ãŒã ããã¬ã€ããŠããŸããããç§ã¯10æ³ä»¥äžã§ããããã®ã¬ãŒãã§ãç§ã®ã®ã£ããã¯ãŸããŸã倧ãããªããŸããã
ãã®æãç§ã¯éåžžã«éèŠãªãã¥ã¢ã³ã¹ã«æ°ã¥ããŸãããç§ã¯ã²ãŒã èªäœã«ã¯ç¹ã«èå³ããªããå®éãã²ãŒã ãæ¹åããããããŸããã§ãããç§ã®äž»ãªç®æšã¯ããã äžäººã®äººãã€ãŸãç§ã®å åŒãåãããšã§ããã
詊ã¿2ïŒæµãç ç©¶ãã
ãã§ã¹ã²ãŒã ã¯éåžžããªãŒããã³ã°ã ããã«ã²ãŒã ã ãšã³ãã²ãŒã ã®3ã€ã®ãã§ãŒãºã«åããã ãŸããããã€ãã®åºæ¬çãªäº€é ãã¿ãŒã³ãåŠãã åŸ ãã²ãŒã çµäºæ®µéã§å€§ããªã¢ããã³ããŒãžããåå©ã«ç§»è¡ããã®ã¯éåžžãç°¡åããªã®ã§ããã®ã¢ããã³ããŒãžãåŸãããšã¯ç§ã«ãšã£ãŠæåã®è³ªåã§ããã
äžç€ã®æ®µéã§ã¯ãéåžžãé·æçãªæŠç¥ãå±éããæŠè¡ãé©çšããããšã§ å©ç¹ãåŸãã ãŸããã²ãŒã ã®åçãèªãã§å匷ããããšã§æŠç¥ãæ¹åããããšãã§ãïŒç§ã¯ããã奜ãã§ãïŒãæŠè¡ã¯åé¡ã解決ããããšã«ãã£ãŠã®ã¿éçºãã ãŸãïŒç§ã¯ç¹ã«å«ãã§ãïŒããããã£ãŠãç§ã®å ãchess.comã§æ¯æ¥çŽ20ã®ãã®ãããªåé¡ã解決ããããšãèãããšãæŠè¡ã¹ãã«ã§ã¯ééããªãé ããããšãçè§£ããŸãããç§ã«ãšã£ãŠãããã¯éæäžå¯èœãªéçã§ããããããã£ãŠãæ®ã£ãæ©äŒã¯1ã€ã ãã§ãããããã¯ããªãŒããã³ã°ã¹ããŒãžã§ã¢ããã³ããŒãžãåŸãããšã§ãã
ãªãŒããã³ã°ãã§ãŒãºã®èåŸã«ããçè«ã¯å·šå€§ã§ããåæã«ãé·ãã·ãŒã±ã³ã¹ãšåãã®ããªãšãŒã·ã§ã³ããããŠå¯ŸæŠçžæã®å¯èœãªçããèšæ¶ããå¿ èŠããããŸããåå¿è ã¯å€ããèŠããå¿ èŠã¯ãããŸããããæãå žåçãªéå£éšã«ããçšåºŠç²ŸéããŠãããšéåžžã«æçã§ãïŒãŸãã¯ããèšãããŠããŸãïŒã
ããããç§ã¯å ã®ã©ã³ãã ãªã²ãŒã ã®ããã€ããèŠãŠã圌ã䜿çšããéå£éšãçè§£ããããšæ±ºå¿ããŸããã Lichessã®ããã¥ãŒã«ã€ããŠãå匷ããŸãã ãã€ã¿ãªã¢å ããš ã·ã·ãªã¢ã³ã»ãã£ãã§ã³ã¹ã¯ã圌ãã®åºæ¬ååãæãåºãããšããŠããããããšã¯å¥ã«ãç§ã¯ããããã®YouTubeãããªãèŠãŸããã
æããã«ãç§ã®å ã¯ç§ã®åã§ïŒãããŠãã£ãšè¯ãïŒããããã¹ãŠãã£ãã®ã§ãåœç¶ç§ã¯åã³è² ããŸããã ïŒå°ãªããšãç§ã«ãšã£ãŠã¯ïŒæå³ã®ãªããªãŒããã³ã°ã®åããèŠããããšã¯éå±ã§ç²ããã ãã§ãããšããäºå®ã¯èšããŸã§ããããŸãããããã¯ãã¹ãŠç§ã«æ±ºããŠåã³ãäžããŸããã§ãããããäžã€ã®åé¡ã¯ã察æŠçžæãæ¬ã«èŠå®ãããŠããåãããéžè±ãå§ãããšããç§ã¯åã«æ°ããäœçœ®ãçè§£ããŠããªãã£ãã®ã§ãã©ãåå¿ãããã絶察ã«ç¥ããªãã£ããšããããšã§ããã
äžæ©äžãã£ãŠèãçŽãæãæ¥ãŸããããããããç§ã¯å®éã«å ãåãã®ã§ã¯ãªããåããªãŒããã³ã°ãå®ç§ã«ãã¬ã€ãã察æŠçžæãšã®ã²ãŒã ãæ¹åããããšããŠããããšã«æ°ã¥ããŸããããã£ãšæ¹åæ§ãæã£ãŠè¡åã§ããã§ããããïŒä»£ããã«ã圌ã®å åŒã®åŒ±ç¹ã«å¯ŸããŠç¹å¥ã«æºåããããšãã§ããã§ããããïŒæããã«ããã®ã¢ãããŒãã¯åœŒã«å¯ŸããŠã®ã¿æ©èœããŸãããããã¯ç§ã®ç®æšãšå®å šã«äžèŽããŠããŸããã
詊è¡3ïŒããã°ã©ãã³ã°
ä»ãç§ã®ä»äºã¯å¥ã®åœ¢ããšã£ãŠããŸããç§ã®å åŒïŒä»¥äžãPlayerXïŒãäžå©ãªç«å Žã«ãããªãããå°éããå¯èœæ§ãæãé«ãéå£éšã®åºå£ã®äœçœ®ãèŠã€ããããšã§ããç§ãã¡ã®èª°ããã²ãŒã ã®å°éå®¶ã§ã¯ãªããç§ãã¡ã®ã¬ãã«ã®ãã¬ãŒã€ãŒã¯ããŸãæ éã«ãã¬ãŒããªãããšã«æ³šæããŠãã ããã
è¯ããã¬ã€ã€ãŒã«å¯Ÿæããå¯äžã®æ¹æ³ã¯ãæ¬ã®åããæ£ç¢ºã«è¿œãããšã§ããããããã°ãå°ãªããšã察æŠçžæãäœã®åãããããã¢ããã³ããŒãžãåŸãããšãã§ããããã§ãããã ããã¯ã©ãã¬ãã«ã®ãã¬ãŒã€ãŒãšå¯ŸæŠããŠããå Žåã¯ç¶æ³ãå€ãããŸããæµãããã«æ£ããåå¿ããå¯èœæ§ãäœãããããã£ãŠèªåãå°é£ãªç«å Žã«ããããšãããã£ãŠããå Žåã¯ããªã¹ã¯ãåãããšãã§ããŸãïŒã€ãŸããäžæçã«äžå©ã«ãªãïŒã
å ãchess.comã§ãã¬ã€ãã500以äžã®ã²ãŒã ã®ãªã¹ãããããŸããããããŠãç§ã¯ããã°ã©ããŒãªã®ã§ããã®åé¡ãå·¥åŠçã«è§£æ±ºããããšã¯ç§ã«ãšã£ãŠèªç¶ãªã¢ãããŒãã«ãªããŸããã
圌ããã¬ã€ããã²ãŒã ãchess.comAPIã䜿çšããŠããŠã³ããŒãããçœãšé»ã®ã²ãŒã ã«åãå§ããŸããããããããçœã§ãã¬ãŒãããšãã«èªåãæãæ¹åã«ã²ãŒã ãåããå¯èœæ§ãé«ããšæããã®ã§ãå ãé»ã§ãã¬ãŒããã²ãŒã ã«çŠç¹ãåãããŸããã
import json
import requests
def get_month_games(player, yyyy_mm):
url = 'https://api.chess.com/pub/player/{}/games/{}'
r = requests.get(url.format(player, yyyy_mm))
if not r.ok:
raise Exception('get_month_games failed')
games = json.loads(r.content)
# Format: {games: [{url, pgn}, ...]}
return games['games']
# ...
import chess.pgn
import io
import json
with open('games.json') as f:
data = json.load(f)
games = []
for game in data:
pgn = io.StringIO(game)
games.append(chess.pgn.read_game(pgn))
black_games = [g for g in games if g.headers["Black"] == "playerx"]
次ã«ãã¿ã¹ã¯ã次ã®ããã«å®åŒåããŸããããPlayerXãèŠããã¹ãŠã®ããžã·ã§ã³ãèæ ®ãããšããªãŒããã³ã°ã®çµããã«åœŒã«ãšã£ãŠæãåçæ§ãäœããšæãããããžã·ã§ã³ã¯ã©ãã§ããã
ä»åã¯ã¿ã¹ã¯ãæç¢ºã«å®çŸ©ããã身è¿ãªåéã§äœæ¥ãå§ãŸããŸãããåå©çšå¯èœãªããŒã«ãäœæãããšããç®æšããªããå©çšå¯èœãªããŒã¿ã調ã¹ãŠ1ã€ã®è§£æ±ºçãèŠã€ããã ãã§ãããããPythonãã€ãŸãJupyterããŒãããã¯ã§åæãè¡ãããšã«ããŸãã ã
Pythonã«ã¯ããã§ã¹ãæäœããããã®åªããã©ã€ãã©ãªããã§ã«ããããšã倿ããŸãã ãpython -chessïŒç§»åã®çæãè©äŸ¡ãèŠèŠåïŒãš pythonstockfishã§ããïŒæåãªStockfishãã§ã¹ãšã³ãžã³ã䜿çšããŠãã§ã¹ã®äœçœ®ãè©äŸ¡ããããã®ãã€ã³ãã£ã³ã°ïŒã
ãã®æ¹æ³ã§åé¡ãã°ã©ãã«å€æããŸãããããŒãã¯ç¹å®ã®ãã§ã¹ã®äœçœ®ã§ãïŒFEN衚èšã§èª¬æãããŠã ãŸãïŒããšããžã¯2ã€ã®ããŒããæ¥ç¶ããŸãããã¿ãŒã²ããäœçœ®ã¯èš±å®¹å¯èœãªç§»åã«ãã£ãŠæåã®ããŒãããå°éå¯èœã§ãããã¹ãŠã®ã²ãŒã ã«ã¯ã1ã€ã®åãéå§ããŒãïŒéå§äœçœ®ïŒããããŸãã
次ã«ãPlayerXã§ãã¬ã€ããããã¹ãŠã®ã²ãŒã ã®ã°ã©ããé»ãšããŠäœæãã察å¿ããç§»åãè¡ãããåæ°ã§åãšããžã远å ã§ããŒã¯ããŸããã
class GamesGraph():
def __init__(self):
self.graph = igraph.Graph(directed=True)
def add_move(self, start_fen, end_fen, uci):
vs = self._ensure_vertex(start_fen)
vt = self._ensure_vertex(end_fen)
try:
e = self.graph.es.find(_source=vs.index, _target=vt.index)
e["count"] += 1
except:
e = self.graph.add_edge(vs, vt)
e["uci"] = uci
e["count"] = 1
@property
def start_node(self):
return self.graph.vs.find(chess.STARTING_FEN)
def _ensure_vertex(self, fen):
try:
return self.graph.vs.find(fen)
except:
v = self.graph.add_vertex(name=fen)
v["fen"] = fen
v["turn"] = chess.Board(fen).turn
return v
ãã®çµæã次ã®ãããªéã¿ä»ãæåã°ã©ãïŒäœçœ®ã¯ç°ãªãäžé£ã®ç§»åã§ååŸã§ãããããããªãŒã§ã¯ãããŸããïŒãåŸãããŸããïŒåæãå®éã®ã°ã©ãã¯ããã«åãŸããªãããïŒïŒ

ããã§ãéå§äœçœ®ã¯åè§ãçµã³ç®ã§ç€ºãããè²ã¯ãã®äœçœ®ã§ç§»åããã®ãçœãé»ãã瀺ããŸãã
ãŸããStockfishã䜿çšãããã¯ã€ãã¢ããã³ããŒãžã®èгç¹ãããåããžã·ã§ã³ã®è©äŸ¡ãååŸããããšæããŸãããäœåãã®äœçœ®ãè©äŸ¡ããããã»ã¹ã«ã¯æéãããããããåå¥ã«å®è¡ããŠãäžæã®FENäœçœ®ãããããStockfishã®æšå®å€ã«ãããã³ã°ããJSONãªããžã§ã¯ããäœæããããšã«ããŸããã
from stockfish import Stockfish
stock = Stockfish(parameters={"Threads": 8})
stock.set_depth(20)
stock.set_skill_level(20)
def eval_pos(fen):
stock.set_fen_position(fen)
return stock.get_evaluation()
# fens - FEN .
for fen, node in graph.fens.items():
node.eva = eval_pos(fen)
ã¢ããã³ããŒãžã®è©äŸ¡ã¯ãã»ã³ããã€ã³ããŸãã¯ãXã ãŒãã®ãã§ãã¯ã¡ã€ãããšããŠè¿ãããŸãã ãããã§ãæ£ã®æ°ã¯çœã®ã¢ããã³ããŒãžãæå³ããé»ã®è² ã®ã¢ããã³ããŒãžãæå³ããŸãã
{"type":"cp", "value":12} # 12 .
{"type":"mate", "value":-3} # .
100ã»ã³ããã€ã³ãã¯ã1ã€ã®ããŒã³ã®å¯ŸæŠçžæãããæå©ã§ããããšãæå³ãã300ã¯ããã·ã§ããã®ãããª1ã€ã®ãã€ããŒããŒã¹ãæå³ããŸãããã ããStockfishã¯ãããŒã¹ã®äœçœ®ã«å¿ããŠããŒã¹ã«å€ãå²ãåœãŠãããšã«æ³šæããŠãã ãããã€ãŸããããŒãäžã®ããŒã¹ã®æ°ãåãã§ãã1000ã»ã³ããã€ã³ãã®å©ç¹ãåŸãããšãã§ããå¯èœæ§ããããŸãã
ãã®ã¹ã³ã¢ããããšãã°0ãã1ãŸã§ã®æ°å€ãªã©ãåŠçã«äŸ¿å©ãªãã®ã«ãããã³ã°ããå¿ èŠããããŸããããã®ããã300以äžã®ã¢ããã³ããŒãžã1.0ã§è¡šç€ºããã300以äžã®ã©ã°ã0ã§è¡šç€ºãããããšã«ããŸããã Xç§»åã®ã¡ã€ãã¯ïŒXã20ã§ãã£ãŠãïŒ1ãŸãã¯0ã«ãªããŸãã
# [-1;1]
def rating(ev, fen):
val = ev["value"]
if ev["type"] == "cp":
# -300, +300. .
val = max(-300, min(300, val))
return val / 300.0
# X : max .
if val > 0: return 1.0
if val < 0: return -1.0
# , ?
b = chess.Board(fen)
return 1.0 if b.turn == chess.WHITE else -1.0
# [0;1], 0 - min, 1 - max .
def rating_black(ev, fen):
return -rating(ev, fen) * 0.5 + 0.5
ä»ã§ã¯ãã¹ãŠã®æ å ±ãé©åã§ã¯ãªããã°ã©ãã®ããŒãïŒã€ãŸããäœçœ®ïŒãèŠã€ããå¿ èŠããããŸãããããã§ã¯ãé»ãè² ããäœçœ®ã«ããããããã«å°éããããã®æé©ãªäžé£ã®åãããããŸããç¹å®ã®äœçœ®ã«å°éãã確çãç°¡åã«èšç®ã§ããããã«ããªãã®éããéãå¿ èŠããããŸãããç§ã¯ãã®ããã«æšè«ããŸããïŒ
- åäœçœ®ã§ã察å¿ãããšããžã«æ²¿ã£ããã¹ã®æ°ããã®äœçœ®ããè¡ãããç§»åã®ç·æ°ã§å²ãããšã«ãããç¹å®ã®ç§»åãè¡ã確çãèŠç©ããããšãã§ããŸãã
- åãšããžã®éã¿ã¯0ãã1ã«ãªããŸããå€ã倧ããã»ã©ããã®äœçœ®ãããšããžããã©ããŒã¹ããå¯èœæ§ãé«ããªããŸãã
- 次ã«ãç¹å®ã®ãã¹ãééãã確çã¯ãééãããã¹ãŠã®ãšããžã®ç¢ºçã®ç©ã«ãªããŸãã
æšæºã®ã°ã©ãã¢ã«ãŽãªãºã ã䜿çšããŠåé¡ã解決ããã«ã¯ã次ã®ããã«ãšããžã®éã¿ã倿ããå¿ èŠããããŸããã
- ãããã¯ç¢ºçã§ã¯ãªãè·é¢ã衚ããŠããŸãïŒã€ãŸããè·é¢ã倧ããã»ã©ããã¹ãéžæããå¯èœæ§ã¯äœããªããŸãïŒã
- 2ã€ã®ããŒãéã®è·é¢ã¯ãïŒç¢ºçã®ç©ã§ã¯ãªãïŒééãããšããžã®éã¿ã®åèšã§ããã
å®éãããã¯èª¬æãããããã¯ããã«ç°¡åã§ããåŒã¯éåžžã«åçŽã§ãã
distance(e) = -log(prob(e))
Pythonã§ã¯ã次ã®ããã«ãªããŸãã
def compute_edges_weight(vertex):
all_count = sum(map(lambda x: x["count"], vertex.out_edges()))
for edge in vertex.out_edges():
prob = edge["count"] / all_count
edge["prob"] = prob
edge["weight"] = -math.log(prob)
確çã0ãã1ã®éã§ããããããšããžãéžæãã確çã®å¯Ÿæ°ãåããšè² ã®æ°ã«ãªããŸãã確çããŒãã®å Žåãå¿é ããå¿ èŠã¯ãããŸããïŒãã®çµæã察æ°ã¯ãã€ãã¹ã«ãªããŸããç¡é倧ïŒãã°ã©ãã®åãšããžãå°ãªããšã1åãã©ããŒã¹ãããŠãããã... 確çãäœãã»ã©ã察æ°ã¯è² ã«ãªããŸããã€ãŸãã笊å·ãéã«ãããšãå¿ èŠãªãã®ãåŸãããŸããçç±ã¯æ¬¡ã®ãšããã§ãã
- 察æ°ã®åèšã¯ãåŒæ°ã®ç©ã®å¯Ÿæ°ã§ã
log(a) + log(b) = log(a*b)
ã - çµæã倧ããã»ã©ããããæ±ºå®ãã確çã¯äœããªããŸãã

ãã®ã¢ã€ãã¢ãæŠåšã«ããã€ã¯ã¹ãã©ã®ã¢ã«ãŽãªãºã ã䜿çšããŠãéå§ããŒããšä»ã®ãã¹ãŠã®ããŒãéã® æççµè·¯ãèšç®ã§ã ãŸããçµæã¯ãåããŒããšéå§äœçœ®ãžã®æçãã¹ã®éã®ãããã³ã°ã§ãããããŒãã«ã€ãªããæãå¯èœæ§ã®é«ãäžé£ã®ç§»åã衚ããŸãã
ãã®æç¹ã§ãã¢ããã³ããŒãžã®æå°å€ãä»»æã«éžæãã確çã§ãã¹ãäžŠã¹æ¿ããŸãããæåã®ããã€ãã®ãã¹ã¯ãPlayerXãããæå©ãªããã¥ãŒããæãåºãããã®æå€§ã®ãã£ã³ã¹ã衚ããŠããŸãã
æ¹åç¹
ç§ã¯äœãç¥ããŸãããïŒãã®ã¢ã«ãŽãªãºã ã«ãã£ãŠäžããããäœçœ®ã®äžã«ã¯ã次ã®ãã®ããããŸããïŒãã¯ã€ãã®åãïŒïŒ

ã芧ã®ãšãããé»ã®æåŸã®åãã§ããg6ãééãã ã£ããããé»ã¯éåžžã«åä»ãªäœçœ®ã«ãããŸãïŒStockfishã«ãããš+8.9ïŒããã¯ã€ãã¯ç¶ããŠãe5ãšã«ãŒã¯ããããŒã³ãåããŸãããã®æç¹ã§ãé»ã®ã²ãŒã ã¯å®è³ªçã«çµäºããŸãã圌ã¯éšå£«ãh7ã®ããŒã³ãããã³åžæãæããªããã°ãªããªãããã§ããã¢ã«ãŽãªãºã ã®å¥ã®çµæã¯ããã§ããïŒãã¯ã€ãã®åãïŒïŒ

ããã§ã¯ããã§ãã¯ã¡ã€ãã1ã€ã®åãã§è¡šç€ºãããŸãïŒ åäŸã®ãã§ãã¯ã¡ã€ãïŒã
åé¡ã¯ãPlayerXãæåã®ã²ãŒã ã§ãããã®ééããæ°åã ãç¯ãããããäºåºŠãšç¹°ãè¿ããªãã£ãããšã§ããåæã®ã¯ã€ãŒã³ã¢ã¿ãã¯ã¯éåžžãçµéšã®æµ ããã¬ã€ã€ãŒã«ãã£ãŠã®ã¿è¡ãããåãã¬ãã«ã®ãã¬ã€ã€ãŒã«å¯ŸããŠã®ã¿å¹æããããŸããåå¿è ã®ã«ããŽãªãŒãé¢ããPlayerXã¯ãããæèœãªå¯ŸæŠçžæããã®ããã«é²ãŸãªããããé·ãéãããã®ééããç¯ããŠããŸããã PlayerXã¯ããã«å¯ŸããŠé²åŸ¡ããæ¹æ³ãç¥ã£ãŠããã®ã§ãç§ã¯ãã®ãããªéå£éšãæ©èœããªãããšãç¥ã£ãŠããŸããã
ãã1ã€ã®åé¡ã¯ãç§»åã®ã·ãŒã±ã³ã¹ã«é¢é£ããŠããŸãããããã¯1åã ãçºçããŸããããéåžžã®äœçœ®ããçºçããŸãããåãšããžã®ç¢ºçã¯1.0ã§ãã£ããããæçµçãªäœçœ®ã®ç¢ºçã¯ãæåŸã®å žåçãªäœçœ®ã®ç¢ºçãšåãã§ããããšã倿ããŸããïŒä»ã®å¯èœæ§ãå®è¡ãããªãã£ãå ŽåïŒã以äžã®äŸã§ã¯ããšããž7ãš6ïŒ2çªç®ã®åãã§æãäžè¬çãªäœçœ®ïŒããã©ããæ¬¡ã«ãšããžã®1ã€ã1ã§ãã©ãããšãã§ããŸããããã«ãåŸç¶ã®ãã¹ãŠã®æã¯1åã ãåçããïŒãã®äœçœ®ã¯1åã®è©Šåã§ã®ã¿åœ¢æãããããïŒããã®çµæãåæã¯1.0ã®ç¢ºçã«ãªããŸãã

ãããŠãããã«ç¢ºçããããŸãïŒ

åãäžé£ã®åããæç¢ºã«åçãããå¯èœæ§ã¯äœãããããã®ãããªã¹ããŒã ã¯ä¿¡é Œã§ããŸããããã®ãããªçµè«ã®ããã«ããããã®äœçœ®ããã²ãŒã ãè¡ãããååãªã²ãŒã ããããŸããã
æåãªåŒçšïŒ B.ããªã¥ãŒã¹ã¿ãŒïŒïŒïŒãçè«çã«ã¯çè«ãšå®è·µã®éã«éãã¯ãããŸããããå®éã«ã¯éãããããŸãããã®å Žåã¯æ£ããããšã倿ããã®ã§ãããæåãã仮説ãèŠã€ããããã«ããã€ãã®æ¹è¯ãšç¬ç«ããç ç©¶ãå¿ èŠã§ããããžã·ã§ã³ã
2çªç®ã®åé¡ãä¿®æ£ããããã«ããšããžã®ç¢ºçã«äžéãèšå®ããŠã1åã ãåçãããé·ãäžé£ã®åããåŸã ã«ç¢ºçã倱ãããã«ããŸããã
def compute_edges_weight(vertex, prob_ceiling=0.9):
all_count = sum(map(lambda x: x["count"], vertex.out_edges()))
for edge in vertex.out_edges():
# ... (default 90%).
prob = min(edge["count"] / all_count, prob_ceiling)
edge["prob"] = prob
edge["weight"] = -math.log(prob)
æåã®åé¡ã§ã¯ãæªãä»®å®ãæåã§é€å€ããŸããããã®çµæãç§ã¯äœæ¥ããããžã·ã§ã³ã2ã3ããæ®ã£ãŠããŸããã§ããã
å¥ã®å€æŽã®çç±ã¯ãç§ããã¯ã€ãã®ããã«ãã¬ãŒããã©ã®ãã¹ãåãããèªåã§æ±ºããããšãã§ããã®ã§ããã¯ã€ãã®åãã®ç¢ºçããã¹ãéžæãã確çã«åœ±é¿ãäžããããªããšããããšã§ããããã®ããããã¯ã€ãã®ç§»åã®ãã¹ãŠã®ç¢ºçã1.0ïŒéã¿ãŒãïŒã«èšå®ãããšã次ã®ãããªã°ã©ãã«ãªããŸãã

æºå
å匷ã®éçšã§ãç§ã¯æ¬¡ã®ããžã·ã§ã³ãéžã³ãŸããïŒ

Lichessã«ãããšãããã¯ã¢ã¬ãã³ãã£ãã§ã³ã¹ïŒ2ã€ã®ããŒã³æ»æïŒã§ãããã®äœçœ®ã§ã¯ããã©ãã¯ã¯1åã ãæåããåãïŒNb6ïŒãæã£ãŠããŸããããã®åŸãããŸãæå©ãªäœçœ®ã«çãŸããŸããïŒStockfishã«ãããš+0.6ïŒããã ãããã®äœçœ®ãããPlayerXã¯ãã°ãã°Nf4ãåçããŸããããã¯ã圌ã«ãšã£ãŠéåžžã«æ®å¿µãªããšã§ãïŒ+2.3ïŒãLichessã«ã¹ã¿ãžãªãèšçœ®ããããã€ãã®ããªãšãŒã·ã§ã³ïŒPlayerXãåçããè¯ãåããšåãïŒã調ã¹å§ããŸããã
çµå±ãç§ã¯å¯èœæ§ã®æšãæã«å ¥ãããããèŠããŠçè§£ããããšããŸãããããšãã°ãd5ã®ãããªåããè ãããã®ãNf4ã倱æããçç±ãèŠã€ãããã¹ãŠã®äººã«æé©ãªçããæºåããå¿ èŠããããŸããã
ç§ã¯ããã«éå±ããã®ã§ããããé·ãéããŸããã§ããããããŠå®éãç§ã¯éšåçã«ããæºåãã§ããŠããŸããã§ããã
決å®çãªã²ãŒã
ããã¯ãã¹ãŠãç§ãæªæ¥ãèŠãŠãããã®ããã«èµ·ãããŸãããPlayerXãšç§ã¯ã¢ã¬ãã³ã®é²è¡ã®ç«å Žã«ãããŸãããäžå¿«ãªç¶æ³ã«é¥ã£ã圌ã¯ã5çªç®ã®åãã§éšå£«ãéããŸãããããªããããã¯ããã«çµéšè±å¯ãªãã¬ã€ã€ãŒã§ãããæ¡ä»¶ã倱ãããšã«æ°ä»ãããšãã«æ¬¡ã ãšãã¹ãç¯ãå§ããããšãããããŸãããåã£ããšãã¯ã¯ã£ãããšãã¬ãŒããã®ã¯ç°¡åã§ãããéã®ç¶æ³ã§å·éããä¿ã€ããšã¯ã§ããŸããïŒ10çªæã§ãç§ã¯ãã§ã«+7.1ã®ã¢ããã³ããŒãžã§ãªãŒãããŠããã®ã§ãè² ããã®ã¯é£ããã§ãããããã¯ç§ãèãåºããèšç»ã®çµããã§ããããŸãããé»ãä»ã©ã®ããã«çª®å±ã«ãªã£ãŠãããããããŠç§ã®äœåãã©ã®ããã«çãæ»æããããšãç®æããŠããããèŠãŠãã ããïŒ

ãã®ç¬éãããç§ã¯ãã¡ãã¡ã§ãã¹ãç¯ãå§ããŸããããåæã«ç§ã¯27ãåãããŸã§ããã€ãã®å©ç¹ãç¶æããããšãã§ããŸããïŒ

æ®å¿µãªãããæéã¯éåžžã«éãããŠããã®ã§ïŒ10åéã®å éã²ãŒã ããã¬ã€ããŸããïŒããã°ããæ©ããªããã°ãªããŸããã§ãããçµå±ãç§ã¯32ãš33ã®åãã§èŽåœçãªãã¹ãç¯ããããäžåºŠãç¡æã®å¯ŸæŠçžæãããã§ãã¯ã¡ã€ããåãåããŸããã

ãããå šäœã®äžèŽã§ãïŒé倧ãªãšã©ãŒãªã©ãå«ãïŒïŒ

ã©ã€ãããããã¬ãã¥ãŒïŒlichess.org/2qKKl2MI
çµè«
ç§ã¯ããããã¹ãŠããäœãåŠã³ãŸãããïŒæ¯ãè¿ã£ãŠã¿ããšããã®ã»ãšãã©ãæçœã«èŠããããã€ãã®ããšããããŸãã
- ç¹å®ã®å¯ŸæŠçžæã®æºåãããããšã§ããªãŒããã³ã°ã®å€§ããªã¢ããã³ããŒãžãåŸãããšãã§ããŸãã
- åå¿è ã®ãã¬ã€ã€ãŒã¯ãçžæã®çãããåããå©çšããæ©äŒãéãããšããããããŸãããã®ç¹ã§ãã¯ãŒãã¿ãŒã1ã€ãããªãäœçœ®ã«æµã远ãããããšã§ãç°¡åã«ã¢ããã³ããŒãžãåŸãããšãã§ããŸãã
- . , . .
- , , . .
- , , .
ç§ã䜿çšããã³ãŒãã¯ãªããžããªã«ãããŸããç§ã¯ããã«ããŒã¿ãå«ããŠããªãããšã«æ³šæããŠãã ããããããŠã³ãŒãèªäœã¯ããªããããã§ããããã§ããç¹ã«ã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ã®ç¿åŸããŸã èããŠãã人ã«ãšã£ãŠãããã圹ç«ã€ããšãé¡ã£ãŠããŸããèŠãŠãã ãã-å®ç掻ã®åé¡ã解決ããã®ã«åœ¹ç«ã€ããšã§ããªãå¯èœã§ããããã§ããã¯åã«ããããååŸã«åããã ãã§ã¯ãããŸããã
ããããã¹ãŠã§ããåéããã€ãå ãåããããã«ãªãããšãé¡ã£ãŠããŸãããä»ã®ãšããã¯èªåã®åã§ãããæãéããããšããŠããŸãã

