Четверта лабораторна робота - доволі проста, але якщо раптом її комусь складно реалізувати, то ось вона тут її реалізація:
Код:
%#> Lab#4_Sheremeta variant #2
function Lab4_Sheremeta
%-> input data
l = 5; Tmin = 45; Tmax = 165; lambdaMin = 2; lambdaMax = 6; Vmin = 10; Vmax = 50; N = 100;
% N - amount of abonents (from Lab#3)
% lambdaMin and lambdaMax - call admission intensity in hour of greatest load
%-> building factor space
lambda = lambdaMin:(lambdaMax - lambdaMin)/(l - 1):lambdaMax;
V = Vmin:(Vmax - Vmin)/(l - 1):Vmax;
T = Tmin:(Tmax - Tmin)/(l - 1):Tmax;
%-> full factorial experiment
results = zeros(5, 5, 5); % will contain call losses in percentages
for i = lambda
for j = T
for k = V
results(T == j, V == k, lambda == i) = firstErlang(i*j*N/3600, k)*100;
end
end
end
% charting results
figure(1); % when surf - x is columns, y is rows
view(-35, 35); % view(az, el)
hold on;
grid on;
title('Full factorial experiment');
xlabel('Amount of service units');
ylabel('Call duration, s');
zlabel('Call losses, %');
colors = ['r', 'b', 'g', 'y', 'm'];
theLegend = [];
for i = 1:length(lambda)
surface(V, T, results(:, :, i), 'FaceColor', colors(i), 'FaceAlpha', .7);
theLegend = [theLegend; ['\lambda = ', num2str(lambda(i)), ' call/h']];
end
legend(theLegend);
%-> latin square experiment
% building square
square = zeros(length(T), length(V));
for i = 1:length(T)
square(i, :) = circshift(lambda, [0, -i + 1]);
end
% calculations and charting results
figure(2);
view(65, 35); % view(az, el)
hold on;
grid on;
losses = zeros(length(T), length(V));
for i = 1:size(square, 1)
for j = 1:length(V)
losses(i, j) = firstErlang(T(i)*square(i, j)*N/3600, V(j))*100;
text(V(j), T(i), losses(i, j), [' \lambda = ', num2str(square(i, j))],...
'Color', 'r', 'FontSize', 12, 'FontWeight', 'bold');
end
end
title('Latin square experiment');
xlabel('Amount of service units');
ylabel('Call duration, s');
zlabel('Call losses, %');
xlim([min(V)*.8, max(V)*1.2]);
ylim([min(T)*.5, max(T)*1.2]);
surf(V, T, losses, 'FaceColor', 'g', 'FaceAlpha', .7, 'EdgeColor', 'b',...
'Marker', 'o', 'MarkerFaceColor', 'b', 'MarkerSize', 5);
%-> random assignment experiment (25 experiments)
% building matrix with random indexes where rows represents number of experiment and columns represents
% call admission intensity, call duration and amount of service units respectively
randomIndexes = round(unifrnd(1, l, 25, 3));
% calculations and charting results
figure(3);
view(35, 15); % view(az, el)
hold on;
grid on;
for i = 1:25
loss = firstErlang(lambda(randomIndexes(i, 1))*T(randomIndexes(i, 2))*N/3600, V(randomIndexes(i, 3)))*100;
text(V(randomIndexes(i, 3)), T(randomIndexes(i, 2)), loss, [' \lambda = ', num2str(lambda(randomIndexes(i, 1)))],...
'Color', 'r', 'FontSize', 12);
plot3(V(randomIndexes(i, 3)), T(randomIndexes(i, 2)), loss, 'ko', 'MarkerFaceColor', 'k', 'MarkerSize', 5);
hold on
end
title('Random assignment experiment (25 experiments)');
xlabel('Amount of service units');
ylabel('Call duration, s');
zlabel('Call losses, %');
%-> single factor change experiment
% calculations and charting results
losses = zeros(1, length(V));
for i = 1:length(V)
losses(i) = firstErlang(lambda(1)*T(1)*N/3600, V(i))*100;
end
figure('Name','Single Factor Change Experiment', 'NumberTitle','off');
subplot(2, 2, 1);
plot(V, losses, 'LineWidth', 2, 'Color', 'r');
title(['losses = f(V), T = ', num2str(T(1)), ' s, \lambda = ', num2str(lambda(1)), ' c/h']);
xlabel('Amount of service units');
ylabel('Call losses, %');
grid on;
losses = zeros(1, length(V));
for i = 1:length(T)
losses(i) = firstErlang(lambda(1)*T(i)*N/3600, V(1))*100;
end
subplot(2, 2, 2);
plot(T, losses, 'LineWidth', 2, 'Color', 'r');
title(['losses = f(T), V = ', num2str(V(1)), ', \lambda = ', num2str(lambda(1)), ' c/h']);
xlabel('Call duration, s');
ylabel('Call losses, %');
grid on;
losses = zeros(1, length(V));
for i = 1:length(lambda)
losses(i) = firstErlang(lambda(i)*T(1)*N/3600, V(1))*100;
end
subplot(2, 2, 3);
plot(lambda, losses, 'LineWidth', 2, 'Color', 'r');
title(['losses = f(\lambda), T = ', num2str(T(1)), ' s, V = ', num2str(V(1))]);
xlabel('Call admission intensity, call/h');
ylabel('Call losses, %');
grid on;
end
function loss = firstErlang(Y, V)
i = 0:V;
loss =(Y^V/factorial(V))/sum(Y.^i./factorial(i));
end
Фактично я трохи схалявив використавши першу формулу Ерланга, але сама суть планування модельних експерементів тут має бути висвітленна коректно. А якщо для когось це дуже критично, то ви завжди зможете замінити першу формулу Ерланга на істинне моделювання.
Для незнаючих - істинне моделювання дивіться в третій лабораторній роботі, моя її реалізація є
тут.P.S. Ну от і все, як я казав п'ята робота на вашій совісті.
P.S.S. Всім бажаю успіхів, не втрачати натхнення, та завжди бути спарглим до знань.