Fin de la population de la base (fonctionnel)
This commit is contained in:
91
Main.ipynb
91
Main.ipynb
@@ -15,7 +15,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"execution_count": 2,
|
||||
"id": "78fdf40a",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -42,7 +42,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"execution_count": 16,
|
||||
"id": "338f123d",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
@@ -150,28 +150,66 @@
|
||||
"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 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"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def get_250_random_position(tablebases,max_moves = 20):\n",
|
||||
" '''récupère 250 positions aléatoires de chaque table base'''\n",
|
||||
"def get_250_random_position(tablebases, config):\n",
|
||||
" positions = []\n",
|
||||
" attempts = 0\n",
|
||||
" max_attempts = 1000 #Pour éviter les boucles infinies\n",
|
||||
" while len(positions) < 250 and attempts < max_attempts:\n",
|
||||
" board = chess.Board() #LIGNE A CHANGER\n",
|
||||
" tries = 0\n",
|
||||
"\n",
|
||||
" while len(positions) < 250 and tries < 5000:\n",
|
||||
" board = generate_board_from_config(config)\n",
|
||||
"\n",
|
||||
" try:\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",
|
||||
" pass\n",
|
||||
" attempts += 1 \n",
|
||||
" \n",
|
||||
" \n",
|
||||
" return positions \n",
|
||||
"\n",
|
||||
" tries += 1\n",
|
||||
" \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",
|
||||
"def add_tabblebase_to_redis():\n",
|
||||
" #Connect to Redis server\n",
|
||||
@@ -188,21 +226,36 @@
|
||||
" all_positions = []\n",
|
||||
" for config in configs:\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",
|
||||
" \n",
|
||||
" print(f\"Total positions récupérées: {len(all_positions)}\")\n",
|
||||
" for position in all_positions:\n",
|
||||
" fen = position.fen()\n",
|
||||
" wdl = tablebases.probe_wdl(position)\n",
|
||||
" dtz = tablebases.probe_dtz(position)\n",
|
||||
" redis_server.hset(fen, mapping={\"wdl\": wdl, \"dtz\": dtz}) \n",
|
||||
" try:\n",
|
||||
" fen = position.fen()\n",
|
||||
" wdl = tablebases.probe_wdl(position)\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",
|
||||
" print(\"Ajoute de toutes les positions des tablebases dans Redis terminé!\")\n",
|
||||
"\n",
|
||||
"if __name__ == \"__main__\":\n",
|
||||
" 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": {
|
||||
|
||||
Reference in New Issue
Block a user