I am implementing a chess engine in Python for the first time. Right now, my engine uses a standard alpha-beta search with fixed depth and a simple evaluation function that uses the weighted average of material for both sides. I have access to multiple cores, but I have not implemented any parallelization yet. I unfortunately have a limited time (just over a week) to make improvements before high stakes matches against a human and other engines. I've done a fair amount of research on engines, but I am not sure where to start in terms of making changes that actually improve the engine's strength. Which set of the following improvements might give me the best return on investment?
- Smarter move ordering for alpha-beta based on iterative deepening; this is pretty much a given
- Better evaluation function (piece-square table, time, other positional considerations)
- Naive parallelization (running minimax where each parallel search explore one path from the root at a time--this would not allow alpha-beta pruning)
- Search improvements (simple iterative deepening/aspiration windows, killer moves)
- Different search algorithm (PVS, MTD, Lazy SMP, YBW)
- Managing time and determining search depth dynamically (the game will be a blitz game)
- Transposition table
- Using opening books
- Porting the python code to c++
- Something else!