AI miner'

AI miner'

Введение


Приветствую архитекторов фабрик Factorio и к ним причастных. В связи с дефицитом контента гайдов по моду Space Exploration в RU сегменте я решил написать вторую статью «недлявсех» со сложностью звездочка.

Для понимания логики работы представленного логического автомата желательно иметь представление о реализации счётчика на логике Factorio. Если Вам лень вникать во все, что я тут подробно намяукал, достаточно ознакомиться с разделами введение, 1, 4 и 5 для «запуска» автомата.

В моде Space Exploration у нас несколько планет и в стародавние времена народ обычно не парился и быстро разворачивал на планете мини колонию из реактора, добычи руды берила, холминита и т.д., несколько ракетных площадок, где вся добываемая руда тупо запуливалась на Навиус для собственно переработки руды в слитки. Это и раньше было не особо рационально, нынче же сильно порезали стаки этих руд и обработку руды до слитков лучше производить на месте добычи, а уже потом транспортировать куда надо.

Для обработки руд необходимы вспомогательные ресурсы: сера, пластик, серная кислота и т.д. Для их сбора не всегда целесообразно разворачивать колхоз из буров с конвейерной или железнодорожной обвязкой. Объемы добычи вспомогательных ресурсов невелики и обычно достаточно использовать стак Miner’ов и Hauler’ов.

В статье описаны автоматы, для маркировки ресурсов и их сбор 15 парами Miner/Hauler. Обеспечен сбор в том числе руд, для добычи которых необходимы жидкости (в бочках). Автомат разработан под связку модов Space Exploration + Krastorio 2 + сборник BZ mods (соль + алюминий + свинец + олово + титан + графит). Итого двадцать руд, если работать с

бур+конвеер/поезд – получится «безбрежное море спагетти на каждой колонии», а с автоматизированным стаком Miner + Hauler будет «просто море спагетти» с которым уже можно работать.

Автомат использует 3 здания с периодом в 1 тик для маркировки ресурсов и 4 здания для управления юнитами с периодом в 20 тиков. Максимально UPS френдли. Суммарное потребление менее 3 МВт, держим экоповестку, минимизируем углеродный след :-) Ну и по традиции, представляю Вашему вниманию видео и текстовую версию статьи. Поехали!

1. Используемые моды

В очередной раз я использую моды которые разработал уважаемый, гениальный и талантливый автор Earandel:

1. AAI programmable vehicles – мод, добавляет версии юнитов, которыми можно управлять как в РТС стратегии;

2. AAI programmable structures – мод, добавляет здания для управления юнитами из первого мода;

3. AAI zones – нужен для первых двух модов;

4. AAI signals – аналогично моду 3;

5. AAI vehicles miner – добавляет юниты Miner для добычи руд;

6. AAI vehicles hauler – добавляет юнит Hauler, используется для перевозки ресурсов;

2. AI юниты и их размещение


AI miner' image 18

AI miner' image 19
AI miner' image 20
AI miner' image 21
AI miner' image 22

Давайте коротко пройдемся по самим AI юнитам и их управлением.

Юниты, которыми можно управлять как в РТС стратегии имеют в названии приставку AI. Управлять можно после вызова интерфейса дистанционного управления (по дефолту кнопка Y), обводите мышкой юниты, shift + левый клик, и они поехали.

На интерфейсе:

1 - Type ID,

2 - ID,

3 - Unit Data для настройки поведения инвентаря юнита,

4 – режим поведение юнита,

режим Auto – если в юнит сел игрок, юнит подчиняется игроку, иначе согласно внешним командам;

режим ON – подчиняется только внешним командам;

режим OFF – юнитом управляет только игрок, который в него сел.

Начало оффтопа: По второму нажатию на Y выходит интерфейс настройки путей следования, создаем путь следования, потом отправляем юнит в начальную точку и юнит поедет по «чекпоинтам», в путь следования можно включать другие юниты, депо и маяки.

Я использую пути следования для починки стен AAI Warden’ом (одноименный мод AAI Warden, предоставляет юнит, который с дистанции ремонтирует поврежденные постройки и юниты). Выставляю путь следования вдоль стен с заездом в депо с ремкомплектами и топливом. Весьма удобно, значительно практичнее и дешевле ремонта стен дронами,

можно не ограничиваться отдельными аванпостами, а выгрызать у кусак и легко оборонять обширные куски карты в том числе от armored/ice/explosive biters. Метод рабочий, проверено. Конец оффтопа.а выгрызать у кусак и оборонять обширные куски карты. Метод рабочий, проверено.

Это депо, ящик на 300 слотов, который в соответствии с настройками Unit Data перекидывает ресурсы из юнита в себя и обратно. На нем сверху справа находиться комбинатор, в котором можно установить настройки поведения его инвентаря, об этом подробнее в сл. разделе.

Это гараж, служит для размещения юнитов на «землю», т.е. вы манипулятором загружаете в гараж юнит, после чего он выезжает из гаража. Внизу слева на гараже есть постоянный комбинатор, на котором можно настроить Unit Data выходящего юнита.

Еще мы используем следующие здания:

Tile Scanner – здание, для сканирования клеток карты. В него подаем как координаты отдельных клеток и/или радиус, в круге которого рандомно будут сканироваться клетки карты.

Zone Scanner – здание, для получения координат клеток по номеру зоны, подаем номер клетки зоны, получаем её координаты.

Unit Scanner – здание для сканирования юнита и его параметров.

Zone Controller – здание, для маркировки клеток карты зонами, необходимо подавать зону и координаты.

Unit Controller – здание для контроля юнитов, необходимо подавать ID юнита и координаты точки, куда ему ехать.

Unit Data Controller – здание, для редактирования Unit Data.

У каждого здания можно настраивать входные и выходные параметры. Более подробно об этом читайте в документации мода AAI programmable vehicles. Документация подробная, к сожалению инглиш онли (это не точно).

3. Настройки инвентаря AI юнитов


AI miner' image 47

Рассмотрим управление инвентарем AI юнитов и депо. Отрицательное значение ресурса означает, что юнит/депо его выгружает, положительное добирает до выставленного значения. Приоритеты погрузки ресурсов: Miner (максимальный), Hauler, депо (минимальный). Т.е. если рядом депо, Miner, Hauler, в инвентаре одного из них 20 угля, у всех в Unit Data установлено 20

угля, то 20 угля окажется где? Правильно - в Miner’е.

В моём случае используются следующие настройки Data:

Hauler грузит на 10к все руды и дерево, 500 топлива, ещё установлено минимальное значение топлива в 100, бочки с жидкостью по необходимости.

Miner всю руду и дерево отдает, принимает 300 топлива, бочки с жидкостью по необходимости.

Депо отдает топливо, бочки с жидкостями, принимает по 10к руд, дерева и пустые бочки.

Всё это несложно для понимания, но легко допустить неочевидную ошибку, которую потом трудновато обнаружить. Поэтому чтобы не парится с этими Unit Data’ми, это за Вас это сделает автомат сбора руд.

4. Автомат маркировки ресурсов


AI miner' image 56

В руководстве модов описан вариант поиска и последующая маркировка руды с помощью случайного поиска Tile Scaner’ом в заданном радиусе, но мне этот способ не нравится, он прям жалок, убог и совершенно не практичен.

Я использую свой автомат для маркировки руды: в начале я «руками» маркирую место ресурсов зоной левая синяя диагональ, а автомат проходит эти зоны и перемаркировывает их в соответствии: железо - синий крестик, медь – оранжевый крестик, уголь - черный крестик и так далее. После 100 клеток зоны левая синяя диагональ далее каждые 100 тиков меняется проверяемая зона, и прогоняются первые 100 клеток каждой зоны уже отмеченных руд с проверкой на истощение ресурсов и если ресурсов на клетке 0 – стирает зону. Все это через организовано через счётчик А от 1 до 2000, тип зоны выбирается после деления А на 100, номер клетки зоны остаток деления А на 100.

Далее номер клетки зоны подается в Zone Scaner, который дает координаты этой клетки, которые уже подаются в Tile Scaner который проверяет наличие ресурсов на клетке по этим координатам. В зависимости от ресурсов определяется тип зоны. Тип зоны и координаты клетки подаются на Zone Controller где клетка маркируется. Если ресурсов на клетке нет, то на Zone Controller подаются только координаты клетки и происходит затирание зоны по этим координатам.

Все просто и логично, ток комбинаторов многовато (на каждый тип руды три комбинатора), больше комбинаторов богу комбинаторов. Единственный минус – это то, что клетки зон постоянно «мигрируют», так как при каждом проходе маркер зоны записывается поверх старого маркера обновляя его номер. Т.е., например, если вы «выделите» для сбора руды две области, то Miner будет иногда кататься из одной области в другую, следуя за первой клеткой зоны. Поэтому я не рекомендую «выделять» больше одной области для каждого вида ресурсов.

5. Автомат управления Miner’ами и Hauler’ом


AI miner' image 62
AI miner' image 63

Автомат сделан для связки модов Space Exploration + Krastorio 2 + сборник BZ mods (соль + алюминий + Свинец + олово + титан + графит) и служит для добычи вспомогательных руд на дополнительных планетах. Обычно депо, куда Hauler будет высыпать руду, я ставлю возле накопителя руды от работы бура планетарного ядра, откуда она уже через сепаратор заводится на фабрику. Т.е. к руде с бура ядра планеты подмешивается по необходимости руда с Miner’ов. Как я уже говорил, автомат управляет Miner - 15 шт. и Hauler - 15 шт. Вообще схема настроена на использование именно фиолетовых Miner’ов. До зеленого Miner’а далековато тянуться по техам, а дополнительные планеты надо осваивать уже сейчас, поэтому я не заморачиваюсь с апгрейдом Miner’ов, фиолетовых Miner’ов для сбора вспомогательных ресурсов более чем хватает. Если Вы используете зеленые Miner’ы необходимо в автомате заменить иконки ID. Также замените в автомате иконки горючего на более другое, если вы используете отличное от горючего по умолчанию.

Вот так выглядит пример реализации добычи руды моей типовой колонии. Как видите к руде с бура ядра планеты подмешивается руда собираемая Miner'ами, которая через сепаратор заводится на складские ящики для руды. все склады подключены к логической сети и заведены на автомат сбора руд. Ниже сепаратора расположены ракетные площадки, справа переработка нефти, слева мини фабрика.На минифабрике готовлю снаряды планетарной обороны и капсулы доставочной пушки, там же готовятся вспомогательные ресурсы. Слева от складов вокзал, над и под вокзалом переработка основного ресурса (берил/вулканит и т.п.).

Автомат сбора руд запускается включением постоянного комбинатора блока № 7, на автомате он расположен по центру и содержит слово GO.

Автомат использует следующие зоны:

20 зон обозначения руд (см. раздел № 4);

1 клетка зоны Черный круг – ставится на депо, в это место Hauler’ы будут выгружать руду, забирать топливо и бочки;

16 клеток зоны Черное кольцо - необходимо разместить на карте на некотором отдалении друг от друга, это места для парковки Miner’ов, чтобы они не толпились у депо после разгрузки, когда собирать руду не требуется.

Зона разрабатываемой руды, ID Miner’а и ID Hauler’а выставляется в блоке № 2 в нижних постоянных комбинаторах (см. 4 главу статьи о зонах маркируемых руд. Если вы добываете одну руду двумя Miner’ами, то лучше их направить на разные клетки зоны, например, первый Miner добывает первую клетку зоны, а второй - двадцатую клетку зоны, чтобы они меньше сталкивались).

Для корректной работы автомата необходимо:

Тщательно проверить соответствие зон, лимитов руд и ID юнитов в блоке № 2 для корректной работы автомата!

Установить на депо зону черный круг и 15 зон черное кольцо в пустом месте карты на некотором удалении друг от друга. Иначе после выгрузки руды Hauler остановиться в депо после разгрузки и другие Hauler’ы не смогут к нему проехать.

Своевременно грузить в депо бочки и горючее.

НЕ НАСТРАИВАЙТЕ Unit Data юнитов, это за вас сделает автомат сбора руд автоматически. После размещения всех юнитов «на землю» через ~5 мин после работы автомата, блок № 9 служащий для настройки Unit Data можно удалить (см. раздел № 8)!

6. Логика автомата управления Miner’ами и Hauler’ом


AI miner' image 78

Автомат использует следующие сигналы:

Зелёный сигнал – необходимо собирать руду;

А – счетчик тиков до 60, длительность работы с каждым юнитом;

В – счетчик тиков до 120, длительность работы с каждой парой

юнитов;

М – номер пары Miner / Hauler;

F (full) – F = 1 Miner существует, F > 1 Miner необходимо разгрузить;

U (unload) – U = 1 Hauler существует, U > 1 Hauler необходимо

разгрузить.

Режим работы автомата: B < 60 - Miner, B > 60 – Hauler. При переполнении руд на складе - зелёный сигнал становится равен нулю, Hauler едет на парковку.

Блок № 1 счётчиком с периодом 1800 тиков поочередно перебирает режимы работы автомата для каждой пары Miner / Hauler с периодом 60 тиков на юнит.

Блок № 2 (про добываемые зоны см. 5 раздел статьи) определяет Miner, руду для добычи и приписанный к нему Hauler.

С блока № 2 данные блоком № 3 через перебор пар Miner / Hauler подаются на блоки № 4, 5 и 6.

Блок № 4 сканирует Miner’ы и по итогам сканирования рождает координаты Miner’а и сумму сигналов F которая подается в блок № 6. Сигнал F рождается: если Miner существует, если топливо меньше 30, если свободных слотов меньше 5. Девять верхних комбинаторов служат для работы с бочками. F рождается если число бочек меньше минимального, но эта F подается на суммирование если тип зоны (определяется рудой) соответствует бочке. Например, если бочек с серной кислотой меньше 3 и зона зелёный крестик (уран), то сигнал F +1. Если Miner’а не существует, то F = -25.

Блок № 5 сканирует Hauler’ы и по итогам сканирования рождает сумму сигналов U которая подается в блок № 6. Сигнал U рождается: если Hauler существует, если топливо меньше 30, если свободных слотов меньше 5. Верхние комбинаторы служат для работы с бочками (см. блок № 4). U рождается, если число бочек меньше определённого количества, но эта U подается на суммирование если тип зоны (определяемой рудой) соответствует бочке. Число бочек, например, для урановой руды можно рассчитать следующим образом: 120 слотов в Miner’е это 6к руды, для их добычи надо 6к серной кислоты или 120 бочек, если учесть бонус от добычи руд 30-50% получается необходимо грузить ~80 бочек. Если Hauler’а не

существует, то U = -25.

Блок № 6 определяет ветвление логики. При наличии зелёного сигнала для Miner’а: если F > 0, едем на зону добычи руды. При наличии зелёного сигнала для Hauler’а по приоритету:

если U > 1, едем в депо (макс. приоритет);

если U = 1, F > 1, едем к Miner;

если U = 1, F = 1, едем «на парковку» в зону Черное кольцо (мин. приоритет). Это необходимо делать, иначе после выгрузки руды Hauler остановиться у депо после разгрузки и другие Hauler’ы не смогут к нему проехать.

Если зелёный сигнал отсутствует, выполняется только расчёты двух действий Hauler’а – выгрузка (по необходимости) и «парковка».

Реализация ветвления логики в блоке № 6 получилась довольно замысловатая, предлагаю разобрать её самостоятельно, задание так сказать с двумя звёздочками.

Блок № 7 включает автомат. Итог работы блока № 6 поступает в Unit Controller если сигнал включения > 0.

7. Периоды, частоты и синхронизация вычислений логики автомата


AI miner' image 103

После реализации вышеописанной логики можно запускать автомат в работу, и он начнет корректно работать невероятно глючить. В связи с тем, что логика Factorio растянута во времени, т.е. на разных участках автомата момент вычислений разный и при пересечении ветвлений логики необходимо обеспечивать синхронизацию веток. Если это не делать, то запросто случается ситуация «в духе»: в момент переключения Miner’а логика разделится на две ветки, первая уйдет в Unit Scanner подтвердить ID Miner’а, а вторая в Zone Scanner добывать координаты клетки для майнинга. Из-за разной длины этих веток в блок принятия решений может прийти ID «старого» Miner’а и координаты для следования уже для «нового» Miner’а в связи с тем, что длина ветки цепочки комбинаторов для получения ID Miner’ов длиннее ветки цепочки комбинаторов для получения координат

пути следования. Происходит рассинхронизации работы автомата и появляются пробег транспорта, не предусмотренный логикой автомата.

Синхронизировать работу автомата выравниванием длин цепочек ветвлений можно включением в цепочку дополнительных комбинаторов в виде «каждый * 1 = каждый». В нашей ситуации, где происходит перебор Hauler’ов и Miner’ов у которых логика разная, а комбинаторы и здания для programmable vehicles используется одни и те же, обеспечить синхронизацию ветвлений нетривиальная задача. Плюс любое добавление дополнительного комбинатора и необходимо снова считать тики логики.

Чтобы с синхронизацией не заморачиваться я не стал компенсировать рассинхрон вычислений, а тупо вырубаю Unit Controller до окончания переходных процессов блоком № 8. Блок № 8 при А < 25 и А > 50 подает отрицательный сигнал включения в блок № 7 и данные с блока № 6 не попадают в Unit Controller. Длина ветвления в автомате до 10 тиков, поэтому первые и последние тики счётчика А автомат не работает, ждет окончания переходных процессов. Очевидно в оставшийся интервал 25 тиков надо всунуть действие с юнитом, т.е. здания Unit Scanner и Unit Controller должны работать с периодом меньше 25 тиков (см. на рис.).

Вообще, говорят, что моды AAI programmable structures+vehicles достаточно сильно просаживают UPS, поэтому желательно не душить процессор лишними зданиями по управлению юнитами, а также в зданиях устанавливать период работы с максимально возможным периодом тиков. Очевидно, что период по управлению юнитами спокойно можно растянуть до секунды на юнит или 60 тиков.

Как я уже рассказывал автомат работает в двух режимах, 15 сек управляет Miner’ами и 15 сек Hauler’ами (по секунде на юнит). Иногда возникает ситуация, когда Hauler доехал Miner’а, а автомат только переключился на следующий юнит и Hauler стоит на месте 20-25 сек и ждёт пока у автомата «дойдут до него руки», чтобы уже наконец поехать обратно в депо. Когда я это наблюдал, то терпения именно моего сознания в суперпозиции шредингера «автомат работает/не работает» не хватало и сознание уходило в позицию «блин, автомат опять не работает!», я уже начинал наводить мышку на комбинаторы, искать «проблему», а тут значит Hauler оживал и ехал в депо. Поэтому я сократил суммарный общий период до 8 сек, и терпения созерцать 3-5 сек простоя Hauler‘а моему сознанию уже стало хватать без наступления panic-mode, автомат «стал работать бесперебойно». Весьма забавно, что периоды работы логики автомата определяет не целесообразность игровой ситуации, а забота ментальным здоровье стороннего наблюдателя.

После отладки и настройки автомата я волевым решением вернул периоды в одну сек на юнит, автомат перестал быть отзывчивым, но стал более «целесообразным». Выиграл так сказать по UPS (это не точно), по крайней мере мой сэйв на моём компе работает без просадок, возможно дело в убогих масштабах моих фабрик (или у меня производительный компуктер).

8. Загрузка настроек поведения инвентаря юнитов.

Как я уже говорил, выставить Unit Data довольно муторное дело и черевато неочевидными ошибками, а планет где надо развернуть наш цирк-шапито сильно больше одной, поэтому чтобы каждый раз не париться при развертывании колонии я добавил блок № 9 для автоматической настройки Unit Data всех Miner’ов и Hauler’ов в соответствии с типом добываемой ими руды.

В шести нижних рядах комбинаторов блока № 9 установлены лимиты бочек с жидкостями, они добавляются в Unit Data только в случае если бочка соответствует зоне для добыче руд. Очевидно, что Unit Data работы с бочками для Miner’ов и Hauler’ов одинаковы.

В постоянных комбинаторах слева и справа от них содержатся общие Unit Data для всех Miner’ов и Hauler’ов соответственно.

Эти данные поочередно в соответствии с режимом работы Miner/Hauler подаются на Unit Data Controller, который записывает Unit Data. Для отключения влияния переходных процессов (см. раздел 7) при А < 25 и А > 50 данные в Unit Data Controller не подаются.

Очевидно, что после одного прогона автомата все Unit Data Miner’ов и Hauler’ов будут установлены, и если вы не планируете изменять структуру добычи на планете в дальнейшем, то блок № 9 можно смело убрать, все-таки Unit Data Controller потребляет аж целый 1 МВт (и немного драгоценных UPS).

Чертеж автомата для сбора руды

Скачать текстовый файл с четырьмя чертежами:[disk.yandex.com]

- автомат маркировки руды,

- автомат сбора руды,

- сепаратор для колонии,

- отдельно блок автомата маркировки руды для автоматического выставления UnitData.

В общем как-то так всё это и работает, майнеры крутятся, ресурсы мутятся. На этом всё, берегите себя, свою фабрику, надеюсь Вам понравилось, до новых встреч, пока!

Source: https://steamcommunity.com/sharedfiles/filedetails/?id=2732393982					

More Factorio guilds