forum.vnstele.com
http://forum.vnstele.com/

Лабораторна робота №3 - Методи управління модельним часом
http://forum.vnstele.com/viewtopic.php?f=13&t=19
Сторінка 1 з 1

Автор:  Filizar [ 28 лютого 2011, 19:17 ]
Тема повідомлення:  Лабораторна робота №3 - Методи управління модельним часом

Чи можна отримати код до третьої лабораторної роботи в електронному вигляді?

Автор:  echern [ 28 лютого 2011, 21:51 ]
Тема повідомлення:  Re: Лабораторна робота №3 - Методи управління модельним часо

Filizar написав:
Чи можна отримати код до третьої лабораторної роботи в електронному вигляді?

Відписав в приват.

Автор:  ascentman [ 28 березня 2013, 16:01 ]
Тема повідомлення:  Re: Лабораторна робота №3 - Методи управління модельним часо

Євген Михайлович, скажіть будь-ласка чи є на сайті ".m-файли" до лабораторної роботи №3 - просто я переглянув весь форум і не знайшов. Якщо можна, закиньте його сюди для охочих студентів :ugeek:

Автор:  echern [ 29 березня 2013, 19:48 ]
Тема повідомлення:  Re: Лабораторна робота №3 - Методи управління модельним часо

Охочому студенту закинув в ПП, користуйтеся ;-)

Автор:  ascentman [ 29 березня 2013, 20:13 ]
Тема повідомлення:  Re: Лабораторна робота №3 - Методи управління модельним часо

echern написав:
Охочому студенту закинув в ПП, користуйтеся ;-)

дякую :mrgreen:

Автор:  Mykola Sheremeta [ 19 червня 2014, 01:12 ]
Тема повідомлення:  Re: Лабораторна робота №3 - Методи управління модельним часо

Ура, третя лабораторна робота, як на мене то вона виявилась найцікавішою і найскладнішою (помимо п'ятої).
Ось її реалізаця:
Код:
%#> Lab#3_Sheremeta

function Lab3_Sheremeta

%-> input data
amountOfServiceUnits = 70;
N = 100; % amount of abonents
lambda = 12.5; % call admission intensity
mu = 180; % average call duration, s
Tmod = 4; % duration of the simulation, h

%-> generating traffic
[admissionMoments, endMoments] = trafficGenerator(N, lambda, mu, Tmod);

%-> modeling with fixed step
tic;
disp('-> Traffic modeling with fixed step');
[steps, amountOfCallsInSystem, losses] = fixedStepModelling(admissionMoments, endMoments, amountOfServiceUnits);
fprintf('\tLosses = %3.3f percent\n', losses/(length(admissionMoments)/100));

% charting results for modeling with fixed step
figure(1);
plot(steps, amountOfCallsInSystem, 'r');
grid on;

% plot setting
title('Traffic modeling with fixed step');
xlabel('Time, s');
ylabel('Amount of calls in system');
ylim([min(amountOfCallsInSystem), max(amountOfCallsInSystem)*1.1]);

elapsedTime = toc;
fprintf('\tElapsed time for modeling with fixed step equals %f\n\n', elapsedTime);

%-> modeling with special condition step
tic;
disp('-> Traffic modeling with special condition step');
[steps, amountOfCallsInSystem, losses] = specialConditionStepModeling(admissionMoments, endMoments, amountOfServiceUnits);
fprintf('\tLosses = %3.3f percent\n', losses/(length(admissionMoments)/100));

% charting results for modeling with special condition step
figure(2);
plot(steps, amountOfCallsInSystem, 'b');
grid on;

% plot setting
title('Traffic modeling with special condition step');
xlabel('Time, s');
ylabel('Amount of calls in system');
ylim([min(amountOfCallsInSystem), max(amountOfCallsInSystem)*1.1]);

elapsedTime = toc;
fprintf('\tElapsed time for modeling with special condition step equals %f\n\n', elapsedTime);

givenLosses = 0.2;

% -> finding amount of service untits to satisfy given losses using modeling with fixed step
for amountOfServiceUnits = 1:ceil(N*lambda*mu/3600)
    [steps, amountOfCallsInSystem, losses] = fixedStepModelling(admissionMoments, endMoments, amountOfServiceUnits);
    if losses/length(admissionMoments) <= givenLosses
        fprintf('-> Amount of service untits to satisfy given losses evaluated by using modeling with fixed step equals %d\n', amountOfServiceUnits);
        break;
    end
end

% -> finding amount of service untits to satisfy given losses using modeling with special condition step
for amountOfServiceUnits = 1:ceil(N*lambda*mu/3600)
    [steps, amountOfCallsInSystem, losses] = specialConditionStepModeling(admissionMoments, endMoments, amountOfServiceUnits);
    if losses/length(admissionMoments) <= givenLosses
        fprintf('-> Amount of service untits to satisfy given losses evaluated by using modeling with special condition step equals %d\n', amountOfServiceUnits);
        break;
    end
end

% -> finding amount of service untits to satisfy given losses using first Erlang formula
losses = firstErlang(N*lambda*mu/3600, ceil(N*lambda*mu/3600));
for i = 1:length(losses)
    if losses(i) <= givenLosses
        fprintf('-> Amount of service untits to satisfy given losses evaluated by using first Erlang formula equals %d\n', i - 1);
        break;
    end
end

end

function [steps, amountOfCallsInSystem, losses] = fixedStepModelling(admissionMoments, endMoments, amountOfServiceUnits)

step = 1.5; % awesome hardcode=)
steps = step:step:ceil(max(endMoments)/step)*step;
amountOfCallsInSystem = zeros(1, length(steps)); % array with amountOfCallsInSystem per step
losses = 0;

currentCalls = []; % [endOfCall1, ..., endOfCallN]
callIndex = 1;
iteration = 0;

for step = steps
   
    iteration = iteration + 1;
   
    currentCalls(currentCalls <= step) = [];
   
    while(callIndex <= length(admissionMoments) && admissionMoments(callIndex) <= step)
        if length(currentCalls) < amountOfServiceUnits
            currentCalls(end + 1) = endMoments(callIndex);
        else
            losses = losses + 1;
        end
        callIndex = callIndex + 1;
    end

    amountOfCallsInSystem(iteration) = length(currentCalls);
end

end

function [steps, amountOfCallsInSystem, losses] = specialConditionStepModeling(admissionMoments, endMoments, amountOfServiceUnits)

steps = sort([admissionMoments, endMoments]);
amountOfCallsInSystem = zeros(1, length(steps)); % array with amountOfCallsInSystem per step
losses = 0;

currentCalls = []; % [endOfCall1, ..., endOfCallN]
callIndex = 1;
iteration  = 0;

for step = steps
   
    iteration = iteration + 1;

    currentCalls(currentCalls == step) = [];
         
    if callIndex <= length(admissionMoments) && admissionMoments(callIndex) == step
        if length(currentCalls) < amountOfServiceUnits
            currentCalls(end + 1) = endMoments(callIndex);
        else
            losses = losses + 1;
        end
        callIndex = callIndex + 1;
    end

    amountOfCallsInSystem(iteration) = length(currentCalls);
   
end

end

function losses = firstErlang(Y, V) % returns array of losses for V = 0:V accordingly

losses = zeros(1, V + 1);

for v = 0:V
    temp = zeros(1, v + 1);
    for k = 0:v
        if k == 0
            erlang = (Y^k)/factorial(k);
        else
            erlang = (erlang*Y)/k;
        end
        temp(k + 1) = erlang;
    end
    losses(v + 1) = temp(v + 1)/sum(temp);
end

end

function [admissionMoments, endMoments] = trafficGenerator(N, lambda, mu, Tmod)

% N - amount of abonents
% lambda - call admission intensity in hour of greatest load
% mu - average call duration, s
% Tmod - duration of the simulation, h

admissionMoments = zeros(1, ceil(Tmod*lambda*N));

% R = exprnd(mu) generates random numbers from the exponential distribution with mean parameter mu
temp = exprnd(1/(lambda/3600*N), 1, ceil(Tmod*lambda*N));
temp = temp*((Tmod*3600)/sum(temp));

for i = 1:length(temp)
    admissionMoments(i) = sum(temp(1:i));
end

% R = poissrnd(lambda) generates random numbers from the Poisson distribution with mean parameter lambda
endMoments = admissionMoments + poissrnd(mu, 1, ceil(Tmod*lambda*N));

end


P.S. Якшо чесно дуже крута лабораторна робота - в процесі її написання стикався зі всякими пріколами які на перший погляд є не джуе очевидними.
P.S.S. Бажаю всім успіхів в здачі цієї лабораторної роботи)

Автор:  echern [ 20 червня 2014, 19:12 ]
Тема повідомлення:  Re: Лабораторна робота №3 - Методи управління модельним часо

Дякую, зразу видно, що ви самі виконували роботу ;-)
Пізніше перегляну в матлабі детальніше.
Цікаво було б ще згадані приколи побачити ...

Сторінка 1 з 1 Часовий пояс UTC + 2 годин [ DST ]
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/