Как разграничить приоритеты выполнения команд? избежать конфликтов.
- Войдите на сайт для отправки комментариев
Вопрос не столько по реализации, сколько по логике.
В коде есть есть несколько функций, которые могут конфликтовать.
Допустим стоит задача - охлаждать комнату (умный дом) - если температура возрастает, идет увеличение частоты вращения вентилятора (кондея)
В то же время есть функция которая устанавливает порог шума - и если шума много - снижает частоту вращения.
Таких функций на самом деле больше, и они регулируются разными параметрами (освещение, влажность и тп.)
Загвоздка в том, как исключить конфликты? и разграничить приоритеты?
Никак не допру, как это это должно работать.. я представлял себе приоритеты в %, но что будет если у всех приоритет 10% и будет ли он отличаться от того, когда у всех 30%? как вообще будут коррелировать между собой эти функции, если сумма приоритетов меньше или больше 100%?
Или это как-то иначе надо решать?
Чтобы понятнее было приведу пример с тем же кондеем:
допустим стоит макс. температура 20С
И макс уровень шума 25db
Ну и до какого-то момента все будет в этих рамках, но допустим на улице жарко - и тут начнется дерготня.. одна функция будет кондей разгонять, а другая тормозить..
Заранее отрегулировать это температурой мы не можем, потому что не знаем при каких условиях показатели шума и температуры сравняются.
И также не можем просто включать и выключать ограничение по шуму - потому что а) это не так функционально, б) параметров куда больше чем 2 в)это требует действия от пользователя.
Поэтому я хочу с помощью приоритетов указать насколько для нас важно соблюдение того и другого.. т.е. можем ли мы немного поступиться прохладой ради тишины или наоборот.
Вот как это расписать алгоритмически я не знаю..
вычисляйте необходимую реакцию системы в одной функции, которая будет принимать все параметры
- текущую температуру
- желаемую температуры
- текущий уровень шума
- желаемый уровень шума
- режим, задаваемый пользователем (авто, прохладно, тихо)
для приоретизации задач, конкурирующих за разделяемый ресурс, например, процессорное время, сначала решите более простые вопросы.
1. есть всего один уровень приоритета "обычный" и есть несколько заданий, которые нужно выполнить. Как распределять время процессора между заданиями? Например, так: взять одно незавершённое задание и выполнять его одну секунду, затем взять другое, через секунду - третье...
2. А теперь есть два уровня приоритета: "обычный" и "важный" ....
Мне кажется, что двух уровней хватит в большинстве случаев. В ос виндовс их, кажется, пять. Сто (ваших процентов) - точно перебор.
Почитайте о нечеткой логике.
Toc
Почему то я затрудняюсь оперировать этими казалось бы простыми параметрами "обычный" и важный".. всетаки вопрос в том "на сколько важнее".. Ведь когда речь идет о процессорном времени - то это хоти и общий ресурс, но противоречия в командах не возникает. А тут - если сделать одну из задач "важной" то другая автоматически не будет выполняться... Во всяком случая я не представляю себе иного варианта если мы говорим о балансе холодно\тихо. которые технически прямопротивоположны. Если мы говорим что для нас важен холод - то его соблюдение неизменно приведет к полному игнорированию уровня шума.. и наоборот.
Вариант с пользовательским режимом, в котором все это задано програмно - существует как запасной.. мне всегда хочется как можно меньше задавать жестких границ в программе.
step962
Спасибо, очень интересная тема!
Но к сожалению в поиске везде математическая модель.. высшую математику в институте я ненавидел, поэтому перенести это в среду программирования довольно сложно.
Нашел хорошую статью на хабре по практическому применению: http://habrahabr.ru/post/125614/
но примеров там маловато и не совсем проясняют идею..
Если у вас есть примеры (или ссылки на них) использования нечеткой логики именно в программировании (в идеале на ардуино конечно), был бы очень признателен!
Совсем в идеале программа не должна знать, что например кондей умеет охлаждать (равно как и шуметь), или что шторы закрывают свет. да и вообще об их существовании.
А самостоятельно определить причинно-следственную связь, между включением какого-то устройства и обротной связью от среды. Т.о. после пары включений\выключений кондея и зашторивания\расшоривания окна - программа поймет как и на что эти объекты влияют и уже сможет управлять шторами и кондеем используя параметры - "сделать холодно", "сделать темно" и т.п.
Вроде бы как раз через нечеткую логику возможно такое реализовать. но примеров не видел.
Дело получается совсем не в програмировании. Програмирование нужно начинать когда сформулирована задача (по умному - написаны бизнестребования). В вашем случае вы спрашиваете "как програмировать то не знаю что"
определитест с тем, что вы хотите от кондиционера и в каких ситуациях один из заданных параметров может нарушаться.
в вашм примере например можно ввести еще один параметр - разница между заданной температурой и фактической.пока разница не превышает 5 градусов - приоритет шуму итогда программа обеспечивает уровень шума с зазором температуры в 5 градусов. Как только зазор нарушен - игнорируем шум и стараемся снизить температуру пока не достигнем зазора
axill
Ну я вобщем-то не менее конкретно выразился чем вы. Кроме того, в начале темы я указал что проблема больше не в реализации, а в построении алгоритма -т.е. что должно происходить и в какой последовательности.
В вашем примере - эта самая разница в 5С и будет так сказать дозволением для температуры в пользу шума. Я говорил об этом с самого начала. Вопрос в том, как эту разницу получить, и почему она будет именно такой?
Прямо задать пользователем в настройках - это было бы слишком просто для нас и слишком заморочено для пользователя.
Далее - если в вашем примере мы преодалеваем барьер в 5С - то что происходит? Охлаждение врубается на полную, всячески игнорируя шум? А задача стоит в том чтобы усилить охлаждение ровно настолько, чтобы оставаться в приделах этих 5С. опять же - как это рассчитать?
По идее программа должна сама расчитывать этот порог в ту или иную сторону и строить кривую изменения параметров.
Опять же еще идеальнее было бы принимать такие решения на основе предпочтений пользователя и его субъективных суждений. т.е. переодически спрашивать его: "Не холодно ли тебе девица?" - на что пользователь будет давать ответ от 1 до 10.
Но наверняка может случится так, что при одной и той же температуре человек может сказать что ему жарко, а в другой раз что ему нормально.. Тут программа должна оценить другие факторы - влажность, погоду на улице, температуру тела пользователя, лунную фазу или политическую обстановку в мире и курс доллара, чтобы выявить корреляцию - и в будущем точно подсраиваться и выдавать то что человек хочет, прежде чем он об этом скажет.
Например выпил пользователь горячего чаю - температу в комнате снижаем на градус, но не потому что так заложено в программе, а потому что после чая пользователь обычно говорит что ему жарко.
Это конечно на будущее)
Вроде нечеткая логика - самый мощный инструмент тут, хотя нехотелось бы конечно строить нейронную сеть ради термостата, но по ходу придется.
Вот только примеров маловато. найти не могу.
нечеткая логика и нейронная сеть совсем разные штуки...
по нечеткой логике поищите на сайте matlab. У них пакет fuzzy-logic и к нему было хорошее описание и примеры.
Лет 12 назад еще делал диплом как раз по теме управления термопроцессами на нечеткой логике, помниится там и накопал. Хотя сейчас нечеткую логику везде пихают, где нет нормальных мат моделей или куча параметров, взаимодействие которых неподдается мат. описанию.
Кстати в продлвинутых кондишках используют ету fuzzy-логику, у них даже в каталогах везде про это выделено жирным :).
мне что-то подобное попадалось здесь http://www.antor.fr/apps/smart-virtual-thermostat/?lang=en
почитайте, может что-то для себя подчерпнете, особенно раздел 3 - Auto learning (автообучение)