Перейти к содержанию

Doob

Гуру
  • Публикаций

    776
  • Зарегистрирован

  • Посещение

  • Победитель дней

    78

Весь контент Doob

  1. Тут весь фокус в том, что нет реальных торов и сфер. Есть плоскость, которая модификацией рендера выглядит как сфера. Я даже могу реализовать похожий эффект при помощи OpenComputers, если можно получить эффект этого рыбоглазного искажения. Достаточно сдублировать плоскость во все стороны - получится фокус с торусом. Игрок будет бежать в одну сторону, видеть горизонт, получившийся визуальным изгибом плоскости, плоскость будет постоянно копироваться спереди и исчезать сзади. Но тут проблема в том, что получится только грубая иллюзия. Надо чтобы рендер корректно дорисовывал плоскость на месте стыков и без рывков переносил игрока с одного края на другой. Я давно хотел сделать кое-что подобное, там игрок мог бы перемещаться по гиперграням тессерактов, сложенных в какую-нибудь фигуру. Получался бы трехмерный лабиринт, заключенный в четырехмерный. Для игрока это выглядело бы как приключения из фильма Куб. Но все уперлось в малое быстродействие телепортера. Телепортация дебагой занимает минимум два тика, это очень режет глаз, поэтому без специально созданного мода, красивой иллюзии не добиться. И я отказался от этой затеи.
  2. Я тоже такую оболочку делал, но идея себя быстро исчерпала.
  3. Нужен мод на рендер и генерацию. Разделить платформу на две части, свернуть перпендикулярно самой себе. Надо только понять, как рендерить место склейки платформ и скрыть переходы. Локальная система координат никак не изменится.
  4. Есть такое, OpenPython называется. Но клепает его один человек, поэтому похвастать нечем. Работает кое-как, даже стабильной версии нет, годится только для микроконтроллеров. Где-то еще встречал упоминания о питоно-подобном процессоре для опенкомпов, но сейчас найти не могу.
  5. Никто и не собирался нейросетью решать задачу коммивояжера, это абсолютно бессмысленное занятие. А вот научить робота самому добывать пропитание и ресурсы для людей - это задача как раз по силам полносвязной сетки.
  6. Довольно странное замечание, кто заставит игроков добровольно избавляться от своего права голоса? Наоборот будут экономить, чтобы был голос на случай мелких пакостников.
  7. Силовые поля это круто, решилась бы проблема с заброшенными тысячелетними приватами. Еще можно ввести систему социального рейтинга, чтобы игроки могли голосовать друг за друга. Например, всем сервером проголосовать против злого грифера или матершинника, ему накинутся рандомные эффекты постоянного отравления/усталости/слепоты, отключится чат. И все это в зависимости от количества дизлайков. Каждый игрок может поставить один лайк/дизлайк раз в сутки. Одному и тому же игроку нельзя ставить одинаковую оценку два раза подряд. В зависимости от уровня кармы даются определенные эффекты. Карма постепенно стремится к нейтральному уровню. Реализовывается компом с комблоком и дебагой. В большинстве случаев, конфликты будут решаться без участия модератора, силами самих игроков.
  8. Ставили уже все моды, приходилось резать и удалять, все дюпает и крашит. Evil - нормальный сервер, но инфраструктура крайне неудобная, на прошлом IT было лучше. Задумка с ульем интересная, но реализация хромает. Многие сейчас переходят на 1.8, 1.12.2, там моды интереснее, дюпов меньше, но стабильности нет. Чтобы все собрать, поднять и починить, нужны копейки, а чтобы добыть копейки нужен донат и донатеры.
  9. Вичкрафт был бомбезный, после того, как все IT подряд слились. А вообще, на других проектах, сборки с компьютерами так быстро не затухают. Ибо куча разных серверов, у игроков есть выбор, легче привлечь новых. А у нас 500 игроков за весь аптайм сервера и с каждой сборкой все меньше и меньше.
  10. В процессе подгонки всех функций программа очень быстро разрослась. Дам краткий обзор всех новинок. Минимальная и максимальная плотность были вынесены в начало программы к остальным переменным. + переменная port, для модема. + переменные steps и turns, вначале для отладки. steps пригодилась для подсчета шагов, чтобы каждые 32 шага проверять состояние инструмента и батареи. + функция arr2a_arr() - преобразование списков в ассоциативный массив для быстрого доступа к элементам. Массивы tails, fragments преобразуются этой функцией, функции работающие с ними, адаптированны соответствующим образом. + функция report(), позволяющая передавать пользователю статусные сообщения посредством модема или связанной карты. В данный момент еще пикает и выводит сообщения на экран. Также завершает работу программы, при получении соответствующего параметра. remove_point() отделилась от функций, удаляющих метки из таблицы. Функция check() отделилась от функции step(). Каждые 32 шага или по принуждению вычисляет расстояние до стартовой точки, сохраняет текущие координаты. Если уровень энергии или инструмента не хватает на дорогу до дома + 64 шага, совершается переход домой, потом возврат к работе. Если есть генератор, происходит попытка заправки. Каждый шаг проверяются точки вокруг робота и удаляются, если робот может их достать. Функция calibration() объединилась с калибровкой компаса. Происходит проверка компонентов: геосканер, контроллер инвентаря, инструмент и наличие блока под роботом, в случае не обнаружения - программа завершается. Настраиваются модем или связанная карта. sorter() упростилась и ускорилась. + функция home() перемещает робота на точку старта, запускает сортировку и упаковку предметов, ищет сундук (требует, в случае не обнаружения). Складывает добычу в сундук, в случае переполнения ждет, когда освободится место. Достает из сундука неупакованные предметы и переупаковывает. Забирает из сундука стак с углем, при наличии генератора. Кроме перехода к точке старта, ищет в инвентаре эндерсундук из EnderStorage и сгружает ресурсы в него. Пытается найти более новый инструмент в сундуке, либо ищет зарядник и пробует засунуть в него и зарядить. На точке старта ждет, пока уровень энергии не достигнет 99% потом возвращается к работе. + функция main() - основной цикл сканирования и добычи. Робот сканирует весь чанк, в цикле перебирает все метки, выбирает ближайшую и перемещается к ней, пока не пройдет по всем. Ну и цикл перехода по спирали от чанка к чанку. Запускает функцию main(), по завершении вычисляет координаты следующего чанка, перемещает к нему, запускает main() и т. д., пока не дойдет до последнего, потом вызывает функуию home() и завершает работу. Осталось добавить возвращение по хлебным крошкам при аварии. И правильную работу с инструментами, имеющими нестандартную механику износа - энергетические и магические кирки/буры из модов. Еще можно заставить робота таскать с собой генератор из какого-нибудь мода и зарядник, тогда ему не нужно будет возвращаться на точку старта для подзарядки (а с эндерсундуком вообще на надо будет возвращаться) Бета-версию можно посмотреть и скачать тут - https://pastebin.com/hXWLDKre
  11. @Totoro и ко делают крутой эмулятор, в котором можно будет работать с майновскими сохранениями, в комплекте с ускоренным выполнением кода, можно будет обучать сеть без всяких костылей.
  12. Меня прельщает то, что входов и выходов мало, их легко нормализовать, есть кое-какие возможности (функция получения времени или уровня энергии), позволяющие спроектировать очень простую нейросеть. Обучать, да, сложно. Это собрать данные, собрать статистику, без прямого обучения через тушку робота это очень сложно. Но можно будет дообучать сеть в процессе работы. Например, будет найдено равновесное состояние, при котором роботы будут добывать себе топливо и алмазные кирки. Но в таком случае, эти автономные агенты будут совершенствоваться не зависимо друг от друга. Либо, можно подключить все тушки к одному серверу, который на основе данных от роботов, будет дообучать сеть и выдавать обновления.
  13. Большую часть я уже решил штрафами и логической связкой, на каждый хак там всего пара строчек. Конечно, это довольно механическое решение, оно не всегда работает оптимально. Но и нет такого огорода с вычислениями. Года два или три назад, я гонял генетические алгоритмы для того, чтобы заставить роботов искать ресурсы, обеспечивать себя энергией, взаимодействовать с игроком, без контроля со стороны игрока. Дело шло хорошо, но очень медленно, даже распараллелив вычисления и ускорив время, ждать результата обучения, пришлось бы очень долго (это при том, что все сложные функции были написаны руками) Меня давно интересует вариант засунуть в робота простую нейросетку, самый сложный этап обучения будет как раз у сканирования и добычи. Но практической пользы все-таки маловато, т. к. в текущем варианте робот добывает все и сразу. А с нейросеткой, будет блуждать по миру, выдавая ресурсы только по приказу игрока (можно сделать тягу к заряднику, но тогда робот много не добудет) Но потребление памяти и процессора во время работы, будет практически нулевым, т. к. обученная нейронка будет просто выплевывать готовые последовательности действий на внешние данные.
  14. Эвристические функции: Давление - штраф на ход по вертикали. Нужен из-за того, что начало сканирования либо сверху, либо снизу, следовательно, заканчивать добычу надо ближе туда, где начнется следующее сканирование. Недоход - робот не заходит на позицию метки, чтобы сэкономить лишний шаг (не всегда оптимально, но суммарный эффект - положительный) Штраф на повороты - добавление шага, при оценке расстояния, если целевой блок находится дальше, чем в одном блоке от текущей оси. Изначально идея была в том, чтобы собрать такое сочетание эвристик, при котором робот будет быстрее заканчивать добычу и выходить к точке старта. Важно, чтобы робот финишировал наверху, для быстрого перехода к следующему чанку. Сначала добавил ограничение хода по вертикали. Если робот может достать блок, не доходя до него, то добывает и ищет следующий. Потом добавил такую же функцию для всех осей. Прибавил еще мягкое давление по вертикали, чтобы нижние блоки имели приоритет над верхними. Но когда запустил пачку роботов, перепутал знак и получил давление вверх. Пришлось потом запускать еше, с правильной формулой. Из всех решений выбрал лучший результат - штраф на повороты, недоход по всем осям и давление вниз. В тесте робот довольно много скакал по вертикали, я решил это исправить. Увеличил давление в два раза, но не заметил, что половина формулы поменяла знак. Робот стал настолько мало скакать по вертикали, что процесс превратился в послойную добычу, со слоем 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 секунд раньше взял последний блок, чем в прошлом тесте.
  15. Да, есть много тонкостей, много возможностей, но есть одно "но". Процессоры у опенкомпов на уровне калькулятора, а памяти вообще ни на что не хватит, т. к. для быстрых вычислений граф надо приводить к определенному виду и на каждой итерации генерировать переменных, в разы превышающих размер исходного графа. Попробую, в качестве эксперимента погонять на чистом Lua, чтобы оценить, на сколько миллиардов лет зависнет робот, при таких вычислениях.
  16. Монте-Карло не самый лучший, зато самый компактный. Я не представляю, как можно вычислить оптимальный путь без пошаговой имитации всех действий робота. Прыжки по осям, повороты, обработка кластеров это не сложно. Но для поиска пути между нодами, перебора всех путей, надо будет написать столько логических ветвлений и циклов, что код придется закинуть на жесткий диск. А программа на двух носителях это уже менее юзерфрендли. Подгрузка частей программы из внешних источников, сделает ее совсем не автономной и не вяжется с идеей робота-шахтера. Я думаю, что коммивояжера просчитывать нужно для стационарных путей, а не для сиюминутного результата. Но было бы интересно посмотреть, как это будет работать в текущей задаче.
  17. Мне не нужно, чтобы он копал слой через два в свободном режиме, для этого есть алгоритм добычи "слой через два", который оказался самым неэффективным из эффективных. Мне нужно, чтобы робот добывал руду эффективней, с большей скоростью, с меньшими затратами энергии. Мне осталось протестировать 3 эвристики из 7. По готовности, опубликую результат с замерами. Я предлагал рассчитывать путь до кластеров, а не одиночных блоков, еще когда сам играл с послойной добычей. Но зная как работает робот, считаю вычисление полного пути не эффективным - это сильно раздует код, а если рассчитывать еще с минимальным количеством действий, это ОЧЕНЬ сильно раздует код. Сложно представить, какая нагрузка на процессор будет даже при использовании метода Монте-Карло, может он будет падать с елдингами без остановки. Были бы в роботах квантовые процессоры, я бы конечно, запилил решение задачи коммивояжера. Но в текущей ситуации, приходится искать баланс между эффективностью и сложностью. Тестовые прогоны показывают уровень эффективности около 80% от идеальной, пока ищу такое сочетание эвристических хаков, при котором она будет выше и код программы не подскочит до нескольких мегабайт в сжатом виде. P.S. Вычисления может производить не только робот, есть ведь доступ к внешним ресурсам - таблицу меток можно загрузить через интернет на более эффективное устройство, которое выдаст готовый путь, но это уже другая история.
  18. Действительно, этот метод есть только у МС 1.10 и выше
  19. Имя блока типа minecraft:block_name? getBlockState() поможет?
  20. Да, хорошо, штраф сделать не просто разницей между верхним Y и текущим. А умножением, относительно всей доступной высоты. Так и сделаю. Повороты можно даже не штрафовать, а делать анализ, на этапе поиска цели.
  21. Для настройки работы программы, надо узнать плотность добываемых блоков и плотность мусора, чтобы сделать предварительный фильтр на этапе сканирования. Плотность одной руды в разных модах отличается, но она близка к ванильной т. к. механика работы инструментов одна. Сделал шпаргалку с информацией о плотностях из разных модов. Плотность, уровень инструмента, название. Minecraft 3 2 Алмазная руда 3 2 Изумрудная руда 3 2 Золотая руда 3 2 Красная руда 3 1 Железная руда 3 1 Лазуритовая руда 3 0 Угольная руда 3 0 Кварцевая руда 0.3 -1 Светокамень -1 -1 Бедрок 50 3 Обсидиан 3 -1 Эндерняк 2.5 0 Сундук 2 0 Булыжник 2 -1 Адский кирпич 2 0 Доски 1.5 0 Камень 1.5 -1 Каменный кирпич 1.25 -1 Терракота 0.8 0 Песчаник 0.6 0 Трава 0.6 0 Гравий 0.6 0 Глина 0.5 0 Земля 0.5 0 Песок 0.4 0 Адский камень 0.5 0 Песок душ -------------------------------------------- IC2 4 2 Урановая руда 3 1 Медная руда 3 1 Оловянная руда 2 1 Свинцовая руда -------------------------------------------- AE2 50 3 Небесный камень 50 0 Сундук из небесного камня 3 0 Кварцевая руда -------------------------------------------- Mekanism 3 -1 Осмиевая руда 3 -1 Медная руда 3 -1 Оловянная руда -------------------------------------------- Forestry 3 1 Апатитовая руда 3 1 Медная руда 3 1 Оловянная руда -------------------------------------------- TConstruct 10 4 Кобальтовая руда 10 4 Ардитовая руда -------------------------------------------- ThermalFoundation 3 1 Медная руда 3 1 Оловянная руда 3 2 Серебряная руда 3 2 Свинцовая руда 3 1 Алюминиевая руда 3 2 Никелевая руда 3 3 Платиновая руда 3 3 Иридиевая руда 3 3 Мифриловая руда -------------------------------------------- Galacticraft 6 1 Алюминиевая руда 5 1 Оловянная руда 5 1 Медная руда 3 2 Кремниевая руда Moon 5 1 Медная руда 5 1 Оловянная руда 5 -1 Сапфировая руда 3 1 Сырная руда 1.5 0 Лунный камень 0.5 0 Лунный грунт 0.5 -1 Лунный дерн Mars 2.2 3 Деш руда 2.2 1 Железная руда 2.2 1 Оловянная руда 2.2 1 Медная руда 2.2 0 Булыжник 2.2 0 Реголит Asteroids 3 2 Алюминиевая руда 3 3 Ильменитовая руда 3 2 Железная руда 3 0 Камень Venus 5 -1 Алюминиевая руда 5 -1 Медная руда 5 -1 Свинцовая руда 5 -1 Кварцевая руда 5 -1 Кремниевая руда 5 -1 Оловянная руда 5 -1 Солнечная пыль 2.2 1 Магма 2.2 1 Пемза 1.5 1 Твердый камень 0.9 1 Мягкий камень 0.9 -1 Выжженный камень
  22. Предпочтения игрока тут не учесть, руды все одной плотности (ic2 свинец это недоразумение, а не руда). Послойная обработка не выгодна тем, что робот нарезает круги, когда в паре слоев от него есть руда. Сплошную поддерживают оба алгоритма -- пока не будет добыт весь кластер, робот не уйдет, но послойный оставит недоступный слой на потом. На стандартных генерациях ванилы, IC2, AE2 (тестировались отдельно) свободный обход существенно превосходит послойный (4 чанка, высота 64). Поэтому, статистика говорит в сторону этого подхода, а что админ накрутит генерацию - проблема индейцев. Изначально, я планировать сделать гибрид из этих двух алгоритмов - робот свободно выбирает цель, но получает огромный штраф на ход по вертикали +Y. Добыча велась бы максимально оптимально и робот заканчивал чанк наверху, откуда короче путь к старту следующего чанка. На стенде подобрал расположение руд, чтобы оно было похоже на реальную генерацию и оба алгоритма были бы в одних условиях (руда в каждом слое, свободный пробег 1600 блоков) Меня больше интересуют советы по оптимизации упаковщика, потому-что на каждый сундук робот тратит около 30 секунд. В прошлой версии скорость была фантастической, но хак, который я использовал убрали после какой-то обновы.
  23. Странно, у меня личные сообщения нормально обрабатываются. Флаг для логирования можно тоже сунуть в конфиг. Конфиг следует сделать в виде lua-таблицы - быстрей и меньше кода. Изначально все задумывалось как программный модем между компами. Логин для NickServ и прочие изощрения поверх стандарта, пользователь должен был организовывать в своей программе. imodem это всего-лишь интерфейс, совместимый с OpenOS. Хотя, да не сделал пинг в сторону сервера, каюсь.
  24. Все-таки добывать руду слоями дольше, чем свободным обходом всех доступных блоков. На тестовом стенде свободный - 2 минуты 50 секунд, послойный - 3 минуты 9 секунд. Тут очень сильно напрашивается дополнительная эвристика на сокращение поворотов и прямых одноблочных ходов. И упаковку запускать только при нужде.
  25. Doob

    Робот с геосканером. Часть #1 [движения]

    Экономия скорости не большая, по сравнению с потреблением памяти. В прошлой версии, робот сканировал и добывал слой за слоем, меток было мало. В этой версии такой подход не очень подходит, эксперименты показывают, что искать ближайший блок по всему чанку выгодней, чем послойно, даже если добывать слой 3 блока.
×
×
  • Создать...