forked from clausecker/24puzzle
-
Notifications
You must be signed in to change notification settings - Fork 0
Solve 24 puzzles using zero-aware pattern databases
License
b-kaiser/24puzzle
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
This repository contains code to solve the 24 puzzle using pattern databases. The code in here was written as a part of the author's Bachelor and Master thesis and is made available under the terms and conditions of the 2-clause BSD license. The 24 puzzle is a variant of the 15 puzzle played on a 5x5 tray. The solved configuration looks like this: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Puzzle configurations are specified as a comma-separated list of tiles: 24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 To solve a puzzle, use the pdbsearch program. The program first generates or loads (if -d pdbdir has been provided) pattern databases and then prompts you for a puzzle instance. Use it like this: pdbsearch -j jobs catalogue.cat where jobs is the number of threads to use for PDB generation and catalogue.cat is the PDB catalogue to use. Some PDB catalogues are provided in the catalogues directory, I recommend the catalogue small-compound.cat. The program always finds the shortest possible solution, this may take a while. You can find some sample instances in doc/korf.txt. To compile this code, use GNU make. A C11 compatible C compiler is required. Adjust CC and CFLAGS as needed. For best performance, make sure that at least SSE4.2 support is enabled. Ideally, AVX2 and BMI2 should be available. Here is a general overview of the directories: catalogues PDB catalogues cmd programs to solve the 24 puzzle and for related purposes doc measurements and results test test programs and experiments util source code generators and templates The following programs are included: cmd/addmoribund Add moribund state tables to a finite state machine that doesn't have them. cmd/binpdb Compress PDBs to one bit per entry using a differential encoding cmd/compilefsm Compile a set of loop descriptions (see cmd/genloops) into a finite state machine for pruning. cmd/etacount Compute eta for a PDB by counting its entries. Note that this code is defective due to wrong entry weighting. I never managed to actually finish it. cmd/genloops Compute a set of loops (i.e. pairs of paths that lead to the same configuration) by breadth-first search. This is used to build finite state machines for pruning. cmd/genpdb Generate a single pattern database. This command is not needed anymore as pattern databases are generated as needed by pdbsearch and parsearch. cmd/parsearch Search puzzle solutions in parallel. While this implementation of IDA* is not parallel, this program searches for the solutions of multiple puzzles at once to gain a similar speedup. cmd/pdbcount Count the number of truly distinct PDBs. cmd/pdbmatch Find optimal 6-6-6-6 partitionings by matching all possible 6-tile PDBs with each other and approximating the quality of the result. Another unfinished experiment. cmd/pdbquality Print the quality and related data about a pattern database. This program correctly computes the quality of single pattern databases. cmd/pdbsearch Solve a single puzzle. cmd/pdbstats Print a histogram of the entires of a PDB. cmd/puzzledist Compute the number of puzzles at each distance from the solved configuration by exhaustive breadth-first search. Gets to a distance of about 30 given 1 TB of RAM. cmd/puzzlegen Generate random puzzle instances. The instances are guarantted to be solvable. cmd/randompdb Generate a random partitioning of the tiles into PDBs cmd/sampleeta Compute the heuristic quality eta by sampling spheres cmd/spheresample Sample spheres by means of random walks to generate samples for cmd/sampleeta cmd/verifypdb Verify the correctness of a pattern database. test/bitpdbtest Verify that a PDB and its corresponding BitPDB yield the same h values test/etatest Compute eta by stratified sample. test/expansions Compute statistics about the average number of vertices expanded at each distance for a given heuristic. test/explore Interactively explore puzzles. test/hitanalysis Analyse which tile combinations are accounted for by a given PDB catalogue. test/indexbench Index function benchmark. test/indextest Verify the correctness of the pattern database index function. test/morphtest Verify the correctness of morphed pattern databases. test/qualitytest Analyse the heuristic quality of a PDB catalogue. test/rankcount Count zero tile regions for a given tile set size. test/ranktest Verify the correctness of the rank() and unrank() functions. test/samplegen Generate random samples and classify them by distance to the solved configuration. This was an early attempt to sample spheres. Finding it too inefficient, I replaced it by cmd/spheresample. test/statmerge Merge sets of samples generated by test/samplegen. test/walkdist Perform random walks with a fixed distance and evaluate the distance distribution of the vertices encountered util/rankgen Generate the file ranktbl.c
About
Solve 24 puzzles using zero-aware pattern databases
Resources
License
Stars
Watchers
Forks
Packages 0
No packages published
Languages
- C 96.8%
- C++ 2.0%
- Other 1.2%