Fin de la population de la base (fonctionnel)

This commit is contained in:
Amaël Kesteman
2025-11-19 10:39:03 +01:00
parent de531aa85e
commit 3c0ca9ab64

View File

@@ -15,7 +15,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": 2,
"id": "78fdf40a", "id": "78fdf40a",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
@@ -42,7 +42,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": 16,
"id": "338f123d", "id": "338f123d",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
@@ -150,28 +150,66 @@
"Récupération des positions de la tablebase KRPvKP\n", "Récupération des positions de la tablebase KRPvKP\n",
"Récupération des positions de la tablebase KRvK\n", "Récupération des positions de la tablebase KRvK\n",
"Récupération des positions de la tablebase KRvKB\n", "Récupération des positions de la tablebase KRvKB\n",
"Total positions récupérées: 0\n", "Total positions récupérées: 2250\n",
"Ajoute de toutes les positions des tablebases dans Redis terminé!\n" "Ajoute de toutes les positions des tablebases dans Redis terminé!\n"
] ]
} }
], ],
"source": [ "source": [
"def get_250_random_position(tablebases,max_moves = 20):\n", "def get_250_random_position(tablebases, config):\n",
" '''récupère 250 positions aléatoires de chaque table base'''\n",
" positions = []\n", " positions = []\n",
" attempts = 0\n", " tries = 0\n",
" max_attempts = 1000 #Pour éviter les boucles infinies\n", "\n",
" while len(positions) < 250 and attempts < max_attempts:\n", " while len(positions) < 250 and tries < 5000:\n",
" board = chess.Board() #LIGNE A CHANGER\n", " board = generate_board_from_config(config)\n",
"\n",
" try:\n", " try:\n",
" if tablebases.probe_wdl(board) is not None:\n", " if tablebases.probe_wdl(board) is not None:\n",
" positions.append(board) #Ajout de la position à la liste si elle est dans la tablebase\n", " positions.append(board)\n",
" except KeyError:\n", " except KeyError:\n",
" pass\n", " pass\n",
" attempts += 1 \n", "\n",
" \n", " tries += 1\n",
" \n", " \n",
" return positions \n", " return positions\n",
"\n",
"def generate_board_from_config(config):\n",
" \"\"\"\n",
" Génère un board contenant exactement le matériel d'une config Syzygy. Exemples de config :\n",
" - 'KQvK', 'KPvKP'\n",
" Cette fonction est important car il faut générer les positions qui dont les informations sont dans la tablebases.\n",
" \"\"\"\n",
"\n",
" piece_map = {\"K\": chess.KING,\"Q\": chess.QUEEN,\"R\": chess.ROOK,\"B\": chess.BISHOP,\"N\": chess.KNIGHT,\"P\": chess.PAWN,}\n",
"\n",
" white_str, black_str = config.split(\"v\")\n",
"\n",
" board = chess.Board(None) # plateau vide\n",
"\n",
" # Placer les pièces blanches\n",
" for p in white_str:\n",
" piece = piece_map[p]\n",
" sq = random.choice([s for s in chess.SQUARES if board.piece_at(s) is None])\n",
" board.set_piece_at(sq, chess.Piece(piece, chess.WHITE))\n",
"\n",
" # Placer les pièces noires\n",
" for p in black_str:\n",
" piece = piece_map[p]\n",
" sq = random.choice([s for s in chess.SQUARES if board.piece_at(s) is None])\n",
" board.set_piece_at(sq, chess.Piece(piece, chess.BLACK))\n",
"\n",
" # désactive les règles des échecs.\n",
" board.castling_rights = 0\n",
" board.ep_square = None\n",
"\n",
" # Couleur aléatoire\n",
" board.turn = random.choice([chess.WHITE, chess.BLACK])\n",
"\n",
" # Vérifier que la position est légale\n",
" if not board.is_valid():\n",
" return generate_board_from_config(config) # retry\n",
"\n",
" return board\n",
"\n", "\n",
"def add_tabblebase_to_redis():\n", "def add_tabblebase_to_redis():\n",
" #Connect to Redis server\n", " #Connect to Redis server\n",
@@ -188,21 +226,36 @@
" all_positions = []\n", " all_positions = []\n",
" for config in configs:\n", " for config in configs:\n",
" print(f\"Récupération des positions de la tablebase {config}\")\n", " print(f\"Récupération des positions de la tablebase {config}\")\n",
" position = get_250_random_position(tablebases,max_moves=20)\n", " position = get_250_random_position(tablebases,config)\n",
" all_positions.extend(position) #Ajout des positions générées à la liste globale\n", " all_positions.extend(position) #Ajout des positions générées à la liste globale\n",
" \n", " \n",
" print(f\"Total positions récupérées: {len(all_positions)}\")\n", " print(f\"Total positions récupérées: {len(all_positions)}\")\n",
" for position in all_positions:\n", " for position in all_positions:\n",
" fen = position.fen()\n", " try:\n",
" wdl = tablebases.probe_wdl(position)\n", " fen = position.fen()\n",
" dtz = tablebases.probe_dtz(position)\n", " wdl = tablebases.probe_wdl(position)\n",
" redis_server.hset(fen, mapping={\"wdl\": wdl, \"dtz\": dtz}) \n", " dtz = tablebases.probe_dtz(position)\n",
" redis_server.hset(fen, mapping={\"wdl\": wdl, \"dtz\": dtz}) \n",
" except (KeyError,chess.syzygy.MissingTableError):\n",
" continue \n",
" \n", " \n",
" print(\"Ajoute de toutes les positions des tablebases dans Redis terminé!\")\n", " print(\"Ajoute de toutes les positions des tablebases dans Redis terminé!\")\n",
"\n", "\n",
"if __name__ == \"__main__\":\n", "if __name__ == \"__main__\":\n",
" add_tabblebase_to_redis() " " add_tabblebase_to_redis() "
] ]
},
{
"cell_type": "markdown",
"id": "1b443c8c",
"metadata": {},
"source": [
"## Accès à Redis\n",
"\n",
"Nous avons rajouter 250 positions apparentant à chacune des tablesbases présent dans le dossier. Il y a des configurations ayant 3,4 ainsi que 5 pièces pour voir si cela a une incidence sur le temps d'accès à Redis.\n",
"\n",
"Pour la suite, nous allons donc pouvoir passer sur Redis pour vérifier cette hypothèse et faire d'autres tests sur notre base."
]
} }
], ],
"metadata": { "metadata": {