контекст: < /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
Форум по Javascript
1748720956
Anonymous
[b] контекст: < /strong>
Я делаю решатель для настольной игры в JavaScript. Игра установлена на сетке с фиксированным размером с 5 роботами, а некоторые ячейки отмечены как цели. Игрок должен найти минимальное количество движений , чтобы достичь установленной цели с одним из роботов. Мой решатель использует первый поиск в широте, потому что я хочу найти лучшее решение. Основной цикл - это очередь для удержания игровых центров, на которые необходимо просмотреть. Я пытаюсь оптимизировать свой код, чтобы получить производительность.
Что я уже сделал: [/b]
Я изменил большинство массивов на тип -кар /> Я искал некоторый вычислитель вне основного цикла для данных, которые необходимы очень часто, как расстояния от стен. Из того, что я понимаю, это класс Gamestate , который очень медленный. Честно говоря, я создаю довольно много из них, но я чувствую, что смогу получить от изменения структуры данных здесь. Кроме того, основные функции в моем решателе довольно быстры в сравнении (solve, который является основным циклом, Move , который вычисляет новый Gamestate после воспроизведения Move and Checkwin , который проверяет, является ли игровой центр действительным решением)
my GameState Class содержит 2 поля:
robots, что есть uint8 (10). /> Moves, который представляет собой Uint32Array (32) < /li>
< /ul>
Я использую дата низкого уровня, такие как цифры и типичные арары, чтобы представлять позиции, движения, цвета роботов и в основном все, что мне нужно для чтения /записи во время решения. Единственное осталось немного высокого уровня, - это класс Gamestate , а также массив Todostates , используемый в качестве основной очереди для BFS (см. Ниже).
[b] Мои вопросы: [/b]
Я получу производительность. ? < /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
Подробнее здесь: [url]https://stackoverflow.com/questions/79646942/can-i-extract-performance-by-changing-representation-of-gamestates-from-classes[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия