Робот с геосканером. Часть #9 [предварительные тесты]
Эвристические функции:
Давление - штраф на ход по вертикали. Нужен из-за того, что начало сканирования либо сверху, либо снизу, следовательно, заканчивать добычу надо ближе туда, где начнется следующее сканирование.
Недоход - робот не заходит на позицию метки, чтобы сэкономить лишний шаг (не всегда оптимально, но суммарный эффект - положительный)
Штраф на повороты - добавление шага, при оценке расстояния, если целевой блок находится дальше, чем в одном блоке от текущей оси.
Изначально идея была в том, чтобы собрать такое сочетание эвристик, при котором робот будет быстрее заканчивать добычу и выходить к точке старта. Важно, чтобы робот финишировал наверху, для быстрого перехода к следующему чанку.
Сначала добавил ограничение хода по вертикали. Если робот может достать блок, не доходя до него, то добывает и ищет следующий.
Потом добавил такую же функцию для всех осей. Прибавил еще мягкое давление по вертикали, чтобы нижние блоки имели приоритет над верхними. Но когда запустил пачку роботов, перепутал знак и получил давление вверх. Пришлось потом запускать еше, с правильной формулой.
Из всех решений выбрал лучший результат - штраф на повороты, недоход по всем осям и давление вниз. В тесте, робот довольно много скакал по вертикали, я решил это исправить. Увеличил давление в два раза, но не заметил, что половина формулы поменяла знак. Робот стал настолько мало скакать по вертикали, что процесс превратился в послойную добычу, со слоем 2 блока. Перевернул формулу, чтобы добыча опять шла снизу вверх. Поменял обратно, получил не очень хороший результат - робот получает меньше свободы, делает больше лишних движений.
По факту, сейчас штрафы на повороты конкурируют с недоходом, т. к. при добыче больших залежей, у робота вокруг много блоков и ему без разницы, сделать шаг к следующему или повернуться к соседнему. Самый оптимальный вариант для таких случаев - змейкой, но у этих залежей бывают всякие аппендиксы. Это вызывает некоторую нагрузку на дальнейшие ходы - роботу приходится больше вертеться и ходить.
К тому же, недоход надо расширить: из-за того, что счет идет шагами, без точного учета поворотов - робот может не повернуться к соседнему блоку. Или зайти в блок, если он находится в соседнем блоке к текущей оси, хотя мог бы достать без последнего шага.
Осталось придумать, как это починить без лапши (хотя там лапша из одного бряка по флагу, но все-равно не приятно) и подобрать такие уровни штрафов/давления, чтобы робот красиво закольцовывал добычу с большим выигрышем по времени, чем сейчас.
Параметры: чанк со стандартной генерацией (IC2+AE2), без каверн, алмазная кирка без всяких заклятий и примочек, робот без бустеров.
Время Шаги Повороты Сумма 1361 1094 430 1524 послойный 1189 982 358 1340 свободный без улучшений 1185 972 358 1330 недоход по y 1156 932 368 1300 недоход по y, давление вниз 1248 1076 360 1436 недоход по y, давление вверх 1254 1036 380 1416 недоход по xyz 1186 948 368 1316 недоход по xyz, давление вниз 1267 1064 374 1438 недоход по xyz, давление вверх 1210 996 302 1298 штраф на повороты, недоход по y 1141 928 326 1254 штраф на повороты, недоход по xyz, давление вниз 1291 1122 358 1480 штраф на повороты, недоход по xyz, давление вверх x2 1244 1032 368 1400 штраф на повороты, недоход по xyz, давление вниз x2
Итого, самый оптимальный получился - 1254 действия за 19 минут 1 секунду.
А вот прогон на тестовом стенде ничего не показал - слишком маленькое расстояние. Но все-таки, на 10 секунд раньше взял последний блок, чем в прошлом тесте.
- 3
0 комментариев
Рекомендуемые комментарии
Нет комментариев для отображения