ПРАКТИКА
.docxЗадание 1. КЛАСТЕРИЗАЦИЯ С ИСПОЛЬЗОВАНИЕМ СЕТЕЙ КОХОНЕНА
Оценивая рынок недвижимости, мной было выделено два основных параметра: цена квартиры и ее площадь. Поэтому НС будет иметь два входа. В зависимости от параметров квартиры разделятся на два класса, следовательно, размерность выходного слоя равняется двум.
Исходные данные обучающей выборки имеют вид:
Стоимость |
Площадь |
Стоимость |
Площадь |
37000 |
33 |
65000 |
60 |
32500 |
33 |
14800 |
23 |
44200 |
40 |
31500 |
30 |
32000 |
32 |
25800 |
30 |
31500 |
30 |
45200 |
33 |
38000 |
36 |
27000 |
28 |
26800 |
33 |
45000 |
39 |
69400 |
66 |
33000 |
31 |
39500 |
35 |
26000 |
33 |
37000 |
40 |
40500 |
40 |
42800 |
41 |
40000 |
45 |
15800 |
28 |
32000 |
32 |
37000 |
33 |
34500 |
34 |
31500 |
33 |
19700 |
36 |
33800 |
32 |
35000 |
34 |
Нормализуем входные векторы следующим образом: . Получим:
Норм стоим. |
Норм площ. |
Норм стоим. |
Норм площ. |
0,1814 |
0,1638 |
0,3186 |
0,2979 |
0,1593 |
0,1638 |
0,0725 |
0,1142 |
0,2167 |
0,1986 |
0,1544 |
0,1490 |
0,1569 |
0,1589 |
0,1265 |
0,1490 |
0,1544 |
0,1490 |
0,2216 |
0,1638 |
0,1863 |
0,1787 |
0,1323 |
0,1390 |
0,1314 |
0,1638 |
0,2206 |
0,1936 |
0,3402 |
0,3277 |
0,1618 |
0,1539 |
0,1936 |
0,1738 |
0,1274 |
0,1638 |
0,1814 |
0,1986 |
0,1985 |
0,1986 |
0,2098 |
0,2036 |
0,1961 |
0,2234 |
0,0774 |
0,1390 |
0,1569 |
0,1589 |
0,1814 |
0,1638 |
0,1691 |
0,1688 |
0,1544 |
0,1638 |
0,0966 |
0,1787 |
0,1657 |
0,1589 |
0,1716 |
0,1688 |
Алгоритм формирования, обучения и использования НС в среде MatLab.
% Kohonen
%Задаем входной вектор. Его размерность равна двум, так как при
%исследовании рынка недвижимости мной были выделены два параметры для
%кластеризации квартир - цена и площадь.
p=[0.1813 0.1593 0.2166 0.1568 0.1544 0.1862 0.1313 0.3401 0.1936 0.1813 0.2097 0.0774 0.1813 0.1544 0.1656 0.318613211088768 0.072545777294058 0.154404863835326 0.126464936093696 0.22155872524942 0.132347026144565 0.220578376907609 0.161757476398913 0.127445284435507 0.198520539216848 0.196069668362319 0.156855734689855 0.1691100889625 0.0965643116684421 0.171560959817029;
0.163846888991432 0.163846888991432 0.198602289686584 0.158881831749267 0.148951717264938 0.178742060717926 0.163846888991432 0.327693777982864 0.173777003475761 0.198602289686584 0.203567346928749 0.139021602780609 0.163846888991432 0.163846888991432 0.158881831749267 0.297903434529876 0.114196316569786 0.148951717264938 0.148951717264938 0.163846888991432 0.139021602780609 0.193637232444419 0.153916774507103 0.163846888991432 0.198602289686584 0.223427575897407 0.158881831749267 0.168811946233596 0.178742060717926 0.168811946233596];
%Задаем слой Кохонена
n=newc(minmax(p), 2);
%Обучаем сеть
n=train(n,p);
%и имитируем ее работу
L=vec2ind(sim(n,p))
k=sim(n,p);
%Строим график
plotpv(p,k);
hold on
%Тестируем сеть на 10 произвольных точках
A=[0.25; 0.33];
t=sim(n,A);
K=vec2ind(sim(n,A))
B=[0.10; 0.023];
t2=sim(n,B);
W=vec2ind(sim(n,B))
C=[0.112; 0.172];
t3=sim(n,C);
M=vec2ind(sim(n,C))
D=[0.04; 0.579];
t4=sim(n,D);
N=vec2ind(sim(n,D))
E=[0.20; 0.123];
t5=sim(n,E);
O=vec2ind(sim(n,E))
F=[0.298; 0.192];
t6=sim(n,F);
P=vec2ind(sim(n,F))
G=[0.289; 0.100];
t7=sim(n,G);
Q=vec2ind(sim(n,G))
H=[0.189; 0.112];
t8=sim(n,O8);
R=vec2ind(sim(n,O8))
I=[0.201; 0.107];
t9=sim(n,I);
S=vec2ind(sim(n,I))
J=[0.133; 0.167];
t10=sim(n,J);
U=vec2ind(sim(n,J))
%Выписываем веса(ядра классов) и смещения между слоями
n.iw{1}
n.b{1}
%Сеть построена, обучена, протестирована и готова к использованию
Изобразим графически НС с ее параметрами.
5,4162
Х1
Х2
С1
С2
0,1358 У1
0,2109 0,1533
У2
0,2028
5,4571
Ядра классов являются весовыми коэффициентами нейронов. Каждый нейрон Кохонена запоминает одно ядро класса, и отвечает за определение объектов в своем классе, т.е. величина выхода нейрона тем больше, чем ближе объект к данному ядру класса. В данном случае величина весов составляют 5,4162 и 5,4571 соответственно, что говорит о достаточной близости объектов к ядру.
Задание 2. МОДЕЛИРОВАНИЕ СМО В ПАКЕТЕ ARENA
Построенная по условию задачи модель в пакете Arena имеет следующий вид.
Описание модели
Create задаем:
Batch size = 1 (поступление заявок)
First creation=0 (стартовое время)
Interval=EXPO(10) (интервал между заявками)
Branch вероятностные требования к модели:
With 0.4,– заявки 1-го типа;
With 0.6,– заявки 2-го типа.
Макс. Количество ветвей= 2.
Assign атрибуты:
Obsl_timе=UNIF(2,6), Control_time = TRIA(2,4,6) (1типа); Obsl_timе= UNIF(1.5,4.5), Control_time = UNIF(1.5,4.5) (2 тип), Obsl_timе – время обслуживания заявки, Control_time – время технического контроля.
detali, Value=1 – заявки 1 типа, detali,Value =2 – заявки 2 типа.
Branch условие чистки сверлильного станка (If MOD(kol_brak,20).EQ.0 – после накопления 20 плохих деталей станок подвергается чистке). Else станок продолжает работу, детали идут в очередь - Queue с параметром Lathe_Q.
If во 2-м блоке Branch - чистка, которая осуществляется - Alter-Delay-Alter.
Alter - остановка stanok, мощность=нулю.
Delay – чистка, 20 минут.
2-м блок Alter станок запускается, мощн=един., отправляем станок на обслуживание поступающих заявок в Queue с параметром Lathe_Q.
Queue задана очередь Lathe_Q, где накапливается очередь, пока станок не станет доступным. Площадка перед станком вмещает не более 5-ти деталей. Если детали вмещаются на площадке, то они - в Seize для их дальнейшего обслуживания. В противном случае – отказ, и в блок Count с идентификатором счетчика kol_otkaz, равный единице, Dispose (уход заявок, получивших отказ).
Seize (захват ресурса) параметра - stanok и его допустимое количество равно 1 станку.
Delay - обслуживание заявки с помощью атрибута Proc_time.
Release освободили один ресурс stanok.
Queue задаем очередь Lathe_control, накапливаются детали, ожидающие контроля.
Технический контроль
Seize параметр модуля - rabotnik, который проводит контроль один.
Delay описываем время контроля станка, атрибут time_control.
Release - освободили один ресурс rabotnik.
Tally - подсчет статистики по среднему времени контроля в системе time_in_system_control, Value: INTERVAL(time_control_tally), time_control_tally – атрибут, описанный в элементе Attributes, и указываем в блоке Seize, параметр - rabotnik, в поле - time_control_tally.
Branch - смоделировано вероятностное условие работы станка:
With 0.1 - 10% деталей дефектны;
With 0.9 - 90% деталей качественные.
Count, счетчик - kol_brak
Dispose, выводит брак из системы.
Branch условие:
If detali.EQ.1, деталь 1 типа, подсчет в Count, где задан счетчик detali1, равный единице.
If detali.EQ.2, деталь 2 типа, подсчет в Count, где задан detali2.
Max Number of Branches = 2.
Dispose смоделирован уход требований из системы.
Элементы
Attributes – задание атрибута модели detali, Obsl_timе, Control_time, time_control_tally.
Resources – ресурсы stanok, rabochij. Stanok используется по своей мощности (Capacity = 1, так как станок один), rabochij существует определенное расписание в элементе Schedules.
Counters – счетчики detalil, detali2, kol_brak, kol_otkaz.
Replicate – условие прогона – 1440 минут (24 часа).
Queues – инициализация очередей Lathe_Q, Lathe_control.
Tallies – идентификатор для счетного блока в системе time_in_system_control.
Dstats – использование системных переменных для подсчета статистики NQ(Lathe_Q), NQ(Lathe_control) и NR(stanok), NR(rabochij).
Schedules – элемент, используемый для изменения мощности ресурса.
Задание 3. ИСПОЛЬЗОВАНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ ДЛЯ РЕШЕНИЯ ЗАДАЧИ КОММИВОЯЖЕРА
Решение задачи о коммивояжере сводится к нахождению такого пути, который приведет к минимальным денежным затратам или имеет минимальную длину. Решение задачи было найдено в программе MatLab с использованием генетических алгоритмов.
%Задаем количество городов
cities = 10;
%Выписываем их координаты
locations =[ 44.56 34.06;
44.40 34.23;
44.45 33.51;
45.42 34.23;
45.12 33.21;
45.20 36.28;
44.36 33.32;
45.02 35.22;
44.29 34.09;
44.51 34.58];
%Строим график по исходным координатам
plot(locations(:,1),locations(:,2),'bo');
%Подписываем точки
text(44.56,34.06,'Simf')
text(44.40,34.23,'Alush')
text( 44.45, 33.51,'Bakh')
text(45.42, 34.23,'Dzhan')
text(45.12, 33.21,'Evpat')
text(45.20, 36.28,'Kerch')
text(44.36, 33.32,'Sevast')
text(45.02, 35.22,'Feodosia')
text(44.29, 34.09,'Jal')
text(44.51, 34.58,'Sud');
%Задаем формулу расчета расстояния между двумя городами
distances = zeros(cities);
for count1=1:cities,
for count2=1:count1,
x1 = locations(count1,1);
y1 = locations(count1,2);
x2 = locations(count2,1);
y2 = locations(count2,2);
distances(count1,count2)=sqrt((x1-x2)^2+(y1-y2)^2);
distances(count2,count1)=distances(count1,count2);
end;
end;
%Вводим генетические алгоритмы: создаем новое поколение, применив кроссовер и мутацию
type create_permutations.m
type crossover_permutation.m
type mutate_permutation.m
%Вводим дополнительную функцию коммивояжера, которая рассчитает оптимальную длину пути
type traveling_salesman_fitness.m
%Вводим новую функцию, которая поможет захватить информацию о расстояниях между городами
%distances defined earlier
FitnessFcn = @(x) traveling_salesman_fitness(x,distances);
%Новый график будет визуализировать решение задачи
type traveling_salesman_plot.m
%Oбъединим графики в один
%locations defined earlier
my_plot = @(options) traveling_salesman_plot(options);
options = gaoptimset('PopulationType', 'custom','PopInitRange', ...
[1;cities]);
options = gaoptimset(options,'CreationFcn',@create_permutations, ...
'CrossoverFcn',@crossover_permutation, ...
'MutationFcn',@mutate_permutation, ...
'Generations',500,'PopulationSize',60, ...
'StallGenLimit',200,'Vectorized','on');
%Выводим необходимую для нас информацию
numberOfVariables = cities;
[x,fval,reason,output] = ga(FitnessFcn,numberOfVariables,options)
x = [1x10 double]
fval = 7.3741
reason = 1
output =
problemtype: 'unconstrained'
rngstate: [1x1 struct]
generations: 201
funccount: 12120
message: [1x86 char]
График