контекст: < /strong>
Я делаю решатель для настольной игры в JavaScript. Игра установлена на сетке с фиксированным размером с 5 роботами, а некоторые ячейки отмечены как цели. Игрок должен найти минимальное количество движений , чтобы достичь установленной цели с одним из роботов. Мой решатель использует первый поиск в широте, потому что я хочу найти лучшее решение. Основной цикл - это очередь для удержания игровых центров, на которые необходимо просмотреть. Я пытаюсь оптимизировать свой код, чтобы получить производительность.
Что я уже сделал:
Я изменил большинство массивов на тип -кар /> Я искал некоторый вычислитель вне основного цикла для данных, которые необходимы очень часто, как расстояния от стен. Из того, что я понимаю, это класс Gamestate , который очень медленный. Честно говоря, я создаю довольно много из них, но я чувствую, что смогу получить от изменения структуры данных здесь. Кроме того, основные функции в моем решателе довольно быстры в сравнении (solve, который является основным циклом, Move , который вычисляет новый Gamestate после воспроизведения Move and Checkwin , который проверяет, является ли игровой центр действительным решением)
my GameState Class содержит 2 поля:
robots, что есть uint8 (10). /> Moves, который представляет собой Uint32Array (32) < /li>
< /ul>
Я использую дата низкого уровня, такие как цифры и типичные арары, чтобы представлять позиции, движения, цвета роботов и в основном все, что мне нужно для чтения /записи во время решения. Единственное осталось немного высокого уровня, - это класс Gamestate , а также массив Todostates , используемый в качестве основной очереди для BFS (см. Ниже).
Мои вопросы:
Я получу производительность. ? < /li>
Есть ли лучший способ написать очередь в JavaScript?export function solve(board, startingState, goal, maxDepth){
board = preComputeBoard(board);
let seenStates = new Map();
let todoStates = [startingState];
let checks = 0;
let stateId = -1;
let numOfStates = 1;
let startTime = Date.now();
while(stateId + 1 < numOfStates){
stateId++;
let state = todoStates[stateId];
if(state.moves[0] > maxDepth){continue;}
let stateKey = EncodeRobots(state.robots);
if(seenStates.has(stateKey)){continue;}
seenStates.set(stateKey, true);
checks++;
if(state.CheckWin(board, goal)){
console.log("checks", checks);
console.log("loops", stateId);
console.log("time", Date.now() - startTime);
return state;
}
for(let move = 0; move < 20; move++){
let newGameState = new GameState(state);
newGameState.Move(board, 1
Подробнее здесь: https://stackoverflow.com/questions/796 ... om-classes
Могу ли я извлечь производительность, изменяя представление игровых связей из классов на Typedarrays в решателе JavaScri ⇐ Javascript
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Невозможно найти элемент #audio-source в решателе капчи с помощью DrissionPage.
Anonymous » » в форуме Python - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-