您现在的位置:首页 >> 技术文章 >> MATLAB技术 >> 内容

MATLAB代做|FPGA代做-基于排队理论的云计算模型的MATLAB仿真

时间:2022/3/15 3:19:19 点击:

  核心提示:MATLAB代做|FPGA代做-基于排队理论的云计算模型的MATLAB仿真...
clc;
clear;
close all;
warning off;
 
%仿真参数的初始化
SIMU_NUM         = 40;    %对于每次仿真的次数,使用蒙特卡洛的仿真思想进行,对多次结果进行求平均
SIMU_TIME        = 50;    %每次模拟的仿真时间
 
%FIFO仿真参数初始化
FIFO_DEPTH       = 200;   %FIFO的深度
Package_Arrival  = 100;   %数据包的达到时间分别参数
Package_All_Num  = 10000; %仿真中数据包的总个数
 
%整个系统满足如下的结构
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%            _________                                                    %
%           |         |      _________                                    %
%           |         |     |         |                                   %
%Package -->|  FIFO   | --> |  Server | --> Package Out                   %
%           |         |     |_________|                                   %
%           |_________|                                                   %
%                                                                         %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
for KK = 1:SIMU_NUM
 
    RandStream.setDefaultStream(RandStream('mt19937ar','seed',KK));
    
    fprintf('Simulation Times: %d\n\n',KK);
    
    %系统时钟计数器
    CNT = 0;    
    
    %每个数据包的信息
    Package_Infor      = []; 
    %1:数据包到达的时间
    %2:数据被处理所需要的时间
    %3:数据包等待的时间,即在FIFO中的时间
    %4:数据包离开的时间
    %5:记录数据包的Index
    
 
    %Package_Infor:1
    %利用泊松分布随机产生数据包的到达时刻
    Package_Infor(1,:) = random('poiss',Package_Arrival,Package_All_Num,1); 
    Package_Infor(1,:) = Package_Infor(1,:)/9000;
    %在处理时间上,采用累加方式,来表示实际中每个时刻达到的累加设计
    Package_Infor(1,:) = cumsum(Package_Infor(1,:));
    
    
    %Package_Infor:2
    %利用指数分布随机产生数据包的到达时刻
    for i = 1:Package_All_Num/50
        %处理等待时间
        Package_Server(i)                  = 60 + 100*rand(1,1);
        %按负指数分布产生各顾客服务时间
        Package_Infor(2,50*(i-1)+1:50*i) = exprnd(1/Package_Server(i),1,50); 
    end
    Package_Infor(2,:)=Package_Infor(2,:);
 
    %Package_Infor中的其余三个参数在循环仿真中进行赋值处理
    %Package_Infor中的其余三个参数在循环仿真中进行赋值处理
    for i=1 : Package_All_Num
        
        CNT = CNT + 1;        
 
        %第一个数据作为特殊情况进行单独处理
        if i == 1
            
           %Package_Infor:3
           %第一个数据包进入FIFO的时候,不需要等待过程,直接进行处理
           Package_Infor(3,1) = 0;
           
           %Package_Infor:4
           %第一个数据包的离开时间 = 到达时间 + 被处理所需要的时间
           Package_Infor(4,1) = Package_Infor(1,1) + Package_Infor(2,1);
           
           %Package_Infor:5
           %此时,FIFO中仅有一个数据包,所以其标志自动记录为1
           Package_Infor(5,1) = 1;
           Package_Index      = [1];
 
        else
 
            %如果某一时刻进入FIFO的数据包在被推入到FIFO缓冲区的最后一位的时候,仍然处于等待状态,那么这个数据
            %将被新进入FIFO的数据退出FIFO
            
            if Package_Infor(1,i) > FIFO_DEPTH
               %这种情况下,FIFO中的数据包个数为满状态,即:
               FIFO_DATA(CNT) = FIFO_DEPTH;
               break;
 
            else
                
                %如果当前状态下,数据包离开的时间 > 数据包到达的时间
                %这说明数据进入的速度大于数据离开的速度
                %统计这种情况的个数
                Is_Full  = sum( Package_Infor(4,Package_Index) > Package_Infor(1,i) );
 
                %Is_Full  > FIFO_DEPTH,这说明FIFO溢出,那么当前的数据包将会被丢弃
                if Is_Full  > FIFO_DEPTH
 
                   FIFO_DATA(CNT)     = FIFO_DEPTH; 
                   Package_Infor(5,i) = 0;
                end
                %Is_Full  == 0 这种情况说明FIFO可以正常的处理来到的数据包
                if Is_Full  == 0
                   %数据包不需要等待
                   Package_Infor(3,i) = 0;
                   %数据包的离开时间 = 数据包到达时间 + 数据包的被处理时间
                   Package_Infor(4,i) = Package_Infor(1,i) + Package_Infor(2,i);
                   Package_Infor(5,i) = 1;
                   %将当前的数据包的标签推入到Package_Index保存
                   Package_Index      = [Package_Index,i];
                end
                
                %Is_Full  > 0 & Is_Full  < FIFO_DEPTH这种情况下,FIFO非空也非满
                if Is_Full  > 0 & Is_Full  < FIFO_DEPTH
                    
                   Num_FIFO_Package   = length(Package_Index);
 
                   %当前Package的等待时间 = 前一个包的离开时间 - 当前数据包的达到时间
                   Package_Infor(3,i) = Package_Infor(4,Package_Index(Num_FIFO_Package))-Package_Infor(1,i);
                    
                   %当前Package的离开时间 = 前一个包的离开时间 + 当前数据包的处理时间
                   Package_Infor(4,i) = Package_Infor(4,Package_Index(Num_FIFO_Package))+Package_Infor(2,i);
                   
                   %统计当前时刻FIFO中的数据包的个数
                   Package_Infor(5,i) = Is_Full  +1;
                    
                   Package_Index      = [Package_Index,i];
                end
                
                FIFO_DATA(CNT) = Package_Infor(5,i);
                
            end%end of if Package_Infor(1,i) > FIFO_DEPTH
 
        end%end of if i == 1
 
    end%end of for i=1 : Package_All_Num
 
    Package_Infor_Montecarlo{KK}    = Package_Infor;
    Package_Index_Montecarlo{KK}    = Package_Index;
    FIFO_DATA_Montecarlo{KK}        = FIFO_DATA;
end%end of for KK = 1:SIMU_NUM
 
Num_FIFO_Package = length(Package_Index);
 
 
 
%显示某一次的仿真结果
%显示某一次的仿真结果
 
 
 
figure
subplot(121);
plot([0 Package_Infor(1,Package_Index)],0:Num_FIFO_Package);
hold on;
plot([0 Package_Infor(4,Package_Index)],0:Num_FIFO_Package,'r-.');
hold off;
xlabel('The time');
ylabel('The Package');
legend('到达时间','离开时间');
grid on;
axis square;
title('显示某一次的仿真结果');
 
 
subplot(122);
plot([0 Package_Infor(1,Package_Index)],0:Num_FIFO_Package);
hold on;
plot([0 Package_Infor(4,Package_Index)],0:Num_FIFO_Package,'r-.');
hold off;
axis([40,45,3500,4000]);
xlabel('The time');
ylabel('The Package');
legend('到达时间(局部显示效果)','离开时间(局部显示效果)');
grid on;
axis square;
title('显示某一次的仿真结果');
 
figure;
subplot(121);
plot(1:Num_FIFO_Package,Package_Infor(3,Package_Index),'r-*');
hold on;
plot(1:Num_FIFO_Package,Package_Infor(2,Package_Index)+Package_Infor(3,Package_Index),'k-');
hold off;
legend('等待时间','处理所需要的时间');
grid on;
axis square;
title('显示某一次的仿真结果');
 
subplot(122);
plot(1:Num_FIFO_Package,Package_Infor(3,Package_Index),'r-*');
hold on;
plot(1:Num_FIFO_Package,Package_Infor(2,Package_Index)+Package_Infor(3,Package_Index),'k-');
hold off;
axis([4000,4200,0,1.2*max(Package_Infor(3,4000:4200))]);
legend('等待时间(局部显示效果)','处理所需要的时间(局部显示效果)');
grid on;
axis square;
title('显示某一次的仿真结果');
 
%绘制每一个时刻下,FIFO中的数据包的数量q(t)的函数变化
figure;
subplot(211);
bar(FIFO_DATA);
grid on;
legend('Q(t)整体显示效果');
axis([1,10000,0,1.2*max(FIFO_DATA)]);
title('显示某一次的仿真结果');
subplot(212);
bar(FIFO_DATA);
grid on;
legend('Q(t)局部显示效果');
axis([4000,4050,0,1.2*max(FIFO_DATA(4000:4050))]);
title('显示某一次的仿真结果');
 
%比较最开始每个包之间的时间,和经过buffer还有traffic影响之后到达的每个包之间的时间差。
figure
plot(0:Num_FIFO_Package,[0 abs(Package_Infor(1,Package_Index)-Package_Infor(4,Package_Index))]);
ylabel('The time');
xlabel('The Package');
legend('时间差');
grid on;
 
title('显示某一次的仿真结果');
 
 
 
 
 
%显示整体的平均效果
%显示整体的平均效果
%首先计算平均值
for i = 1:size(Package_Infor,1)
    for j = 1:size(Package_Infor,2)
        for m = 1:SIMU_NUM
            tmps1(i,j,m) = Package_Infor_Montecarlo{m}(i,j); 
        end
    end
end
Package_Infor_Montecarlo_avg = zeros(size(Package_Infor,1),size(Package_Infor,2));
for j = 1:size(Package_Infor,2)
    Package_Infor_Montecarlo_avg(1,j) = mean(tmps1(1,j,:));
    Package_Infor_Montecarlo_avg(2,j) = mean(tmps1(2,j,:));
    Package_Infor_Montecarlo_avg(3,j) = mean(tmps1(3,j,:));
    Package_Infor_Montecarlo_avg(4,j) = mean(tmps1(4,j,:));
    Package_Infor_Montecarlo_avg(5,j) = mean(tmps1(5,j,:));    
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i = 1:length(Package_Index)
    for m = 1:SIMU_NUM
        tmps2(i,m) = Package_Index_Montecarlo{m}(i); 
    end
end
for i = 1:length(Package_Index)
    Package_Index_Montecarlo_avg(i) = mean(tmps2(i,:));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i = 1:length(FIFO_DATA)
    for m = 1:SIMU_NUM
        tmps3(i,m) = FIFO_DATA_Montecarlo{m}(i); 
    end
end
for i = 1:length(FIFO_DATA)
    FIFO_DATA_Montecarlo_avg(i) = mean(tmps3(i,:));
end
 
 
 
 
 
 
figure
subplot(121);
plot([0 Package_Infor_Montecarlo_avg(1,Package_Index_Montecarlo_avg)],0:Num_FIFO_Package);
hold on;
plot([0 Package_Infor_Montecarlo_avg(4,Package_Index_Montecarlo_avg)],0:Num_FIFO_Package,'r-.');
hold off;
xlabel('The time');
ylabel('The Package');
legend('到达时间','离开时间');
grid on;
axis square;
title('显示整体的平均效果');
 
 
subplot(122);
plot([0 Package_Infor_Montecarlo_avg(1,Package_Index_Montecarlo_avg)],0:Num_FIFO_Package);
hold on;
plot([0 Package_Infor_Montecarlo_avg(4,Package_Index_Montecarlo_avg)],0:Num_FIFO_Package,'r-.');
hold off;
axis([40,45,3500,4000]);
xlabel('The time');
ylabel('The Package');
legend('到达时间(局部显示效果)','离开时间(局部显示效果)');
grid on;
axis square;
title('显示整体的平均效果');
 
figure;
subplot(121);
plot(1:Num_FIFO_Package,Package_Infor_Montecarlo_avg(3,Package_Index_Montecarlo_avg),'r-*');
hold on;
plot(1:Num_FIFO_Package,Package_Infor_Montecarlo_avg(2,Package_Index_Montecarlo_avg)+Package_Infor_Montecarlo_avg(3,Package_Index_Montecarlo_avg),'k-');
hold off;
legend('等待时间','处理所需要的时间');
grid on;
axis square;
title('显示整体的平均效果');
 
subplot(122);
plot(1:Num_FIFO_Package,Package_Infor_Montecarlo_avg(3,Package_Index_Montecarlo_avg),'r-*');
hold on;
plot(1:Num_FIFO_Package,Package_Infor_Montecarlo_avg(2,Package_Index_Montecarlo_avg)+Package_Infor_Montecarlo_avg(3,Package_Index_Montecarlo_avg),'k-');
hold off;
axis([4000,4200,0,1.2*max(Package_Infor_Montecarlo_avg(3,4000:4200))]);
legend('等待时间(局部显示效果)','处理所需要的时间(局部显示效果)');
grid on;
axis square;
title('显示整体的平均效果');
 
%绘制每一个时刻下,FIFO中的数据包的数量q(t)的函数变化
figure;
subplot(211);
bar(FIFO_DATA_Montecarlo_avg);
grid on;
legend('Q(t)整体显示效果');
axis([1,10000,0,1.2*max(FIFO_DATA_Montecarlo_avg)]);
title('显示整体的平均效果');
subplot(212);
bar(FIFO_DATA_Montecarlo_avg);
grid on;
legend('Q(t)局部显示效果');
axis([4000,4050,0,1.2*max(FIFO_DATA_Montecarlo_avg(4000:4050))]);
title('显示整体的平均效果');
 
 
%比较最开始每个包之间的时间,和经过buffer还有traffic影响之后到达的每个包之间的时间差。
figure
plot(0:Num_FIFO_Package,[0 abs(Package_Infor_Montecarlo_avg(1,Package_Index_Montecarlo_avg)-Package_Infor_Montecarlo_avg(4,Package_Index_Montecarlo_avg))]);
ylabel('The time');
xlabel('The Package');
legend('时间差');
grid on;
 
title('显示某一次的仿真结果');
————————————————
 

作者:排队理论 来源:排队理论
  • 您是如何找到本站的?
  • 百度搜索
  • Google搜索
  • 查阅资料过程中
  • 论坛发现
  • 百度贴吧发现
  • 朋友介绍
本站最新成功开发工程项目案例
相关文章
  • 没有相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
  • matlab代做|matlab专业代做|matlab淘宝代做|FPGA项目合作(www.hslogic.com) © 2022 版权所有 All Rights Reserved.
  • Email:highspeed_logic@163.com 站长QQ: 1224848052

    专业代做/代写/承接、MATLAB、SIMULINK、FPGA项目、博士/硕士/本科课题、Coursework、Eassy、Assignment