Результаты поиска «graphviz» — Ещегодник https://tushavin.ru Информационно-образовательный сайт для студентов, аспирантов и коллег Тушавина В. А., созданный и наполняемый им самим безвозмездно в свободное от остальных забот время Mon, 30 Jan 2023 03:28:42 +0000 ru-RU hourly 1 https://i0.wp.com/tushavin.ru/wp-content/uploads/2016/09/cropped-веб1.png?fit=32%2C32&ssl=1 Результаты поиска «graphviz» — Ещегодник https://tushavin.ru 32 32 117157397 Рисуем графы онлайн и с помощью Excel https://tushavin.ru/risuem-grafy-onlajn-i-s-pomoshhyu-excel/ Mon, 21 Mar 2022 22:11:24 +0000 https://tushavin.ru/?p=2885 Читать далее «Рисуем графы онлайн и с помощью Excel»

]]>
Как выяснилось, теперь для того, чтобы нарисовать граф на языке описания dot с помощью graphviz не обязательно его устанавливать на свой компьютер, а можно просто воспользоваться соответствующим online-сервисом.

Пример схемы из статьи на этом сайте

Как видно, для получения результата достаточно скопировать любой код из примеров на этом сайте и получается полностью аналогичный результат. Полученный граф также можно загрузить в формате svg или png, нажав соответсвующую кнопку.

Пример изображения в формате png

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

X1(t)X2(t)X3(t)
X1(t+1)0,10,50,1
X2(t+1)0,200,2
X3(t+1)0,70,50,7
Исходные данные в табличном виде
Представление в Excel

Для того, чтобы сгенерировать соответствующие строки кода нам надо развернуть таблицу (unpivot table). Современный Excel делает это с помощью power query, а старый только с помощью кода на Visual Basic, например, такого:

Sub M_snb()
    sn = Cells(1).CurrentRegion
    x = Cells(1).CurrentRegion.Rows(1).SpecialCells(2).Count
    y = UBound(sn, 2) - x
   
    ReDim sp(1 To x * (UBound(sn) - 1), 1 To 4)
   
    For j = 1 To UBound(sp)
       m = (j - 1) Mod (UBound(sn) - 1) + 2
       n = (j - 1) \ (UBound(sn) - 1) + y + 1
       sp(j, 1) = sn(m, 1)
       sp(j, 2) = sn(m, 2)
       sp(j, 3) = sn(1, n)
       sp(j, 4) = sn(m, n)
    Next
   
    Cells(20, 1).Resize(UBound(sp), UBound(sp, 2)) = sp
End Sub

Добавив это код в нашу таблицу, можно запустить макрос M_snb и получим следующее:

Преобразованная с помощью макроса таблица

Нас интересуют строчки начиная с 23. Добавляем простую формулу (см. сроку формул) и заполняем её вниз. Обратите внимание, что в колонке A у нас момент времени (t+1), а в колонке С — момент времени t, поэтому склейка в строку идет именно так, как показано в формуле [(t)->(t+1)].

Знак «&» в Excel используется для склейки строк. Строки в Excel заключаются в кавычки. Две кавычки подряд внутри кавычек интепретируются Excel как символ одиночной кавычки.

Собираем код (строку № 27 с нулевым значением я удалил):

digraph G {
X1->X1 [label="0,1"]
X1->X2 [label="0,2"]
X1->X3 [label="0,7"]
X2->X1 [label="0,5"]
X2->X3 [label="0,5"]
X3->X1 [label="0,1"]
X3->X2 [label="0,2"]
X3->X3 [label="0,7"]
}
Граф к коду выше

Если надо теперь это представить чуть красивее, например, расписав состояния нашей системы, то можно в код добавить преамбулу, описывающую эти состояния.

Символ \n в данном случае обозначает перевод строки, что позволяет написать название в две строки, как показано на рисунке ниже.

digraph G {
X1 [label="X1\nвыключено"]
X2 [label="X2\nсломано"]
X3 [label="X3\nв ремонте"]
    
X1->X1 [label="0,1"]
X1->X2 [label="0,2"]
X1->X3 [label="0,7"]
X2->X1 [label="0,5"]
X2->X3 [label="0,5"]
X3->X1 [label="0,1"]
X3->X2 [label="0,2"]
X3->X3 [label="0,7"]
}
Итоговый результат

Таким вот несложным образом можно без особого труда нарисовать очень объемные графы.

]]>
2885
Дерево текущей реальности (TOC) в Graphviz https://tushavin.ru/derevo-tekushhej-realnosti-toc-v-graphviz/ Fri, 23 Jun 2017 10:09:36 +0000 https://tushavin.ru/?p=1274 Читать далее «Дерево текущей реальности (TOC) в Graphviz»

]]>
Рассмотрим еще один пример работы с graphviz — рисование дерева текущей реальности. » Дерево текущей реальности (ДТР) – это инструмент для анализа проблем (рис. 1.12). С его помощью можно изучить причинно-следственные связи, определяющие текущую ситуацию» [1].

Дерево текущей реальности (ДТР)

 

Не вдаваясь в методику его построения, описанную в приведенной в списке литературы книге, рассмотрим простой пример сделанный на языке dot. Как мы видим нам нужны следующие графические элементы:

  • прямоугольники
  • овалы
  • соединительные линии
  • соединительные стрелки
  • также дополнительно нужны кружки для многостраничной схемы

Все это делается следующим образом.

  • прямоугольники: [shape = box];
  • овалы: [shape = oval,label=»»,height=0.1];
  • соединительные линии [dir=none];
  • соединительные стрелки — и так есть;
  • кружки: [shape=circle];

Также ориентируем документ сверху вниз (rankdir=BT) и выставляем шрифт.

Собственно, скрипт:

digraph PS3 {
resize=auto;
charset="utf8";
node [fontname="Verdana"];
rankdir=BT;
node [shape = box];
T102 [label="102. Сотрудники не до конца пони-\nмают значимость внедрения ПС"];
T301 [label="301.У руководства нет опыта\nвнедрения инструметов ПС"];
T302 [label="302. Для успешного внедрения\nнужно, чтобы каждый сотрудник \nбыл вовлечен в процесс "];
T303 [label="303. Для внедрения ПС\nтребуются доп. затраты ре \nсурсов"];
T304 [label="304. Ресурсы, направленные на мероприятия ПС\nограниченны"];
T305 [label="305. Руководство старается вовлечь \nво внедрение ПС\nбольшую часть сотрудников"];
T306 [label="306.Руководство желает \nвнедрить ПС"];
T307 [label="307.Руководство не хочет\nискать истинные \nпроблемы"];
T308 [label="308. Руководство\nобычно не проводит анализ \nпо степени значимости\nинициатив\nпо внедрению ПС "];
T309 [label="309. Отделы боятся\nнесправедливого\nраспределения ресурсов "];
T310 [label="310.Вовлечение\nвсего персонала\nв мероприятия ПС позволят\nраспределить равномерно ре\nсурсы "];
T311 [label="311.Не происходит\nраспределение мероприятий во важности, \nдля получения скорых результатов "];
T311А [label="311А. План мероприятий, \nкоторый не нацелен на\nрешение проблем предприятия, \nне приведет к улучшениям "];
T312 [label="312. Выделяемые ресурсы \nна внедрение ПС\nраспределены равномерно"];
T313 [label="313. Лишь некоторые мероприятия \nпо внедрению ПС \nповышают производительность и эффективность предприятия "];
T314 [label="314. Руководство \nне заостряет внимание\nна существующие проблемы \n(слабые места) "];
T315 [label="315.Нерациональное распределение \nресурсов уменьшает эффект\nпроводимых мероприятий ПС"];
T316 [label="316.Мероприятия, \nкоторые проводятся\nдля внедрения ПС,не\nулучшают производительность \nв целом "];
T317 [label="317. План мероприятий, \nкоторый не нацелен на\nрешение проблем предприятия, \nне приведет к улучшениям "];
T318 [label="318. Улучшения на предприятии\nне происходят, \nпока существуют\nнерешенные проблемы "];
T319 [label="319.Ресурсы тратятся\nна мероприятия, \nне влияющие на поизв-сть "];
T320 [label="320.Устранение проблем\n(слабых мест) оттягивают"];
T212 [label="212. Большинство думает, \nчто реальных результатов либо долго ждать, \nлибо совсем не будет"];
node [shape=circle];
"711"; "211";"112";
node [shape = oval,label="",height=0.1];
Z1;Z2;Z3;Z4;Z5;Z6;Z7;Z8;
T102->T301;
T301->Z1 [dir=none];
T301->T307;
T302->T305;
T303->"711";
T306->Z1 [dir=none];
T305->Z1 [dir=none];
Z1->T308;
Z1->T308;
Z1->T308;
T304->Z2 [dir=none];
T303->Z2 [dir=none];
T305->Z2 [dir=none];
Z2->T310;
Z2->T310;
Z2->T310;
T307->T311;
T308->T311;
T310->Z3 [dir=none];
T309->Z3 [dir=none];
Z3->T312;
Z3->T312;
T311A->Z4 [dir=none];
T311->Z4 [dir=none];
T305->Z4 [dir=none];
Z4->T313;
Z4->T313;
Z4->T313;
T312->T314;
T312->Z5 [dir=none];
T313->T316;
T314->Z6 [dir=none];
T315->Z6 [dir=none];
T313->Z5 [dir=none];
Z5->T319;
Z5->T319;
Z6->T320;
Z6->T320;
T319->"112";
T317->Z7 [dir=none];
T313->Z7 [dir=none];
Z7->T318;
Z7->T318;
T317->T311A;
T320->Z8 [dir=none];
T316->Z8 [dir=none];
T318->Z8 [dir=none];
Z8->T212;
Z8->T212;
Z8->T212;
"211"->T212;
}

 

Результат (кликабельно).

На мой взгляд, досаточно просто и гораздо быстрее, чем пытаться вручную двигать и вырванивать квадратики в графическом редакторе. Что такой graphviz и где его взять можно посмотреть в соответствующей заметке на сайте. По методике построения ДТР рекомендую обратиться к приведенной ниже книге.

Дерево будущей реальности (ДБР)

Построение принципиально не отличается от ДТР. Элементы те же.

 

Литература

  1. Детмер У Теория ограничений Голдратта. Системный подход к непрерывному совершенствованию. М.: Альпина Паблишер, 2017. 855 с.
]]>
1274
Немного про марковский анализ https://tushavin.ru/nemnogo-pro-markovskij-analiz/ Tue, 23 May 2017 09:40:54 +0000 https://tushavin.ru/?p=1213 Читать далее «Немного про марковский анализ»

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

Итак, в соответствии с ГОСТ Р ИСО/МЭК 31010-2011

В.24 Марковский анализ

В.24.1 Краткий обзор

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

В.24.2 Область применения

Марковский анализ может быть использован для систем с различной структурой (ремонтопригодных и неремонтопригодных), включая:
— системы с параллельными независимыми компонентами;
— системы с последовательными независимыми компонентами;
— системы с распределенной нагрузкой;
— резервированные системы, включая случай, когда может произойти отказ функций переключения;
— деградирующие системы.
Марковский анализ может быть использован для расчета эксплуатационной готовности, включая расчет необходимых компонентов запчастей для ремонта.

Там еще много умных и хороших слов, но они почему-то не вдохновляют студентов. Поэтому попробуем разобраться на простом примере.

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

Напоминаю, что такие картинки легко рисуются с помощью graphviz


# Здесь и далее граф строится с помощью команды dot из пакета graphviz

digraph x01 {
rankdir=LR;
Interested->Bored [ label = "0.2" ];
Bored->Interested [ label = "0.3" ];
}

Пусть в изначально всем было интересно, и мы имели ситуацию (интересно;скучно): (100%;0%)


Рассмотрим первую минуту. Скучно стало 0,2*100%=20%. Интересно стало 0%*0,3=0%. Таким образом, к концу первой минуты имеем ситуацию  (80%;20%).

Вторая минута. Скучно стало 80%*0,2=16%. Т.е. Интересно всё остается 64% студентов, но при этом обрело интерес 20%*0,3=6%. Таким образом 70% интересно.  Скучно осталось 14% и добавилось 16%, получилось 30%.

Так рассуждать, конечно, занимательно, но всё-таки перейдем на язык математики. Пусть имеется матрица начальных состояний:

\[\begin{bmatrix}
1  \\
0
\end{bmatrix} \]

и матрица перехода

I(t) B(t)
I(t+1) 0.8 0.3
B(t+1) 0.2 0.7

\[\begin{bmatrix}
0.8 & 0.3 \\
0.2 & 0.7
\end{bmatrix}\]
Их произведение даст нам:

\[\begin{bmatrix}
0.8 & 0.3 \\
0.2 & 0.7
\end{bmatrix} \begin{bmatrix}
1  \\
0
\end{bmatrix}=\begin{bmatrix}
0.8 \\
0.2
\end{bmatrix}\]

Попробуем сделать это же самое в R.

> p<-matrix(c(1,0),nrow=2) > p
     [,1]
[1,]    1
[2,]    0
> p<-matrix(c(1,0),nrow=2)
> p
 [,1]
[1,] 1
[2,] 0
> trans<-matrix(c(0.8,0.3,0.2,0.7),nrow=2,byrow=T)
> trans
 [,1] [,2]
[1,] 0.8 0.3
[2,] 0.2 0.7
> (p<- trans %*% p)
 [,1]
[1,] 0.8
[2,] 0.2
> (p<- trans %*% p)
 [,1]
[1,] 0.7
[2,] 0.3
> (p<- trans %*% p)
 [,1]
[1,] 0.65
[2,] 0.35
> (p<- trans %*% p)
 [,1]
[1,] 0.625
[2,] 0.375
> (p<- trans %*% p)
 [,1]
[1,] 0.6125
[2,] 0.3875
> (p<- trans %*% p)
 [,1]
[1,] 0.60625
[2,] 0.39375
> (p<- trans %*% p)
 [,1]
[1,] 0.603125
[2,] 0.396875
> (p<- trans %*% p)
 [,1]
[1,] 0.6015625
[2,] 0.3984375
> (p<- trans %*% p)
 [,1]
[1,] 0.6007813
[2,] 0.3992188
> (p<- trans %*% p)
 [,1]
[1,] 0.6003906
[2,] 0.3996094
> (p<- trans %*% p)
 [,1]
[1,] 0.6001953
[2,] 0.3998047
> (p<- trans %*% p)
 [,1]
[1,] 0.6000977
[2,] 0.3999023
> (p<- trans %*% p)
 [,1]
[1,] 0.6000488
[2,] 0.3999512
> (p<- trans %*% p)
 [,1]
[1,] 0.6000244
[2,] 0.3999756
> (p<- trans %*% p)
 [,1]
[1,] 0.6000122
[2,] 0.3999878
> (p<- trans %*% p)
 [,1]
[1,] 0.6000061
[2,] 0.3999939
> (p<- trans %*% p)
 [,1]
[1,] 0.6000031
[2,] 0.3999969
> (p<- trans %*% p)
 [,1]
[1,] 0.6000015
[2,] 0.3999985
> (p<- trans %*% p)
 [,1]
[1,] 0.6000008
[2,] 0.3999992
> (p<- trans %*% p)
 [,1]
[1,] 0.6000004
[2,] 0.3999996
> (p<- trans %*% p)
 [,1]
[1,] 0.6000002
[2,] 0.3999998
> (p<- trans %*% p)
 [,1]
[1,] 0.6000001
[2,] 0.3999999
> (p<- trans %*% p)
 [,1]
[1,] 0.6
[2,] 0.4
> (p<- trans %*% p)
 [,1]
[1,] 0.6
[2,] 0.4

Как мы видим, система оказалась в состоянии стохастического равновесия. Т.е. в каждый момент времени разным студентам интересно и скучно, но пропорция сохраняется: 60% интересно и 40% скучно. Собственно, на идее того, что системы такого вида стремятся к состоянию стохастического равновесия основано решение различных практических задач.

Например, прямая задача. Известны вероятности переходов, но неизвестно состояние равновесия. Заменяем конкретные числа на вероятности состояния в общем виде и имеем тождество:

\[ \begin{bmatrix}
0.8 & 0.3 \\
0.2 & 0.7
\end{bmatrix}\begin{bmatrix}
p \\ 1-p
\end{bmatrix} = \begin{bmatrix}
p \\ 1-p
\end{bmatrix} \]

Которое можно записать как систему уравнений:

\[\begin{cases}p\times0.8+(1-p)\times0.3=p \\
p\times0.2+(1-p)\times0.7=1-p \end{cases} \]

Из первого уравнения находим \( p=0.6 \), соответственно \( 1-p=0.4 \)

Тут любопытный студент возможно спросит, а что делать с тремя состояниями? Да абсолютно то же самое! Напишем в матричном виде

\[ \begin{bmatrix}
0.8 & 0.1 & 0.1\\
0.1 & 0.6 & 0.8 \\
0.1 & 0.3 & 0.1 \\
\end{bmatrix}\begin{bmatrix}
p \\ q \\ (1-p-q)
\end{bmatrix}=\begin{bmatrix}
p \\ q \\ (1-p-q)
\end{bmatrix} \]

Далее напишем систему уравнений решим и получим результат.

Решим обратную задачу. Пусть мы видим, что в каждый момет времени у нас интересно 70% студентам, а скучно 30%. Мы знаем, что в среднем студенту становится интересно через 5 минут слушания. Какова вероятность того, что ему станет скучно? Т.е. надо определить вероятности перехода из состояния «Интересно» в «Cкучно» — x. При этом вероятность перехода в обратную сторону (интенсивность восстановления системы) равен 1/5=0.2 («интересно» через 5 минут, частота дискретизации 1 минута).

Имеем систему:

\[ \begin{bmatrix}
1-x & 0.2 \\
x & 0.8
\end{bmatrix}\begin{bmatrix}
0.7 \\ 0.3
\end{bmatrix}=\begin{bmatrix}
0.7 \\ 0.3
\end{bmatrix}\]

Откуда имеем: \( 0.7\times(1-x)+0.3\times 0.2=0.7 \) и \(x=0.086\) (или \(x=6/70\))

Проверяем в R:


> p<-matrix(c(0.7,0.3),nrow=2) > p
     [,1]
[1,]  0.7
[2,]  0.3
> trans<-matrix(c(1-6/70,6/70,0.2,0.8),nrow=2,byrow=F) > trans
           [,1] [,2]
[1,] 0.91428571  0.2
[2,] 0.08571429  0.8
> trans %*% p
     [,1]
[1,]  0.7
[2,]  0.3

Как видим, все верно. На всякий случай уточняю, что считать не обязательно в процентах от студентов. Можно и в студентах. Например, для группы в 20 человек имеем:


> p<-matrix(c(14,6),nrow=2) 
> p
     [,1]
[1,]   14
[2,]    6
> trans<-matrix(c(1-6/70,6/70,0.2,0.8),nrow=2,byrow=F) 
> trans
           [,1] [,2]
[1,] 0.91428571  0.2
[2,] 0.08571429  0.8
> trans %*% p
     [,1]
[1,]   14
[2,]    6

Теперь, предположим, мы улучшили  какой-то из показателей, например, студенту становится интересно не через 5 минут, а через 4. Что изменится в нашей системе, если считать, что интенсивность отказа (студенту становится скучно) не изменилось? Имеем снова прямую задачу на нахождение стохастического равновесия с известной матрицей переходов. Как её решать описано выше, на этом останавливаться не будем, а просто промоделируем пошагово изменение системы и построим график.

> p<-matrix(c(0.7,0.3),nrow=2) 
> p
 [,1]
[1,] 0.7
[2,] 0.3
> 
> trans<-matrix(c(1-6/70,6/70,0.25,0.75),nrow=2,byrow=F) 
> trans
 [,1] [,2]
[1,] 0.91428571 0.25
[2,] 0.08571429 0.75
> result<-rep(0,40)
> for(i in 1:40) {
+ result[i]<-p[1,1] 
+ p<-trans %*% p }
> plot(result,pch=19,xlab="Время, мин", ylab="Доля заинтересованных студентов")
> p
 [,1]
[1,] 0.7446808
[2,] 0.2553192

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

 

]]>
1213
Динамическое программирование https://tushavin.ru/dynamic-prg/ Sat, 22 Oct 2016 13:02:24 +0000 http://tushavin.ru/?p=181 Читать далее «Динамическое программирование»

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

Для построения графов использована программа graphviz. Описание работы с ней доступно по ссылке.

Задача. Определить оптимальный маршрут из пункта 1 в пункт 10 по схеме маршрута движения.


# Здесь и далее граф строится с помощью команды dot из пакета graphviz

digraph ex01 {
                rankdir=LR;
                size="8,5"
                node [shape = box];
                "1" -> "2" [ label = "3" ];
                "1" -> "3" [ label = "7" ];
                "1" -> "4" [ label = "2" ];
                "2" -> "5" [ label = "9" ];
                "2" -> "6" [ label = "11" ];
                "3" -> "5" [ label = "5" ];
                "3" -> "6" [ label = "10" ];
                "3" -> "7" [ label = "7" ];
                "4" -> "6" [ label = "15" ];
                "4" -> "7" [ label = "13" ];
                "5" -> "8" [ label = "7" ];
                "5" -> "9" [ label = "5" ];
                "6" -> "8" [ label = "3" ];
                "6" -> "9" [ label = "4" ];
                "7" -> "8" [ label = "7" ];
                "7" -> "9" [ label = "1" ];
                "8" -> "10" [ label = "1" ];
                "9" -> "10" [ label = "4" ];
}

 

main-1

Каждый квадрат на схеме изображает один из населенных пунктов, которые для удобства пронумерованы.

Стоимость проезда из пункта i в пункт j обозначим через \(с_{ij}\) (обозначено на стрелках). Требуется определить такой путь из пункта 1 в пункт 10, общая стоимость которого является минимальной.

Решение без применения компьютера

Решение: Воспользуемся формулой реккурентных соотношений Беллмана $$f_n(i)=\min_j\{c_{ij}+f_{n-1}(j)\},\ n=\bar{{1,N}},$$

где N — количество этапов в решении; \(f_n(i)\) — стоимость, отвечающая стратегии минимальных затрат для пути от пункта i, если до конечного пункта остается n шагов; \(P_n(i)\) — решение, позволяющее достичь  \(f_n(i)\). Начинаем поиск от конечного пункта.

n=1

$$f_1(8)=c_{8,10}=1, P_1(8)=10;$$

$$f_1(9)=c_{9,10}=4, P_1(9)=10;$$

n=2

$$f_2(5)=\min\{c_{5,8}+f_1(8);c_{5,9}+f_1(9)\}=8, P_2(5)=8;$$

$$f_2(6)=\min\{c_{6,8}+f_1(8);c_{6,9}+f_1(9)\}=4, P_2(6)=8;$$

$$f_2(7)=\min\{c_{7,8}+f_1(8);c_{7,9}+f_1(9)\}=5, P_2(7)=9;$$

 

digraph ex02 {
                rankdir=LR;
                size="8,5"
                node [shape = box];
                "1" -> "2" [ label = "3" ];
                "1" -> "3" [ label = "7" ];
                "1" -> "4" [ label = "2" ];
                "2" -> "5" [ label = "9" ];
                "2" -> "6" [ label = "11" ];
                "3" -> "5" [ label = "5" ];
                "3" -> "6" [ label = "10" ];
                "3" -> "7" [ label = "7" ];
                "4" -> "6" [ label = "15" ];
                "4" -> "7" [ label = "13" ];            
# Упростили    
                "5" -> "8" [ label = "7" ];
                "6" -> "8" [ label = "3" ];
                "7" -> "9" [ label = "1" ];
                "8" -> "10" [ label = "1" ];
                "9" -> "10" [ label = "4" ];
}

 

step2-1

n=3

$$f_3(2)=\min\{c_{2,5}+f_2(5);c_{2,6}+f_2(6)\}=15, P_3(2)=6;$$

$$f_3(3)=\min\{c_{3,5}+f_2(5);c_{3,6}+f_2(6);c_{3,7}+f_2(7)\}=12, P_3(3)=7;$$

$$f_3(4)=\min\{c_{4,6}+f_2(6);c_{2,7}+f_2(7)\}=18, P_3(4)=7;$$

digraph ex03 {
                rankdir=LR;
                size="8,5"
                node [shape = box];
                "1" -> "2" [ label = "3" ];
                "1" -> "3" [ label = "7" ];
                "1" -> "4" [ label = "2" ];
# Упростили     на 3 этапе
                "2" -> "6" [ label = "11" ];
                "3" -> "7" [ label = "7" ];
                "4" -> "7" [ label = "13" ];            
# Упростили     на 2 этапе
                "6" -> "8" [ label = "3" ];
                "7" -> "9" [ label = "1" ];
                "8" -> "10" [ label = "1" ];
                "9" -> "10" [ label = "4" ];
}
 

step3-1

n=4

$$f_4(1)=\min\{c_{1,2}+f_3(2);c_{1,3}+f_3(3);c_{1,4}+f_3(4)\}=18, P_4(1)=3;$$

Таким образом оптимальный путь 1-2-6-8-10, затраты по которому составляют \(f_4(1)=18\)

digraph ex01 {
                rankdir=LR;
                size="8,5"
                node [shape = box];
                "1" -> "2" [ label = "3",style=bold,color=red ];
                "1" -> "3" [ label = "7",style=dotted];
                "1" -> "4" [ label = "2",style=dotted ];
                "2" -> "5" [ label = "9",style=dotted ];
                "2" -> "6" [ label = "11",style=bold,color=red ];
                "3" -> "5" [ label = "5",style=dotted ];
                "3" -> "6" [ label = "10",style=dotted ];
                "3" -> "7" [ label = "7",style=dotted ];
                "4" -> "6" [ label = "15",style=dotted ];
                "4" -> "7" [ label = "13",style=dotted ];
                "5" -> "8" [ label = "7",style=dotted ];
                "5" -> "9" [ label = "5",style=dotted ];
                "6" -> "8" [ label = "3",style=bold,color=red ];
                "6" -> "9" [ label = "4",style=dotted ];
                "7" -> "8" [ label = "7",style=dotted ];
                "7" -> "9" [ label = "1",style=dotted ];
                "8" -> "10" [ label = "1",style=bold,color=red ];
                "9" -> "10" [ label = "4",style=dotted ];
}

step4-1


Решение в R

Для решения задач связанных с поиском кратчайшего пути в графе в GNU R можно использовать функцию пакет igraph. В таком случае


library(igraph)
mytable<-data.frame(from=c(1,1,1,2,2,3,3,3,4,4,5,5,6,6,7,7,8,9)
            to=c(2,3,4,5,6,5,6,7,6,7,8,9,8,9,8,9,10,10),
            weight=c(3,7,2,9,11,5,10,7,15,13,7,5,3,4,7,1,1,4))
## from to weight
## 1 1 2 3
## 2 1 3 7
## 3 1 4 2
## 4 2 5 9
## 5 2 6 11
## 6 3 5 5

Задаем граф, рисуем его и находим кратчайшие пути.


g<-graph.data.frame(mytable,directed =T )
plot(g)

unnamed-chunk-5-1


distances(g,algorithm ="bellman-ford")

##     1  2  3  4  5  6  7  8  9 10
## 1   0  3  7  2 12 14 14 17 15 18
## 2   3  0 10  5  9 11 15 14 14 15
## 3   7 10  0  9  5 10  7 12  8 12
## 4   2  5  9  0 14 15 13 18 14 18
## 5  12  9  5 14  0  9  6  7  5  8
## 6  14 11 10 15  9  0  5  3  4  4
## 7  14 15  7 13  6  5  0  6  1  5
## 8  17 14 12 18  7  3  6  0  5  1
## 9  15 14  8 14  5  4  1  5  0  4
## 10 18 15 12 18  8  4  5  1  4  0

shortest_paths(g, 1, 10)$vpath

## [[1]]
## + 5/10 vertices, named:
## [1] 1  2  6  8  10
]]>
181
Материалы https://tushavin.ru/materialy/ https://tushavin.ru/materialy/#respond Tue, 20 Sep 2016 20:08:28 +0000 http://tushavin.ru/?page_id=55 Читать далее «Материалы»

]]>
Материалы для студентов и аспирантов

Общие вопросы

Заметки по теме написания ВКР:

Прикладные методы оптимизации

Заметки по теме:

Инновационная деятельность и управление проектами

Заметки по теме:

Методы исследования и оценки рисков инновационной деятельности

Заметки по теме:

Основы обеспечения качества информационных систем

Заметки по теме:

]]>
https://tushavin.ru/materialy/feed/ 0 55
Ссылки https://tushavin.ru/links/ Tue, 20 Sep 2016 20:03:50 +0000 http://tushavin.ru/?page_id=52 Читать далее «Ссылки»

]]>
В помощь учащимся

Библиотеки и источники

Online обучение

Бесплатная Online сертификация

Бесплатное программное обеспечение

  • Gretl (Gnu Regression, Econometrics and Time-series Library) — бесплатная программа для решения задач, связанных с регрессионным анализом и анализом временных рядов.
  • Graphviz — программа для визуализации графов. Часть возможностей описана в заметке на этом сайте.
  • Bizagi modeller — визуализация и имитационное моделирование бизнес-процессов
  • GNU R — язык программирования для статистической обработки данных и работы с графикой. Отличный инструмент работы, особенно в совокупности с RStudio или пакетом rattle.
  • XMind — инструмент для работы с диаграммами связей (интеллект-картами, Mind Map). Часть материалов этого сайта представлена в виде интеллект-карт.
  • WiseMapping — online редактор интеллект-карт.
  • Inkscape — мощный графический векторный редактор. Важнейшее достоинство: имеется возможность редактировать рисунки в формате pdf. Работает в формате SVG, что позволяет править иллюстрации, созданные в GNU R или в Graphviz.
  • LibreOffice — офисный пакет, совместим с Microsoft Office. В случае решения задач линейного программирования, важно что Calc не имеет ограничений на размер матрицы, в отличии от Excel, что позволяет решать достаточно сложные задачи. Содержит неплохой векторный редактор Draw.
  • ProjectLibre — бесплатное кроссплатформенное ПО для управления проектами (бывш. OpenProj)
  • Notepad++ — мощный текстовый редактор с подсветкой синтаксиса.
  • Dia — бесплатная замена Visio для рисования диаграмм. Свободный кроссплатформенный редактор.
  • PortableApp — установите основные приложения (часть перечислена выше) себе на флеш-накопитель и пользуйтесь на любом компьютере, включая институтские. В том числе R и RStudio portable. Подробная инструкция по установке вот здесь.
  • XLSTAT Free edition — расширение для Excel
  • MikTexTeXstudio  + JabRef — настольная издательская система.
  • ImageMagick® — мощный инструмент для консольной работы с графикой.

Сайты коллег

Разные статьи и заметки

]]>
52
Рисуем схему из ГОСТ Р 54870-2011 в graphviz https://tushavin.ru/gost2graphviz/ Tue, 22 Mar 2016 06:19:13 +0000 http://tushavin.ru/?p=275 Читать далее «Рисуем схему из ГОСТ Р 54870-2011 в graphviz»

]]>
Рассмотрим пример ГОСТ Р 54870-2011 стр. 10. Там приведена схема высокоуровневых понятий менеджмента проектов и их взаимосвязь. Нарисуем её с помощью языка dot.

digraph gost{
node [shape=box,style=rounded,fontsize=12];
edge[fontsize=10];
"Организация"->"Стратегические цели" [label="Устанавливает"];
"Организация"->"Портфель проектов" [label="Утверждает, реализует\nобеспечивает ресурсами,\nподдерживает"];
"Организация"->"Комитет управления\nпортфелем проектов" [label="Назначает"];
"Комитет управления\nпортфелем проектов"->"Организация" [label="Отчитывается"];
"Комитет управления\nпортфелем проектов"->"Руководитель\nпортфеля проектов" [label="Назначает,\nделегирует\nполномочия"];
"Руководитель\nпортфеля проектов"->"Комитет управления\nпортфелем проектов"[label="Отчитывается"];
"Комитет управления\nпортфелем проектов"->"Портфель проектов" [label="Управляет, контродлирует\nобеспечивает реализацию"];
"Руководитель\nпортфеля проектов"->"Портфель проектов" [label="Управляет, контролирует\nобеспечивает реализацию"];
"Портфель проектов"->"Стратегические цели" [label="Обеспечивает\nдостижение"];
"Портфель проектов"->"Компонент\nпортфеля" [label="Состоит из"];
"Менеджеры\nпроектов\nи программ"->"Компонент\nпортфеля" [label="Управляют"];
"Руководитель\nпортфеля проектов"->"Менеджеры\nпроектов\nи программ" [label="Контролируют"];
"Менеджеры\nпроектов\nи программ" -> "Руководитель\nпортфеля проектов"[label="Отчитываются"];
}

test_9

]]>
275
Используем электронную таблицу для рисования графа https://tushavin.ru/using-excel-1/ Tue, 15 Mar 2016 05:53:31 +0000 http://tushavin.ru/?p=263 Читать далее «Используем электронную таблицу для рисования графа»

]]>
Ранее было рассказано, как нарисовать граф с помощью пакета Graphviz. А что делать, если имеются некоторые данные в электронной таблице и необходимо построить граф?

Рассмотрим две задачи. Первая задача будет построение иерархии для последующего анализа. В файле примеров это будет вкладка test1:

snimok-ekrana-2016-03-15-v-11-26-22
Данными у нас заполнены первые три колонки. Дальше мы делаем три колонки с данными без пропусков, для чего используем функции ЕСЛИ и ЕПУСТО. Дальше собираем текст, используя функцию СЦЕПИТЬ. Обратите внимание, чтобы в результирующей строке получилась кавычка, необходимо её дублировать:

=СЦЕПИТЬ(«»»»;E2;»»»->»»»;F2;»»»»)

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

digraph test{
   node [shape = box];
"Некая цель"->"Альтернатива 1"
"Некая цель"->"Альтернатива 2"
"Некая цель"->"Альтернатива 3"
"Некая цель"->"Альтернатива 4"
"Альтернатива 1"->"Критерий 1"
"Альтернатива 1"->"Критерий 2"
"Альтернатива 1"->"Критерий 3"
"Альтернатива 1"->"Критерий 4"
"Альтернатива 1"->"Критерий 5"
"Альтернатива 2"->"Критерий 1"
"Альтернатива 2"->"Критерий 2"
"Альтернатива 2"->"Критерий 3"
"Альтернатива 2"->"Критерий 4"
"Альтернатива 2"->"Критерий 5"
"Альтернатива 3"->"Критерий 1"
"Альтернатива 3"->"Критерий 2"
"Альтернатива 3"->"Критерий 3"
"Альтернатива 3"->"Критерий 4"
"Альтернатива 3"->"Критерий 5"
"Альтернатива 4"->"Критерий 1"
"Альтернатива 4"->"Критерий 2"
"Альтернатива 4"->"Критерий 3"
"Альтернатива 4"->"Критерий 4"
"Альтернатива 4"->"Критерий 5"
}

test1

Второй задачей будет построение графа взаимных долгов на основании табличных данных

snimok-ekrana-2016-03-15-v-11-37-47

В результате получаем граф:

digraph test2{
"Вася"->"Петя"[label=100]
"Вася"->"Коля"[label=200]
"Коля"->"Петя"[label=300]
}

test2

В данной заметке рассмотрены самые простые примеры, однако, используя эту идею можно при формировании команд на языке dot в excel использовать условное форматирование, например, задавая форму узлов, стрелок, цвета и т.д.

]]>
263
Graphviz — рисуем графы https://tushavin.ru/graphviz/ Wed, 09 Mar 2016 05:22:09 +0000 http://tushavin.ru/?p=123 Читать далее «Graphviz — рисуем графы»

]]>
Достаточно часто встречается задача, когда надо нарисовать нечто, представляющее из себя граф. Это может быть иерархическая сструктура работ проекта, иерархическая структура рисков, организационная структура, топология сети и т.п. Если же количество вершин и ребер достаточно велико, то нарисовать это красиво становится нетривиальной задачей. К счастью, существует программа Graphviz, которая использует язык описания графов dot и имеет графический интерфейс под Windows.

Сама программа бесплатна и может быть скачена по ссылке.  После установки в Windows в меню «Пуск» появится приложение gvedit, которое является графическим интерфесом к установленному пакету программ. В Mac OS X такого не произойдет и обходное решение описано ниже (если, конечно, вы не готовы работать в терминале).

Рассмотрим направленный граф, описывающий все возможные коммуникации между четырьмя участниками проекта. Листинг, описывающий граф привожу ниже:

digraph test{
   1->2;
   1->3;
   1->4;
   2->1;
   2->3;
   2->4;
   3->1;
   3->2;
   3->4;
   4->1;
   4->2;
   4->3;
}

В приложении это будет выглядеть следующим образом:

bezymyannyy_1

 

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

Для примера, тот же граф, построенный с помощью:

test_1 test_2 test_3
circo fdp twopi

Подробнее это описано в документации на сайте. Если кратко, то dot, а далее в статье используется только он, рисует граф в заданном в порядке ветвления; twopi — использует радиальное построение, когда вершины располагаются на концентрических окружностях, circo — связанные вершины располагаются по кругу.

В данном случае, у нас был изображен орграф. Если граф не ориентирован, иными словами «стрелочки» на рисунке нам не важны, то граф описывается следующим образом (обратите внимание на первой слово «graph» вместо «digraph», как задаются связи («—» вместо «->»), а также на команду node [shape = box] — задающую прямоугольники в качестве вершин). Несомненно, формат стрелок можно определить и в самом графе на языке dot, но алгоритмы построения для ориентированных и неориентированных графов имеют небольшое отличие.

graph test{
   node [shape = box];
   "Проект А"--"Фаза 1";
   "Проект А"--"Фаза 2";
   "Проект А"--"Фаза 3";
   "Фаза 1"--"Задача 1";
   "Фаза 1"--"Задача 2";
   "Фаза 2"--"Задача 3";
   "Фаза 2"--"Задача 4";
}

Результат выглядит так:

test_4

Пример из заметки по динамическому программированию: меняем ориентацию графа (строится справа налево), добавляем подписи и стили линий и задаем размер листа.

digraph ex01 {
    rankdir=LR;
    size="8,5"
    node [shape = box];
    "1" -> "2" [ label = "3",style=bold,color=red ];
    "1" -> "3" [ label = "7",style=dotted];
    "1" -> "4" [ label = "2",style=dotted ];
    "2" -> "5" [ label = "9",style=dotted ];
    "2" -> "6" [ label = "11",style=bold,color=red ];
    "3" -> "5" [ label = "5",style=dotted ];
    "3" -> "6" [ label = "10",style=dotted ];
    "3" -> "7" [ label = "7",style=dotted ];
    "4" -> "6" [ label = "15",style=dotted ];
    "4" -> "7" [ label = "13",style=dotted ];
    "5" -> "8" [ label = "7",style=dotted ];
    "5" -> "9" [ label = "5",style=dotted ];
    "6" -> "8" [ label = "3",style=bold,color=red ];
    "6" -> "9" [ label = "4",style=dotted ];
    "7" -> "8" [ label = "7",style=dotted ];
    "7" -> "9" [ label = "1",style=dotted ];
    "8" -> "10" [ label = "1",style=bold,color=red ];
    "9" -> "10" [ label = "4",style=dotted ];
}

step4-1

 

Более сложные пример приведен в заметке по методу анализа иерархии.

При выборе формата записи результирующего графа, определенный интерес представляет формат svg в поле Output File Type. Формат svg — векторный формат, файлы в этом  формате можно редактировать, например, с помощью Inkscape.  Также обратите внимание на векторный формат emf, позволяющий внедрять и масштабировать рисунки в Word без потери качества. Для этого сайта был использован растровый формат png.

bezymyannyy_2

И последний пример, использование структуры в качестве вершины графа.

digraph structs { 
    node [shape=record, style="rounded,filled"];
    struct1 [label="<f0> Инициация|<f1> Планирование|<f2> Исполнение|<f3> Завершение",
             fillcolor=yellow];
    struct2 [label="<f0> Мониторинг|<f1> Контроль"]; 
    struct1:f0-> struct2:f0;
    struct1:f1-> struct2:f0;
    struct1:f2-> struct2:f0;
    struct1:f3-> struct2:f0;
    struct2:f1 -> struct1:f0 [color="red"];
    struct2:f1 ->struct1:f1 [color="red"];
    struct2:f1 ->struct1:f2 [color="red"];
    struct2:f1 ->struct1:f3 [color="red"];
}

 test_5

Иcпользование команд консоли

snimok-ekrana-2016-03-09-v-21-55-07

Самый простой вариант создать диаграмму — это запустить в консоли соответсвующую команду (на рисунке показано окно Терминала под Mac OS X), например, dot. Если файл называется test.gv, а на выходе мы хотим получить png, то команда будет такая, как это показано ниже (а также выше на рисунке). Решение универсально и работает в любой операционной системе.

dot -Tpng -O test.gv

Использование RStudio для рисования графов

Следует отметить, что в Mac OS X при установке graphviz такой удобной графической оболочки как в Windows, вы не получите. Если вариант собрать его из исходников из портов (если вы хоть что-то поняли из написанных слов, значит инструкции не нужны), можно использовать консоль, как это показано выше, но также имеется возможноть использовать средства языка R и RStudio. Возможно, что кому-то это будет проще.

Для корректной работы вам понадобится пакет DiagrammeR. Установите его из меню или командой

install.packages("DiagrammeR")

После установки создайте файл, скопируйте туда код, сохраните его с расширением .gv, поставьте галочку «Preview on Save». Обратите внимание, если вы работаете в Windows, то файл необходимо сохранять в кодировке cp1251, иначе вместо русского языка вы получите кракозябры.

bezymyannyy_3

Дальше, используя кнопку Export, можно сохранить получившуюся диаграмму в формате png или jpeg.

Альтернативные варианты рисования диаграмм

Следует отметить, что DiagrammeR позволяет работать и с диаграммами в формате mermaid. В таком случае, файлы надо сохранять с расширением .mmd. Помимо простых графов, этот формат позволяет описать диаграмму последовательности, как это показано на рисунке ниже.

bezymyannyy_4

Код:

sequenceDiagram
  Покупатель->>Кассир: запрос билетов
  Кассир->>База данных: наличие мест
  alt билеты имеются
    База данных->>Кассир: Имеются
    Кассир->>Покупатель: Подтверждение
    Покупатель->>Кассир: Согласие
    Кассир->>База данных: Бронирование мест
    Кассир->>Принтер: Печать билета
  else билеты проданы
    База данных->>Кассир: Свободных мест нет
    Кассир->>Покупатель: Извините
  end

Диаграмма (обратите внимание, что пропали стрелки и непонятно, как идут сообщения.  Это давно известная ошибка, которую так и не исправили):

rplot_1

К счастью, в формате mermaid можно редактировать online с сохранением результата в формате SVG, где результат будет выглядеть больше похожим на то, что ожидалось.

snimok-ekrana-2016-03-09-v-21-06-13

Дополнительные материалы

  1. Примеры на сайте graphviz. При кликании мышкой по графу показывается его код.
  2. Документация: различные типы узлов
  3. Документация: различные типы стрелок
  4. Документация: цветовая палитра
]]>
123
Метод анализа иерархий в R https://tushavin.ru/ahp/ Fri, 04 Mar 2016 18:54:44 +0000 http://tushavin.ru/?p=17 Читать далее «Метод анализа иерархий в R»

]]>
Метод Анализа Иерархий (МАИ, англ. analytic hierarchy process (AHP)) — математический инструмент системного подхода к сложным проблемам принятия решений. Определенный практический интерес представляет его реализация в GNU R. Рассмотрим это подробнее.

Для работы с приведенными примерами необходимо, чтобы был установлен R, а также RStudio. Ссылки на ПО есть на соответствующей странице.

Для работы необходимо установить некоторые пакеты (просто скопируйте приведенные команды в консоль и нажмите Enter)

install.packages("ahp")
install.packages("shinythemes")
install.packages("shinyAce")
install.packages("shinyjs")

После установки пакетов вы готовы к запуску графической оболочки. Наберите команды.

library(ahp)
RunGUI()

Если все сделано правильно, должно запуститься окно браузера.

Окно браузера для МАИ
Окно браузера для МАИ

Может возникнуть ошибка, вызванная тем, что какой-то из пакетов не встал, например, из-за сетевого сбоя. Если обратить внимание на текст сообщения при установке, то можно заметить, что пакет ahp при инсталляции также ставит необходимые для своей работы пакеты: jsonlite, httpuv, xtable, htmlwidgets, shiny, rstudioapi, visNetwork, data.tree, formattable, DiagrammeR. Если вместо окна браузера появляется ошибка, то надо просто установить недостающий пакет командой install.packages  или из меню приложения.

Рассмотрим решение задачи выбора лидера из статьи, описанной в Wikipedia.

Постановка задачи выбора лидера (c) Википедия
Постановка задачи выбора лидера (c) Википедия

В данной задаче необходимо выбрать из трех кандидатов одного на должность руководителя. Кандидаты оцениваются по критериям: возраст, опыт, образование и личные качества. На рисунке показана иерархия для этой задачи. Простейшая иерархия содержит три уровня: цель, критерии и альтернативы. Числа на рисунке показывают приоритеты элементов иерархии с точки зрения цели, которые вычисляются в МАИ на основе парных сравнений элементов каждого уровня относительно связанных с ними элементами вышерасположенного уровня. Приоритеты альтернатив относительно цели (глобальные приоритеты) вычисляются на заключительном этапе метода путем линейной свертки локальных приоритетов всех элементов. В данном примере лучшим кандидатом является Дик, так как имеет максимальное значение глобального приоритета.

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

 

 

pic01_1

Перейдем на вкладку Visualize и посмотрим на схему задачи

pic01_2

На вкладке анализ мы увидим результаты расчетов

pic01_3

Аналогичные результаты можно получить и из командной строки.


ahpFile <- system.file("extdata", "tom_dick_harry.ahp", package="ahp")
tomAhp <- Load(ahpFile)
Visualize(tomAhp)

rplot01


Calculate(tomAhp) # Пересчитать
Analyze(tomAhp)  # Результаты в текстовом виде
# Weight  Dick   Tom Harry Inconsistency
# 1 Choose the Most Suitable Leader 100.0% 48.1% 38.5% 13.4%          4.4%
# 2  ¦--Experience                   54.8% 34.9% 14.1%  5.7%          3.3%
# 3  ¦--Charisma                     27.0%  5.2% 20.1%  1.7%          6.1%
# 4  ¦--Education                    12.7%  4.2%  2.8%  5.6%            NA
# 5  °--Age                           5.6%  3.8%  1.5%  0.4%          2.5%
AnalyzeTable(tomAhp) # Результаты в графическом виде

rplot

 

Известные проблемы и пути их решения

Главная проблема — пока не удалось заставить работать с русским языком в Windows. В Mac OS X все работает прекрасно, a в Windows скрипт вылетает по ошибке. Проблема понятна и она заключается в кодовых страницах, поскольку R понимает latin1 и UTF-8, а в OS X кодировка одна, UTF-8, то проблем нет. В Windows же кодировка  windows-1251 и иногда возникают ошибки, в случае, если приложение не адаптировано к иным языкам, отличным от английского.

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

cat(GetGraph(tomAhp)$dot_code)

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

Я предпочитаю редактировать в Notepad++. Первым делом заменяем все одинарные кавычки (‘)  на двойные («). Иначе потом будут ошибки. Дальше меняем слова групповой заменой и вставляем в редактор gvedit

bezymyannyy

 

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

test

Что же касается табличной части, то Analize возвращает результат в текстовом виде, который можно просто отредактировать. Останавливаться на этом не буду.

 

Список источников

1. Christoph Glur (2016). ahp: Analytic Hierarchy Process. R package version 0.2.8.  https://CRAN.R-project.org/package=ahp

2. Саати Т. Принятие решений. Метод анализа иерархий. — М. : Радио и связь, 1993. — 278 с.


]]>
17