Перейти к содержимому
hohserg

Генерация энергии ковровыми аккумуляторами

Рекомендуемые сообщения

— Ты веришь в судьбу, Нео?

— Нет.

— Почему?

— Неприятно думать, что тобой манипулируют.

12107699.jpg

 

В OpenComputers есть блок - аккумулятор с ковриком

  image.png.15a4e9247be790338b75cc8856440ecc.png

Если на нем стоят больше одного моба - оцелотов или овец - то он генериует каждую секунду немного энергии. При этом наэлектризованный ковер может ударить случайного моба на 1 хп.

 

Следующий билд автоматизирует процесс поддержания здоровья мобов:

DqXoU6J.png

Конфигурация робота:

image.png.2144bdbd0fd4aa651e848f9cfb3584e4.png процессор Т1, память Т1.5, радар из OpenTechnology

Устанавливаем на него OpenOS и следующую программу:

pastebin get B8LbEuXF capsule_healing.lua

В зависимости от вашей сборки может потребоваться подкорректировать конфиг на строке 6, указать действительные метадаты зелий мгновенного лечения(хотя они ванильные, не должны меняться)

Запускаем `capsule_healing`

Запихиваем в робота по-больше зелек мгновенного лечения. Можно делать это воронкой.

 

Что можно улучшить:

  • Засунуть в капсулу еще две овцы, будет генерироваться на 3 ед. энергии/сек больше
  • Если посмотреть исходный код логики шерстяного аккумулятора, то можно заметить, что каждый тайл в мире чекает мобов над собой каждые 20 тиков со смещением hashCode. А т.к. у этого тайла не переопределена функция hashCode, то она зависит от адреса в памяти jvm и должна достаточно рандомна. Поэтому, если совсем упороться, то можно поставить площадку из аккумуляторов, эмпирически определить их смещения тиков чека мобов и, попадая в такт, дроном передвигать мобов с одного аккумулятора на другой. Тем самым можно одним набором мобов генерить больше энергии(не учитывая затраты на дрона)
  • На время ожидания робота вырубать его вообще, а таймер пробуждения сделать на редстоуне(например, ProjectRed)
  • Начальное время ожидания подобрать по закону Пуассона и потом динамически корректировать, используя теорему Байеса
  • Один робот может обслуживать 4 капсулы, вращаясь для броска зелий
Изменено пользователем hohserg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Накладно тем, что мобам без зелий здоровье не восстановить.

Хотя, можно плодить овец с постоянной скоростью, но все-равно требуется участие игрока или сторонних модов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
56 минут назад, Doob сказал:

можно плодить овец с постоянной скоростью, но все-равно требуется участие игрока или сторонних модов

Овец можно плодить роботами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
55 минут назад, Doob сказал:

Накладно тем, что мобам без зелий здоровье не восстановить

Аккумулятор пытается раз в минуту ударить одного из мобов с довольно низкой вероятностью 0.001(по дефолту в конфиге)

Для теста оставил схему с дебажным выводом на 3 часа, за все это время потратилось только одна зелька на 3хп и моба еще задамажило на 2хп(дальше ждать не стал, пока еще одна зелька выбросится)

Также, чтобы понизить вероятность опускания здоровья одного из мобов в капсуле, можно запихнуть туда много больше двух мобов

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, eu_tomat сказал:

Овец можно плодить роботами.

Точно, я забыл, что надо робота сверху воткнуть. Тогда все довольно просто, на одном блоке выращиваем пшеницу, плодим и сортируем овец по свободным аккумуляторам, профит.

 

1 час назад, hohserg сказал:

понизить вероятность опускания здоровья одного из мобов в капсуле, можно запихнуть туда много больше двух мобов

Я сначала думал по таймеру выдергивать одного моба, чтобы существенно снизить вероятность, но потом вспомнил, что лечить все-таки придется. С бесконечными овцами, мне кажется, будет проще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Одна зелька лечит всех сущностей в радиусе действия, поэтому повышение количества мобой увеличивает эффективность

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Узнать матожидание 70% урона и настроить таймер, чтобы дроппер по таймеру бросал зелье. Тогда и робот не нужен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем hohserg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Математика позволяет оперировать вероятностями. Я тут посчитал и обнаружил, что животных, без дозаправки, можно оставлять примерно на 30 часов и ничего страшного не случится. Пик смертности приходится на ~12000 минут работы. А в первые 1000 минут, вероятность получить труп крайне мала.

Но это сферовакуумные вычисления, может я ошибся с классификацией распределения, но при больших шансах урона все правильно выходит. В майне проверить это проблематично, да и шумят овечьи генераторы довольно неприятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 08.02.2020 в 22:03, Doob сказал:

Но это сферовакуумные вычисления

Проблема этих вычислений в другом. Они верны на большом масштабе. Например, это позволяет сопоставить средний цикл размножения овец со средней частотой смертности овец на одном генераторе. При большом количестве генераторов, зная необходимое их количество, можно легко вычислить достаточное количество родительских пар. Такая математика успешно работает.

 

Но вероятность коварная штука, и маловероятные события время от времени случаются. И будь на одном генераторе хоть сотня овец, может так оказаться, что одна из них погибнет за минимально возможные 8 минут, а остальные полностью сохранят здоровье. Да, это маловероятно, но всё же вероятно.

 

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

 

В общем, радар нужен для оценки реальной ситуации.

 

 

Но сейчас меня заинтересовало другое. Достаточно ли двух оцелотов (и пусть даже двух овец) для покрытия расхода энергии обслуживающего эту схему робота? 

@hohserg Ты проводил замеры? На приложенном скриншоте и компьютер и робот собраны в креативных корпусах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все можно посчитать, для особо неверующих, можно даже сделать симуляцию.

У вероятности есть такая замечательная штука, как распределение. И при разных условиях, плотность распределения может быть разная.

Если теория вероятностей и комбинаторика обошли вас стороной, то я попробую объяснить на пальцах.

 

Для упрощения, возьмем вероятность получить урон за 100% и поместим две овцы в одну ячейку. Каждую минуту одна овца будет в среднем получать 0.5 урона. Время жизни овцы работы ячейки от 8 до 16 минут.

Для еще большего упрощения, можно взять среднее здоровье овец (они получают в среднем одинаковый урон)

 

Подбрасываем монетку и назначаем этому мысленному конструкту урон в 1 единицу здоровья. Если одна овца кончилась, то записываем сколько минут проработал генератор и начинаем заново. Можно запустить симуляцию и увидеть...

 

ghlS9h8.png

Ба! Кто это у нас? Похоже на Гамма-распределение или хи-кватратичное, но стоит помнить, что шум у нас равномерный.

 

Код на питоне для наглядности.

 

import matplotlib.pyplot as plt
from random import random

def gee(x1, x2):
    c = 1
    while True:
        if random() < 0.5:
            if random() < 0.5:
                x1 -= 1
            else:
                x2 -= 1
            if x1 == 0 or x2 == 0:
                return c
        c += 1

p = []
for i in range(100000):
    p.append(gee(8, 8))

print(min(p))

plt.hist(p, bins = 50, histtype = 'stepfilled')
plt.show()

 

 

Можно покрутить жизнь овцы x1 независимо от x2 и увидеть, что конструкт действительно работает.

Сколько раз бы мы не запускали симуляцию, наивысшая плотность вероятности будет около 24х минут.

 

Я сначала оценивал минимальное время работы генератора по третьей левой сигме, но она очевидно не статичная и не линейная.

 

Сейчас мы получаем минимальное время работы генератора 8 минут, но стоит приглядеться к площади на графике, которую занимает эта вероятность. Что мы тут видим? По отношению к остальной площади это просто песчинка.

 

Можно пойти дальше и установить вероятность получения урона как в конфиге - 0.001

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

Вот результаты работы симуляции (первый столбец это количество жизней конструкта, второй - минимальное время работы генератора в минутах)

 

1      1   
1.5   1   
2      4   
2.5   14  
3      65  
3.5   89  
4      216 
4.5   251 
5      421 
5.5   628 
6      726 
6.5   906 
7      1037
7.5   1042
8      1426
8.5   1583
9      2479
9.5   2619
10    2749

 

 

Но это третья сигма, она нелинейна, хоть и позволяет оценить время работы генератора.

Я пошел немного дальше и вывел формулу получения пика.

T = x*1762-2337

Где x - это среднее количество жизней в ячейке, а результат T - время до максимально вероятного окончания генерации.

 

ICHpGbt.png

 

 

Теперь вернемся к нашим баранам.

9 часов назад, eu_tomat сказал:

одна из них погибнет за минимально возможные 8 минут, а остальные полностью сохранят здоровье. Да, это маловероятно, но всё же вероятно.

Сильное заявление, проверять я его конечно не буду.

Сначала мы подкидывали монетку и получали 0.5, в конфиге у нас 0.001, значит подкинем монетку с тысячью сторон и внимание, вопрос... какова вероятность, что монетка выпадет на одну грань из тысячи, восемь раз подряд?

 

Овцы и оцелоты это всего-лишь вид топлива, какой толк переводить на них зелья, если можно подкинуть еще? К тому же при подкидывании топлива, не только увеличивается среднее время работы, но и снижается вероятность отключения ячейки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Doob За развёрнутый и иллюстрированный ответ, конечно же, лайк. Но использованные в тексте выражения склоняют читателя к мысли, будто бы ты споришь со мной. А по факту твой вывод совпадает с моим: описанное событие маловероятно. При этом ты игнорируешь другое правило: при достаточно длинной серии испытаний событие с ненулевой вероятностью рано или поздно наступит. Может, поздно. А может, и рано. Может, вообще в первом же испытании. Теория вероятностей этому не мешает.

 

А я хочу иметь стабильный источник энергии. Пусть даже на таком странном принципе действия.

 

26 минут назад, Doob сказал:

Овцы и оцелоты это всего-лишь вид топлива, какой толк переводить на них зелья, если можно подкинуть еще? К тому же при подкидывании топлива время работы не только увеличивается, но и снижается вероятность отключения ячейки.

Главная проблема этой схемы не в использовании зелий, а в том, что одного генератора не хватит для поддержания энергии даже обслуживающего его робота. Чтобы выйти хотя бы в небольшой плюс, потребуется около десятка генераторов. И животными надо будет "кормить" каждый из этих генераторов.

 

Ты, конечно, можешь предложить просто равномерно кидать новых оцелотов и овец в каждый из генераторов. Но это решение приведёт к тому, что в краткосрочной перспективе часть генераторов будет простаивать, а в долгосрочной перспективе произойдёт избыточное накопление животных в некоторых из генераторов.

 

Для борьбы с этой проблемой можно было бы объединить генераторы в один большой, но в результате движения разных видов животных в ограниченном пространстве происходит накопление оцелотов с одной стороны генератора, а овец с другой. Это заметно визуально. И ещё потребуется проверить, всегда ли над одним аккумулятором находится не менее двух животных хотя бы одного вида. Может, там и с плотностью животных не всё так просто.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
12 часа назад, eu_tomat сказал:

Достаточно ли двух оцелотов (и пусть даже двух овец) для покрытия расхода энергии обслуживающего эту схему робота? 

Неа, не считал)

~~~

Посчитал:

судя по конфигу компьютер во время работы пассивно потребляет 0.5 в тик

одна ячейка генерирует 9 в сек или 0.45 в тик.

Следовательно, схема с одной ячейкой убыточная

Надо будет доделать программу, чтобы поддерживало 4 ячейки вокруг робота, тогда будет прирост энергии +1.3 в тик

Изменено пользователем hohserg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Фигня ваши генераторы, они орут и воняют, мне они ни в каких количествах не нужны. А оцелота вообще невероятно трудно поймать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
38 минут назад, Doob сказал:

Фигня ваши генераторы, они орут и воняют, мне они ни в каких количествах не нужны.

Всё это частности. Многое зависит от игрока и конфига. Всё орущее легко прячется в хлев. Админ может накрутить конфиг так, что генераторы станут более рентабельными. И в конечном итоге всё равно встанет вопрос об оптимальном алгоритме замены или же лечения животных даже если генератор будет использоваться в единственном экземпляре. К этому вопросу я и предлагаю вернуться.

 

Ты предлагаешь выкинуть радар. Основания для этого вроде бы есть. Зная интервалы и шанс попыток генератора отнять жизнь у овцы, а также количество её жизней, можно посчитать средний интервал, на протяжении которого генератор будет расходовать одну овцу. В соответствии с найденным интервалом можно подавать очередную овцу в генератор.

 

Но это в среднем. Если мы так поступим, то время от времени генерация энергии будет приостанавливаться из-за нехватки овец. Ты предлагаешь добавить "запасную" овцу. Но при такой схеме рано или поздно и она тоже погибнет. Я даже больше скажу: рано или поздно "запасная" овца смогла бы появиться сама, и даже не одна. Но всё равно генерация энергии будет периодически прекращаться.

 

Ты, как знаток теорвера, как предлагаешь решать эту проблему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если бы да кабы, да во рту выросли грибы...

Я исхожу из того, что есть, один генератор ничего не решает, кто там чего может накрутить это дело десятое. А стак генераторов будет выдавать 192 энергии в секунду, при текущем конфиге. По гистограмме видно, если бомбить по одной овце до медианы, то будем получать 0.65< лишних овец, в ином случае, простой генератора будет 30-40%

Мой подход основывается на том, что я не буду обслуживать поля генераторов, поэтому могу раз в 3 дня проверять состояние и добавлять недостающую овцу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Судя по коду, животные над аккумуляторами в среднем расходуются быстрее, чем указано в конфиге.

Скрытый текст

private def energyFromGroup(entities: Set[EntityLivingBase], power: Double): Double = {
    if (entities.size < 2) return 0
    def tryDamageOne(): Unit = {
      for (ent <- entities) {
        if (rng.nextDouble() < chance) {
          ent.attackEntityFrom(DamageSource.generic, 1)
          ent.setRevengeTarget(ent) // panic
          ent.knockBack(ent, 0, .25, 0)
          // wait a minute before the next possible shock
          nextChanceTime = world.getTotalWorldTime + (20 * 60)
          return
        }
      }
    }
    if (chance > 0 && nextChanceTime < world.getTotalWorldTime) {
      tryDamageOne()
    }
    power
}

 

Конфиг определяет вероятность нанесения урона отдельно взятому животному. А средний общий расход здоровья животных зависит от количества животных одного вида над аккумулятором. Грубо посчитать его можно, умножив средний расход здоровья одного животного на их количество. При малом количестве животных ошибка будет незначительной.

 

Выводы:

  • Размещать "запасных" животных над аккумулятором нерационально, т.к. это приведёт к увеличению среднего расхода животных, без повышения выработки энергии.
  • Подавать свежих животных в генератор требуется в два (точнее, в 1,999) раза чаще, чем я предполагал ранее. Конечно, это при условии, что мы стремимся оптимально расходовать животных. Но для реальной оценки здоровья животных лучше всё-таки использовать радар.
  • Неверно моё предположение о том, что при непрерывной подаче свежих животных со скоростью, соответствующей их среднему расходу, со временем животные должны накапливаться в генераторе, а среднее время простоя генератора постепенно сокращаться. В существующей механике лишние животные будут довольно быстро убиты, а среднее время простоя генератора останется практически неизменным на всём протяжении его работы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

image.png.2c52f1ffb8cf1d2247830754b262894b.png

За одну секунду может задамажиться максимум один моб. Расход хп не зависит от количества мобов, хотя от количества зависит вероятность того, что дамаг произойдет

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, hohserg сказал:

Расход хп не зависит от количества мобов, хотя от количества зависит вероятность того, что дамаг произойдет

Да. Единовременный расход здоровья не меняется. Но за счёт повышения вероятности урона вместе с количеством мобов растёт и среднестатистический расход здоровья всего стада на еденицу времени.

 

Например, если над аккумулятором будут находиться четыре овцы вместо двух, то суммарно урон будет наноситься примерно в 2 раза чаще. Генерация энергии при этом будет длиться среднестатистически примерно столько же, как и с двумя овцами, но вместо двух овец израсходуются четыре. Две овечки погибнут напрасно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Зелье хилит всех мобов в радиусе, поэтому важен только максимально полученный дамаг. А сколько всего мобов получило урона не так важно, при условии, что урон распределяется равномерно. Хотя, при большом количестве мобов урон будет не равномерно наноситься(дальше по списку - меньше вероятность+порядок сущностей в списке getEntitiesWithinAABB, кажется, не меняется со временем)

Изменено пользователем hohserg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...