Use BFS class for GameMap.getDistance(). #11914
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Change Summary & Additional Notes
No functional changes.
The new implementation is a lot faster than the previous recursive one, which had a lot of overhead from creating a ton of temporary collections and doing a lot of recursive calls.
For a given game with FastAI, I observed ProTerritoryValueUtils.findTerritoryValues() (which spends a lot of time calling getDistance()) going from taking ~15% of the CPU to ~9%.
I tested that this is outputting the same results as the old implementation by having the engine run both and compare the values and ran several full rounds of all-AI games on different maps.
This PR also enhances the API of BreadthFirstSearch by supporting a BiPredicate condition and adds a helper visitor impl for finding a territory and returning its distance. Also, fixes an off-by-1 bug in the class for distance (and updates the one existing caller that was using the previous distance value).
Includes tests.
Release Note