Чтобы упростить вопрос и, надеюсь, ответ, я приведу несколько упрощенную версию того, что я пытаюсь сделать.
Настройка фиксированных условий:
- Макс. Допустимый объем кислорода в комнате = 100 000 единиц
- Целевой объем кислорода для поддержания в комнате = 100 000 единиц
- Максимальное количество циклов обработки воздуха в секунду == 3,0 цикла в секунду (мин. 0,3)
- Энергия (Вт), используемая в секунду:Воздух за «цикл» = 100 единиц (минимум 0 единиц)
- 1 человек потребляет 10 единиц O2 в секунду
- Максимальная вместимость комнаты - 100 человек (1 человек минимум)
- входы обрабатываются каждый цикл, и выходы могут быть изменены каждый цикл - однако, если выход возвращается как вход, это может повлиять только на следующий цикл.
Допустим, у меня есть этивходы:
- A.текущий кислород в комнате (диапазон: от 0 до 1000 единиц для простоты - может быть нормализовано)
- B.текущая занятость в комнате (от 0 до 100 человек при максимальной вместимости) ИЛИ / И может быть изменена на общее количество кислорода, используемого всеми людьми в комнате в секунду (от 0 до 1000 единиц в секунду)
- C.текущие циклы обработки воздуха в секунду (от 0,3 до 3,0 циклов в секунду)
- D.Используемая текущая энергия (то есть вышеупомянутые циклы тока в секунду * 100 и затем в квадрате)
- E.Ток Кислорода, добавляемого в воздух за цикл (от 0 до 100 единиц)
(возможные выходы возвращаются в качестве входов?):
- F.предыдущее изменение на циклы в секунду (+ или - от 0,0 до 0,1 цикла в секунду)
- G.предыдущие циклы добавляются единицы O2 за цикл (от 0 до 100 единиц за цикл)
- H.предыдущее изменение к текущему максимуму занятости (от 0 до 100 человек)
Вот действия (выходы), которые может выполнить моя программа:
- Изменение циклов в секунду с приращением / уменьшениемиз (от 0,0 до 0,1 циклов в секунду)
- Изменение добавленных единиц O2 за цикл (от 0 до 100 единиц за цикл)
- Изменение максимального значения текущей занятости (от 0 до 100 человек) - (в основном это позволяетдля принудительного сокращения занятости и последующего ее нормализации до максимального значения)
Цели программы состоят в том, чтобы поддерживать гомеостаз в размере:
- как близко к 100 000 единицO2 в комнате
- не позволяет комнате опуститься до 0 единиц O2.
- позволяет в течение максимально длительного времени занимать до 100 человек в комнате без принудительного удаления людей (какO2 в комнате со временем истощается и приближается к 0 единицам людей, которых нужно убрать из комнаты до минимума, а затем дать максимум восстановиться до 100, так как все больше и больше 02 добавляется обратно в роом)
- и в идеале использовать минимальную энергию (ватт), необходимую для поддержания выше двух условий.Например, если в комнате было до 90 000 единиц O2, и в настоящее время в комнате 10 человек (используя 100 единиц в секунду из 02), то вместо того, чтобы работать с 3,0 циклами в секунду (90 кВт) и 100 единицами в секунду дляпополнить 300 единиц в секунду (избыток 200 единиц по сравнению с потребляемыми 100) в течение 50 секунд, чтобы восполнить дефицит в 10000 единиц на общую сумму 4500 кВт.- было бы более идеально работать со скоростью, скажем, 2,0 цикла в секунду (40 кВт), которая производила бы 200 единиц в секунду (избыток 100 единиц по сравнению с потребляемыми единицами) в течение 100 секунд, чтобы восполнить дефицит в 10 000 единиц и использовать в общей сложности4000 кВт используется.
ПРИМЕЧАНИЕ: занятость может колебаться от секунды к секунде в зависимости от внешних факторов, которые нельзя контролировать (допустим, люди приходят и уходят в комнату на свободе). Единственный контроль, которым обладает система, состоит в том, чтобы принудительно удалять людей из комнаты и / или препятствовать входу новых людей в комнату, изменяя максимальную вместимость, допустимую в следующем цикле времени (допустим, система может это сделать). Мы не хотим, чтобы система постоянно снижала пропускную способность только потому, что она может поддерживать вывод достаточного количества O2 в секунду только для 30 человек, работающих на полную мощность. У нас имеется большой объем доступного O2, и потребуется некоторое время, прежде чем он будет исчерпан до опасного уровня и потребует, чтобы система принудительно сократила емкость.
Мой вопрос:
Может ли кто-нибудь объяснить мне, как я могу настроить эту нейронную сеть, чтобы она могла учиться на каждом действии (цикле), проводимом, отслеживая желаемые результаты. Моя проблема здесь заключается в том, что большинство статей, которые я нахожу по этой теме, предполагают, что вы знаете правильный выходной ответ (то есть: я знаю, что входы A, B, C, D, E - это определенное значение, тогда выход 1 должен быть увеличен на 0,1 цикла в секунду).
Но я хочу выполнить условия, изложенные в ЦЕЛЯХ выше. Таким образом, каждый раз, когда программа выполняет цикл и, скажем, решает попытаться увеличить количество циклов в секунду, в результате этого доступный O2 либо уменьшается на меньшую величину, чем это было в предыдущем цикле, либо теперь он снова увеличивается до 100 000, а затем этот выход можно считать более правильным, чем сокращение циклов в секунду или поддержание текущих циклов в секунду. Здесь я упрощаюсь, поскольку есть несколько переменных, которые могли бы создать «идеальный» результат, но я думаю, что я понял, чего я добиваюсь.
Код:
В этом тестовом упражнении я использую библиотеку Swift под названием Swift-AI (в частности модуль NeuralNet: https://github.com/Swift-AI/NeuralNet
Так что, если вы хотите адаптировать свой ответ относительно этой библиотеки, это будет полезно, но не обязательно. Я больше просто ищу логику того, как настроить сеть, а затем настроить ее для первоначального и итеративного повторного обучения самого себя на основе тех условий, которые я перечислил выше. Я бы предположил, что в определенный момент после достаточного количества циклов и разных условий у него будет соответствующая настройка весов, чтобы справиться с любым будущим состоянием, и повторное обучение станет менее и менее эффективным.