- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF130:OOCalc
Материал из Linuxformat.
- OpenOffice.org Calc Имитационное агентное моделирование в электронных таблицах
Содержание |
ОOо Calc: Агенты – всяк за себя
- Создадим имитационную агентную модель в OOo Calc вместе с Алексеем Джежорой.
Адепты определяют моделирование как основной метод познания функционирования систем. И, коль скоро система есть форма организации всего сущего, то без особого преувеличения можно сказать, что моделирование – это главный способ отражения действительности.
Теория выделяет различные виды моделирования: от естественноязыкового описания до имитационной компьютерной реализации, при которой логикоматематический алгоритм функционирования системы исследуется посредством компьютерной программыимитатора. В свою очередь, компьютерное имитационное моделирование может выполняться различными методами, среди которых присутствует метод агентного моделирования.
Его особенностью является то, что имитационная модель представляет собой совокупность взаимодействующих отдельных программных или программноаппаратных сущностей – агентов, обладающих индивидуальными целями, правилами внутреннего и внешнего «распорядка». По такому принципу удобно моделировать как поведение стада парнокопытных, так и работу производственного предприятия, а также много чего/кого другого.
Существует свободное ПО, адаптированное для задач агентного моделирования: например, пакет Swarm (http://www.swarm.org), используемый для моделирования социальнобиологических и социальноэкономических систем; breave (http://www.spiderland.org/breve), применяемый для моделирования биологических и социальнобиологических систем с 3Dвизуализацией. Для целей обучения и для решения некоторых практических задач также можно использовать электронные таблицы, лишь бы в них содержалась возможность розыгрыша случайного числа и выбора исходя из условия – ОOо Calc как раз подойдет.
Концептуальное описание
Начальным технологическим этапом процесса создания и использования имитационной модели является концептуальное описание, включающее постановку целей моделирования, формальное описание объекта моделирования и прочее. Предположим, что на некотором машиностроительном заводе планируется запуск в производство нового продукта. В соответствии с планом, конструкторское бюро (КБ) завода должно осуществить разработку чертёжнотехнической документации (ЧТД) в срок 2 месяца. Затем производственные подразделения в течение 1го месяца должны будут произвести освоение нового продукта и в течение следующих 3х месяцев произвести опытную партию изделий, которые должны пройти внутренний контроль качества в количестве 10ти единиц. Целями моделирования определим исследование закономерностей производства новых видов продукции на данном предприятии и оценку затрат времени на разработку и производство нового продукта.
Все остальные условия и допущения будем вводить по ходу создания модели; отметим лишь, что агентами в нашем случае будут выступать подразделения завода, и их поведение будет определяться исходя из двух оценок: компетентности и исполнительности. Под компетентностью будем понимать вероятность того, что результат деятельности того или иного подразделения будет соответствовать некоторому гипотетическому наилучшему, а под исполнительностью – вероятность того, что данное подразделение выполнит возложенное на него задание в установленный срок.
Откуда что берётся?
Резонный вопрос: откуда взять значения компетентности и исполнительности для какого-либо подразделения? Ответствуем прямо: из гипотезы о причинноследственных связях и факторах деятельности нашего предприятия. Такая гипотеза, будь она формализованной (записанной на бумаге или еще какнибудь) или просто существующей (порой неосознанно) в умах руководителей и специалистов (экспертов), служит основной предпосылкой для принятия решений. Кстати, посредством моделирования она может быть проверена: если модель при прогонах будет выдавать результаты, схожие с тем, что имеется на самом деле, то гипотеза в некоторой степени верна.
Каждому агенту — свой лист!
Для получения имитационной агентной модели требуется, вопервых, создать агентов, вовторых, описать правила их взаимодействия. Было бы удобно, чтобы всё связанное с какимлибо агентом помещалось на отдельном листе электронной таблицы. В предварительно открытом и сохранённом документе OOo Calc переименуем Лист 1 (щёлкнуть правой кнопкой мыши, выбрать Переименовать...): новое название листа пусть будет КБ. В ячейке A1 пропишем Компетентность, в A2 – Исполнительность. Соответственно, ячейки B1 и B2 предназначены для значений компетентности и исполнительности. Предположим, что экспертами для нашего КБ определены значения компетентности 0,88 и исполнительности 0,85. В ячейке С1 пропишем Плановый срок, а в E1 зададим этот самый плановый срок разработки ЧТД в неделях – 8. Теперь в ячейках A4, B4, C4, E4 соответственно пропишем: № раб. недели, ЧТД?, Качество?, Доработка?. Таким образом, деятельность агента «КБ» будет описывается таблицей состояния со столбцами «№ раб. недели» – это понятно; «ЧТД?» со значением, эквивалентным событиям разработки/не разработки ЧТД; «Качество?» – здесь будет происходить розыгрыш оценки качества ЧТД; «Доработка?» со значениями, эквивалентными событиям доработки ЧТД, если такое понадобится. Заполним первую строку: в ячейке A5 – 1, первая рабочая неделя, начало проектирования. В ячейку B5 могут возвращаться значения ЧТД_ВЫП, ЧТД_НЕТ и ЧТД_УЖЕ_В; как можно догадаться, первое из них означает, что ЧТД разработано, второе – что не разработано, а ЧТД_УЖЕ_В, так сказать, вспомогательное значение, необходимое для того, чтобы наша модель не выдавала «глупых» результатов, и обозначающее, что событие, эквивалентное разработке ЧТД, случалось раньше. Функция, при помощи которой осуществляется розыгрыш этого события, имеет следующий вид:
=IF(OR(B4=”ЧТД_ВЫП”;B4=”ЧТД_УЖЕ_В”); “ЧТД_УЖЕ_В”; IF((A5>=$D$1);IF(RAND()<=$B$2; “ЧТД_ВЫП”; “ЧТД_НЕТ”);”ЧТД_НЕТ”))
Ее смысл лучше всего раскрыть через блок-схему (см. рис. 1). Если нашему КБ пришел срок отчитываться о проделанной работе и эта работа не была сделана на предыдущей неделе, то с вероятностью, равной исполнительности, разыгрывается значение ЧТД_ВЫП. Функция OOo Calc RAND() возвращает случайное число в пределах от 0 до 1 с нормальным распределением, и если оно меньше либо равно значению исполнительности, значит, наше КБ справилось с задачей, а в ячейку B5 возвратится значение ЧТД_ВЫП. Обратите внимание на то, что ссылки на некоторые ячейки абсолютные, и на то, что в функциях используются и латинские, и кириллические символы.
Теперь впишем в ячейку C5 функцию, определяющую качест во разрабатываемой ЧТД:
=IF(D4=”ДОРАБ.”; IF(RAND()<=$B$1;”КАЧ.”; “НЕ_КАЧ.”);IF(B5=”ЧТД_УЖЕ_В”; C4; IF(B5=”ЧТД_ВЫП”;IF(RAND()<=$B$1;”КАЧ.”; “НЕ_КАЧ.”); “-”)))
Как видно, при различных условиях в ячейку C5 могут быть возвращены три значения: прочерк (или знак «-») для тех недель, когда ЧТД еще не разработано; КАЧ., то есть разработанное ЧТД качественное, и если производственники сделают всё по чертежу, то опытный образец изделия «соберётся»; Не_КАЧ. – соответственно, ЧТД разработано с ошибками.
Осталась еще ячейка D5, это из столбца Доработка?. К ней мы вернемся позже, после работы с агентом Цех. А пока выделим мышью область ячеек A5:C5, захватим маленький черный квадратик в нижнем правом углу выделения и, удерживая его, распространим наше выделение до 28‑й строки (выделенной окажется область A5:C28). Отпустим мышь, и перед нами откроется картина работы КБ на срок 6 месяцев (24 недели, см. рис. 2). Можно уже немножко поэкспериментировать: нажмем F9 несколько раз и увидим, как меняются значения.
В цехах кипит работа
Приступим к созданию агента, имитирующего поведение производственных подразделений завода. Назовем его Цех (переименуйте Лист 2). Укажем исходные данные: пропишем в A1 Компетентность, соответственно в B1 — 0,80; в ячейке A2 — Исполнительность, в B2 — 0,72; зададим также C1 — Плановый срок освоения изделия, в ячейке D1 — 4; в C2 пропишем Плановый машинокомплект — это доля продукции, отведенная для производства в течение планового периода. В нашем случае это 0,83 единицы в неделю; проставим данное значение в ячейке D2.
Дадим названия столбцам таблицы состояния агента Цех. Пропишем в A4 № раб. недели; в B4 – Стадия; в C4 – Результат освоения; в D4 – Объем производства; в E4 – Качество производства. В A5 пропишем 1 – первая рабочая неделя. В ячейке B5 (столбец «Стадия») введем функцию:
=IF(OR(C5=0,25; C5=”НЕ_ОСВ”); “ОСВОЕНИЕ”; IF(C5=”ОСВОЕНО”; “ПРОИЗВ.”; “-”))
Если в ячейку в столбце «Результат освоения» той же строки будет возращено или значение 0,25, или значение Не_ОСВ, то в ячейку в колонке «Стадия» будет возвращено значение ОСВОЕНИЕ, то есть наш новый продукт, так сказать, осваивается; если ОСВОЕНО – то ПРОИЗВ., что отмечает переход от стадии освоения к стадии производства, а если ни одно из этих условий не выполняется, то в ячейку строки «Стадия» возвратится прочерк.
Далее, В С5 пропишем
=IF(C4=”НЕ_ОСВ”; IF(AND(RAND()<=($B$2+(1-$B$2)/2); RAND()<=($B$1+(1-$B$1)/2); КБ.C4=”КАЧ.”); 1/$D$1; “НЕ_ОСВ”); IF(OR(КБ.B4=”ЧТД_ВЫП”; КБ.B4=”ЧТД_УЖЕ_В”); IF(SUM($C$4:C4)<1; IF(AND(RAND()<=$B$2; RAND()<=$B$1; КБ.C4=”КАЧ.”); 1/$D$1; “НЕ_ОСВ”); “ОСВОЕНО”); “-”))
Эта функция, в зависимости от различных условий, возвращает значения Не_ОСВ, эквивалентное событию некорректной сборки/производства части изделия; 0,25 – это значение эквивалентно событию, что ¼ нового изделия собрано/произведено, то есть освоено; прочерк, если ЧТД от КБ в производство не поступило. Розыгрыш значений 0,25 и Не_ОСВ начинается в том случае, если у агента КБ в ячейке столбца «ЧТД?» строкой выше содержится значение ЧТД_ВЫП или ЧТД_УЖЕ_В; это эквивалентно тому, что освоение начинается на следующей неделе после того, как будет разработано ЧТД. Значение 0,25 может быть возвращено в том случае, если, во-первых, разработанное ЧТД является качественным, а во-вторых, розыгрыши случайных чисел меньше либо равны значениям компетентности и исполнительности для агента Цех. Если неделей раньше при качественном ЧТД часть изделия не освоена (в ячейке выше возращено Не_ОСВ), то значения компетентности и исполнительности для настоящего момента увеличиваются на величину (1‑х)/2, где х – значения вероятности/исполнительности, соответственно. Это логично: у производственных подразделений добавляется опыта. Ну, и если сумма числовых значений в столбце «Результат освоения» становится равным единице, то в ячейку возвращается значение ОСВОЕНО.
Вернемся к агенту КБ, к столбцу «Доработка?». На листе КБ в D5 пропишем:
=IF(AND(C5=”Не_КАЧ.”; Цех.C5=”НЕ_ОСВ”); “ДОРАБ.”; “-”)
То есть, если разработанное ЧТД некачественное и в цехах «не идет» освоение, то ЧТД дорабатывается: в ячейке строкой ниже в столбце «Качество?» с вероятностью, равной компетентности КБ, будет производиться розыгрыш значения качества ЧТД. Не забудем вставить эту функцию в каждую ячейку столбца: выделим с помощью Shift область D5:D28 и нажмем Ctrl+D.
Переключимся на лист Цех: в D5 (столбец «Объем производства») пропишем
=IF(AND(B5=”ОСВОЕНИЕ”; B6=”ПРОИЗВ.”); 0; IF(B5=”ПРОИЗВ.”; IF(RAND()<=$B$2; D4+$D$2; D4+$D$2*$B$2); “-”))
Эта функция рассчитывает объем произведенной продукции нарастающим итогом. Если розыгрыш случайного числа меньше либо равен значению исполнительности производственных подразделений, то к произведенному ранее объему (вначале это ноль) добавляется значение планового машинокомплекта; если розыгрыш случайного числа больше значения исполнительности, то к произведенному ранее объему добавляется значение планового машинокомплекта, умноженного на значение исполнительности. Иными словами, в нашей модели объем производства на текущей неделе может принимать только два значения.
Зададим функцию, определяющую, какое количество из произведенных изделий является качественным. В E5 пропишем:
=IF(B5=”ПРОИЗВ.”; IF((FLOOR(D5;1)-FLOOR(D4;1))=1; IF(RAND()<=$B$1; 1; 0)))
Как только разность между округлёнными вниз значениями из соседних ячеек столбца «Объем производства» станет равна единице, что эквивалентно появлению завершенного изделия, определяется его качество: если розыгрыш случайного числа меньше либо равен компетентности, то изделие качественно, и в ячейку возвратится значения 1, а если нет, то 0.
Выделим A5:E5, захватим мышью маленький черный квадратик в правом нижем углу и распространим выделение на область A5:E28. Ну вот, агент Цех практически готов. Добавим лишь подсчет количества произведенной продукции и продукции принятой ОТК, в D30 пропишем Всего произведено, в D31 –
=FLOOR(D28;1)
В E30 введем Принято ОТК, в E31 –
=SUM(E5:E28)
Наша модель готова (см. рис. 3).
Вычислительный эксперимент
После того, как имитационная модель реализована в программе, должна быть проведена её комплексная проверка с целью оценки достоверности по отношению к реально существующей системе. Это этап отладки и исследования свойств модели. Мы допустим, что всё это сделано, и сразу перейдем к направленному вычислительному эксперименту. Переименуем Лист 3 в Статистика. В ячейках A1, B1, C1, D1 соответственно введем: ЧТД_ВЫП?, ОСВОЕНИЕ?, Всего произведено, Принято ОТК. В A2 (это под ЧТД_ВЫП?) пропишем функцию:
=MATCH(“ЧТД_ВЫП”;КБ.B5:B28; 0)
Она возвратит номер рабочей недели, когда «сделают» ЧТД. В ячейке B2 (под ОСВОЕНИЕ?) зададим функцию, которая будет вычислять количество недель, затраченных производственниками на освоение:
=MATCH(“ПРОИЗВ.”; Цех.B5:B28; 0)-MATCH(“ОСВОЕНИЕ”;Цех.B5:B28; 0)
В C2 и D2 выведем значения целого количества произведенных единиц продукции и количество единиц продукции, принятых ОТК. На листе Цех мы уже рассчитывали эти величины, поэтому просто сошлемся на соответствующие ячейки. Для C2 – =Цех.D31, а для D2 – =Цех.E31
Теперь выберем меню Сервис > Макросы > Записать макрос.
Затем выделим диапазон A2:D2, нажмем Ctrl+C, Ctrl+Стрелка вниз, Ctrl+Стрелка влево, Стрелка вверх, далее Ctrl+V, в открывшимся окне выберем Числа и Форматы, нажмем OK, завершим запись макроса. В появившемся диалоге управления макросами дадим ему название Statistic. Снова перейдем в меню Сервис > Макросы > Управление макросами > OpenOffice.org Бейсик..., нажмем Редактировать. В открывшемся документе перед sub Statistic пропишем:
Sub Main For i=1 to cLng(inputbox(“число прогонов”, “прогонов будет...”, “10”)) Statistic Next End Sub
и нажмем Ctrl+S. Теперь при выполнении макроса Main результаты прогонов будут записываться на листе «снизу вверх»; для OOo Calc 2.4 это с 65535‑й строки. Можно ограничить такие «прыжки» заранее, проставив результаты первого прогона в нужной строке через Сtrl+V.
Определение количества прогонов, необходимого для того, чтобы результаты, полученные на имитационной модели, были статистически значимы, происходит на этапе планирования вычислительного эксперимента. Это важный момент, на котором также определяются цели направленного вычислительного эксперимента, методы сбора и обработки результатов. В соответствии с нашим первоначальным заявлением, целью вычислительного эксперимента будет оценка выходных переменных при заданных параметрах системы.
Метод обработки результатов будет заключаться в экспертном заключении на основе статистического анализа выходов. Для определения количества прогонов есть общая формула: N = pqk, где р – число повторений, q – число уровней входов, k – число входов. На практике также пользуются формулой N ≈ , где N0 – количество пробных прогонов, d0 – доверительный интервал, определенный по результатам пробных прогонов, d – требуемая точность. Выделим A2:D2, нажмем Ctrl+C, перейдем к А12, нажмем Ctrl+V, в появившемся окне выберем Числа и Форматы, нажмем OK. Запустим макрос Main: меню Сервис > Макросы > Управление макросами > OpenOffice.org Бейсик... > Выполнить. В появившем ся окне (рис. 4) поставим 9, нажмем ОК – и увидим, как заполнятся ячейки значениями результатов пробных прогонов (всего их будет десять). Одним из основных интересующих нас выходов модели является значение принятых ОТК изделий; в этой связи определим доверительный интервал для данной величины при уровне α=0,05 и в G4 пропишем:
=CONFIDENCE(0,05; STDEV(D5:D14); 10)
Смысл полученной величины d0 заключается в том, что математическое ожидание количества принятых ОТК изделий с вероятностью 1‑α=0,95 будет находится в пределах xcp ± d0, где xcp – среднее значение выборки. Точность d – это задаваемая величина, в пределах которой значение xcp может отличаться от математического ожидания. При десяти пробных прогонах d0 получилось равным 0,83 (при других пробных прогонах это значение может быть иным); такая точность для нашего случая вполне удовлетворительна, так что этим можно и ограничиться. Вычислим средние значения и доверительные интервалы выходов модели, в A16 пропишем Средние значения; в ячейке A17 –
=AVERAGE(A5:A14)
Распространим эту функцию на B19:D19 известным нам способом. В А18 пропишем Доверительные интервалы, в A19 –
=CONFIDENCE(0,05; STDEV(A5:A14); 10)
То же сделаем для B21:D21.
Ну вот, теперь осмотрим всё (рис. 5) и оценим. Выходит (если гипотеза о причинно-следственных связях и факторах верна), что с первоначальными планами наша система, скорее всего, не справится, и необходим дальнейший анализ и разработка мероприятий по увеличению компетентности и исполнительности – прежде всего, для производственных подразделений. К слову сказать, наша модель близка к реальной ситуации на очень многих отечественных машиностроительных предприятиях, так что полученные результаты – это лишний повод для размышлений.
Нет предела совершенству
Предлагаемая в уроке модель достаточно проста: всего два агента, малое число входных параметров, и зависимости практически очевидны. Для большей полноты отражения реальной системы, в модель можно добавлять агенты, имитирующие другие подразделения, ремонтные и сопутствующие службы, задавать движение денежных средств и материалов, потоков информации. В какой-то момент функции «разрастутся» так, что их будет уже сложно написать правильно. Этим, наверное, возможности электронных таблиц ограничиваются. Хотя, может быть, это лишь вопрос совершенства моделирующего алгоритма.
Если возникают вопросы
При решении в OOo различных задач могут возникнуть вопросы, которые сложно решить, пользуясь одной лишь встроенной справкой. На счастье, есть куда обратиться: в сети существуют и вики, и FAQ, и форумы, где обсудят вашу проблему и предложат варианты её решения – например, сообщество на http://community.i-rs.ru.