From a939d12a59c6e3b9ee654a348e30b0c7016f6ffd Mon Sep 17 00:00:00 2001 From: Mohammad Shojafar <mshojafar@users.noreply.github.com> Date: Sun, 25 Feb 2018 16:01:13 +0100 Subject: [PATCH] Notice for the Codes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DVFS on CDC source code is in DVFS_*.m (type 1=static scenario of the incoming traffic per time slot) Lyapunov method on CDC source code is in Lyapunov*.m (Static switch: fix number of POD switch per time slot) Other functions are an internal function that use Newton and multi-gradient solution to find the optimum dual variable for each solution. * While using this code and producing some result, you must add the following citation that the originality of the following code is presented. M. Shojafar, N. Cordeschi, D. Amendola, E. Baccarelli, ”Energy-saving adaptive computing and traffic engineering for real-time-service data centers”, The 50th IEEE International Conference on Communications(IEEE ICC WORKSHOP 2015), London, UK, pp. 1800-1806, 2015. Doi: http://dx.doi.org/10.1109/ICCW.2015.7247442 --- ICC2015_Sourcecode/DVFS_type1_ICC.m | 495 +++++++++++++ ICC2015_Sourcecode/DVFS_type2_ICC.m | 312 ++++++++ .../Lyapunov5_Dynamic_V_Fixed_Switch.m | 507 +++++++++++++ .../Lyapunov5_Static_V_Fixed_Switch.m | 681 ++++++++++++++++++ ICC2015_Sourcecode/Mu_opt_bisezione.m | 65 ++ ICC2015_Sourcecode/X.mat | Bin 0 -> 75859 bytes ICC2015_Sourcecode/copyright notice.docx | Bin 0 -> 15593 bytes ICC2015_Sourcecode/deletezero.m | 12 + ICC2015_Sourcecode/delta_carico.m | 16 + ICC2015_Sourcecode/grafica_delta_carico.m | 6 + ICC2015_Sourcecode/tracking3.m | 180 +++++ ICC2015_Sourcecode/variabili.m | 10 + 12 files changed, 2284 insertions(+) create mode 100644 ICC2015_Sourcecode/DVFS_type1_ICC.m create mode 100644 ICC2015_Sourcecode/DVFS_type2_ICC.m create mode 100644 ICC2015_Sourcecode/Lyapunov5_Dynamic_V_Fixed_Switch.m create mode 100644 ICC2015_Sourcecode/Lyapunov5_Static_V_Fixed_Switch.m create mode 100644 ICC2015_Sourcecode/Mu_opt_bisezione.m create mode 100644 ICC2015_Sourcecode/X.mat create mode 100644 ICC2015_Sourcecode/copyright notice.docx create mode 100644 ICC2015_Sourcecode/deletezero.m create mode 100644 ICC2015_Sourcecode/delta_carico.m create mode 100644 ICC2015_Sourcecode/grafica_delta_carico.m create mode 100644 ICC2015_Sourcecode/tracking3.m create mode 100644 ICC2015_Sourcecode/variabili.m diff --git a/ICC2015_Sourcecode/DVFS_type1_ICC.m b/ICC2015_Sourcecode/DVFS_type1_ICC.m new file mode 100644 index 0000000..f5f5ac1 --- /dev/null +++ b/ICC2015_Sourcecode/DVFS_type1_ICC.m @@ -0,0 +1,495 @@ +%ScriptMax 1a cond + ni cond blocco totale version 4 +close all; +clear all; +clc; + +tic; +VMNo=100; % VM numbers +N = 2000; %number of workloads + +nVM=[]; +% +-+-+-+-+-+ parameters +-+-+-+-+-+ +for i=1:VMNo +nVM = [nVM,i]; %number of virtual machines +end + + +speed_cost_all = zeros(length(nVM),N); %matrix of speed cost_all (1 x workloads) +switch_cost_all = zeros(length(nVM),N); %matrix of switch cost (1 x workloads) +channel_cost_all = zeros(length(nVM),N); %matrix of channel cost (1 x workloads) +tot_cost_all = zeros(length(nVM),N); %matrix of total cost (1 x workloads) + + +k_e = 0.005; %frequency change cost parameter +delta = 0.1; %task time +f0 = 0; %percentage of fmax of initial frequency +iterations = 10000; %max number of iteration +gamma = 0.5; + +tol_workload_allocated = 0.01; %tolerance 1st condition +epsilon = 0.01; %tolerance 2nd condition +R_tot = 100; %capacity of NetDC +%L_tot_vect = 6+ round((10-6) * rand(1,N)); % PMR=1.25, L_tot=8+-2 +%save('workloads8PMR125No1000.mat', 'L_tot_vect'); %loading 100 fixed random workloads +L_tot_vect=load('workloads8PMR125No2000.mat','L_tot_vect'); %loading 100 fixed random workloads +L_tot_vect = L_tot_vect.L_tot_vect; + +T_tot = 5; +beta = 0.41/(T_tot - delta)^1.995;%time out +%beta = 0.34/(T_tot - delta)^1;%time out + +rule_counter=zeros(1,N); % (insit of notsatisfactin cases) states for the each incoming workload facing in 3 rules +rule1_counter=0; +rule2_counter=0; +rule3_counter=0; + +Zeta_vector=[0.5:0.1:100]; +%VMs=[2, 100]; + +% iter_mat1 = zeros(1,N); +% mu_mat1 = zeros(N,iterations); +% ni_mat1 = zeros(N,iterations); +% f_opt_mat1=zeros(N,iterations); +% L_mat1=zeros(N,iterations); + +%for M = nVM(1):VMNo +for M = 100:100 +%for M = 1:length(VMs) + %M=VMs(M); + M + f_max = 105 * ones(1,M); % (Mbit/s) max working frequency + f_zero = (f0/100) * f_max; %initial working frequency + %f_zero = 0; %initial working frequency + W = ones(1,M); %band of each channel (MHz) + %Zeta = 0.5 * ones(1,M); %channel parameters (mW) + Zeta = Zeta_vector(1:M); + f_opt_new=zeros(1,M); +% N_0 = ones(1,M);g = ones(1,M);Zeta = (N_0 .* W) / g;R = [0:0.1:R_max];P_net = Zeta .* (2^(R/W) - 1); + E_max = 60 * ones(1,M); %max power consumption (@fmax) + omega = ones(1,M); %relative power consumption (virtualization cost) + Delta = delta * ones(1,M); %task time + Delta_max = max(Delta); %max task time + L_b = zeros(1,M); %background task size for each VM + +% speed_cost = zeros(N,iterations); %matrix of speed cost (workloads x iteration) +% switch_cost = zeros(N,iterations); %matrix of switch cost (workloads x iteration) +% channel_cost = zeros(N,iterations); %matrix of channel cost (workloads x iteration) +% tot_cost = zeros(N,iterations); %matrix of total cost (workloads x iteration) + + + temp=2.*k_e+(2.*E_max.*omega./(f_max.^2)); %temp var for calculation of fi* + Th = 2 * (Zeta./W) * log(2); %threshold = derivation of Pnet(Ri) + + iter_mat = zeros(1,N); %number of iteration necessary for 1st condition for each workload + +% MatrixRis = zeros(1+M+M,N); %matrix of results, row: 1=final_iter 2=final_alpha 3=tot_cost 4=final_ni 5=2nd_condition 6=(ni<esp & g(.)<esp) +% L_allocated = zeros(N,iterations); %matrix of total allocation for each iteration fon each workload +% f_opt_mat = zeros(N,iterations); %matrix of frequency allocation for each iteretion for each workload FOR THE 1ST VM +% L_mat = zeros(N,iterations); %matrix of allocation for each iteretion for each workload FOR THE 1ST VM +% ni_mat = zeros(N,iterations); %matrix of "ni" value for each iteretion for each workload FOR THE 1ST VM +% mu_mat = zeros(N,iterations); +% + %matrix of "mu" value for each iteretion for each workload + alpha_mat = zeros(N,iterations); %matrix of "alpha" value for each iteretion for each workload + pippo_mat = zeros(N,iterations); %matrix of "pippo" value for each iteretion for each workload FOR THE 1ST VM + + for l = 1:N % workload number + %check feasibility + feas_workload = (sum(f_max.*Delta-L_b) >= L_tot_vect(l)); + feas_time = (L_tot_vect(l) <= R_tot.*(T_tot-Delta_max)./2); + feas_back = min(Delta.*f_max >= L_b); + feasibility = feas_workload && feas_time && feas_back; + if ~ feasibility + error('Problem unfeasible for the workload %d',l); + else + fprintf('Problem feasibile for the workload %d\n',l); + Delta_load = zeros(1,iterations); + L = zeros(iterations,M); + alpha = zeros(1,iterations); + pippo = zeros(1,iterations); + V = zeros(1,iterations); + V_pippo = zeros(1,iterations); + mu = zeros(1,iterations); + ni = zeros(iterations,M); + y = zeros(iterations,M); + f_opt = zeros(iterations,M); + i = 2; + while i <= iterations + bandierina = 0; + k=0; + cond3 = zeros(1,M); + cond2 = zeros(1,M); + %calculate of MU + mu(i) = max(0,(mu(i-1) - ((alpha(i-1))) * (sum(L(i-1,:)) - L_tot_vect(l)) ) ); + + %calculate of temp variable + y(i,:) = max(0,( ((T_tot-Delta)/2) .* W .* log2(mu(i) ./ Th) ) ); + + %calculate of ni; the old was: ni(i,:) = max(0,( ni(i-1,:) + (alpha(i-1) * ( L(i-1,:) - (Delta.*f_opt(i-1,:)))))) + ni(i,:) = (ni(i-1,:) + (pippo(i-1) * (y(i,:) - Delta.*f_opt(i-1,:)))); + + %calculate of f_opt + f_star = (2*k_e*f_zero + ni(i,:).*Delta)./ temp; + f_opt(i,:) = max(L_b/Delta,min(f_star,f_max)); + + %calculate of L + L(i,:) = min(f_opt(i,:) .* Delta(1,:),y(i,:)); + +% ni(i,ni(i,:)<=0.01) = 0; +% for h=1:M +% if ni(i,h)>0 +% L(i,h)=f_opt(i,h) .* Delta(1,h); +% else +% L(i,h) = y(i,h); +% end +% end + + % 2nd and 3rd condition + for x = 1:M + cond3(1,x) = (((abs(ni(i,x)))<=epsilon)||((abs(L(i,x)-f_opt(i,x)*Delta(1,x)))<=epsilon)); + cond2(1,x) = L(i,x)<=f_opt(i,x)*Delta(1,x); + end + +% if ( (sum(cond3(1,:)) < M)||(sum(cond2(1,:)) < M) ) +% alpha(i-1) = 0.5 * alpha(i-1); +% bandierina = 1; +% k = k + 1; +% fprintf('alpha loop...); +% end + if (bandierina == 0 && k<100) + alpha(i) = max(0,min(beta,alpha(i-1) - gamma * V(i-1) * (sum(L(i-1,:)) - L_tot_vect(l)))); + V(i) = (1 - alpha(i-1)) * V(i-1) - (sum(L(i-1,:)) - L_tot_vect(l)); + pippo(i) = max(0,min(0.001,pippo(i-1) - gamma * V_pippo(i-1) *(Delta(1)*f_opt(i-1,1)- y(i,1)))); + V_pippo(i) = (1 - pippo(i-1)) * V_pippo(i-1) - (Delta(1)*f_opt(i-1,1)- y(i,1)); + Delta_load(i)=sum(L(i,:))-L_tot_vect(l); +% speed_cost(l,i) = sum(((f_opt(i,:)./f_max).^2).*omega.*E_max); % Computing (11.1) +% switch_cost(l,i) = sum(k_e.*(f_opt(i,:)-f_zero).^2); % Switching (11.1) +% channel_cost(l,i) = (T_tot-Delta(1)).*sum(Zeta .* (2.^(2*L(i,:)./((T_tot-Delta).*W))-1)); % Networking +% tot_cost(l,i) = speed_cost(l,i) + switch_cost(l,i) + channel_cost(l,i); % Overall +% +% L_allocated(l,i) = sum(L(i,:)); +% L_mat(l,i) = L(i,1); +% f_opt_mat(l,i) = f_opt(i,1); +% ni_mat(l,i) = ni(i,1); +% mu_mat(l,i) = mu(i); +% alpha_mat(l,i) = alpha(i); +% pippo_mat(l,i) = pippo(i); + cond_car_all = abs(Delta_load(i)/L_tot_vect(l))>=tol_workload_allocated; + if cond_car_all + iter_mat(l) = i; +% MatrixRis(1:M,l) = L(i,:); +% MatrixRis(M+1:M+M,l) = f_opt(i,:); +% MatrixRis(M+M+1,l) = tot_cost(l,i); + else + fprintf('correct allocation for workload n: %d (%d) at iteration %d\n',l,L_tot_vect(l),i); + iter_mat(l) = i; +% MatrixRis(1:M,l) = L(i,:); +% MatrixRis(M+1:M+M,l) = f_opt(i,:); +% MatrixRis(M+M+1,l) = tot_cost(l,i); + break; + end + i = i + 1; + end + end + end + if i == iterations + 1 + i = i - 1; + end + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%DESCRETE + + f_precedente=zeros(1,M); + f_successiva=zeros(1,M); + x1=zeros(1,M); + + Q=6; %numero frequenze discrete; + f_discrete=zeros(1,Q); + for conta=1:M + %f_discrete(conta,:)=[0:f_max(conta)./(Q-1):f_max(conta)]; + f_discrete(conta,:)=[0, 5,50,70,90,105]; % Mhz or Mb/s + end + + f_opt_new=f_opt(iter_mat(l), :); + + for conta=1:M + + delta_f_discrete=f_discrete(conta,:)-f_opt_new(conta); + [ff,ind_ff]=min(abs(delta_f_discrete)); + if ff==0 + f_precedente(conta)=f_discrete(conta,ind_ff); + f_successiva(conta)=f_discrete(conta,ind_ff); + x1(conta)=1; %qualsiasi valore č indifferente + elseif ind_ff==1 + f_precedente(conta)=f_discrete(conta,1); + f_successiva(conta)=f_discrete(conta,2); + x1(conta)=abs(f_opt_new(conta)-f_precedente(conta))./(f_successiva(conta)-f_precedente(conta)); + elseif ind_ff==Q + f_precedente(conta)=f_discrete(conta,Q-1); + f_successiva(conta)=f_discrete(conta,Q); + x1(conta)=abs(f_opt_new(conta)-f_precedente(conta))./(f_successiva(conta)-f_precedente(conta)); + elseif delta_f_discrete(ind_ff)>0 + f_precedente(conta)=f_discrete(conta,ind_ff-1); + f_successiva(conta)=f_discrete(conta,ind_ff); + x1(conta)=abs(f_opt_new(conta)-f_precedente(conta))./(f_successiva(conta)-f_precedente(conta)); + else + f_precedente(conta)=f_discrete(conta,ind_ff); + f_successiva(conta)=f_discrete(conta,ind_ff+1); + x1(conta)=abs(f_opt_new(conta)-f_precedente(conta))./(f_successiva(conta)-f_precedente(conta)); + end + + end + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %speed_cost_all(M,l)=speed_cost(l,iter_mat(l)); + % switch_cost_all(M,l)=switch_cost(l,iter_mat(l)); + +% speed_cost_all(M,l)=sum(((((f_precedente/f_max).^2)).*omega.*E_max).*(1-x1)+((((f_successiva/f_max).^2)).*omega.*E_max).*x1); +% switch_cost_all(M,l)=sum((k_e.*(f_precedente-f_zero).^2).*(1-x1)+(k_e.*(f_successiva-f_zero).^2).*x1); +% +% channel_cost_all(M,l)=channel_cost(l,iter_mat(l)); +% +% tot_cost_all(M,l)=speed_cost_all(M,l)+switch_cost_all(M,l)+channel_cost_all(M,l); + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + f_zero = f_opt(i,:); + %1a Condizione + if i > iterations + i=iterations; + end + if i >= iterations + fprintf('!!!!!!!WARNING!!!!!!!prima condizione non soddifatta: NON CONVERGE!!!\n'); + rule_counter(l)=1; + rule1_counter=rule1_counter+1; + end + %3a Condizione + for x = 1:M + cond3(1,x) = (((abs(ni(i-1,x)))<=epsilon)||((abs(L(i-1,x)-f_opt(i-1,x)*Delta(1,x)))<=epsilon)); + end + if sum(cond3(1,:))< M + fprintf('!!!!!!!WARNING!!!!!!!terza condizione NON soddisfatta\n'); + rule_counter(l)=3; + rule3_counter=rule3_counter+1; + end + %2a condizione + if L(i,:)>(f_opt(i,:) .* Delta(1,:)); + fprintf('!!!!!!!WARNING!!!!!!!seconda condizione NON soddisfatta\n'); + rule_counter(l)=2; + rule2_counter=rule2_counter+1; + end + end + clear speed_cost switch_cost channel_cost tot_cost +% if M==2 +% mu_mat1 = mu_mat; +% iter_mat1=iter_mat; +% ni_mat1 = ni_mat; +% f_opt_mat1=f_opt_mat; +% L_mat1=L_mat; +% end +end +time = toc; +fprintf('tempo: %d\n',time); + +NNN=1; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%DESCRETE COMPARISONS + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Presimulation-definitions +% speed_cost_all_WL=zeros(1,N); +% switch_cost_all_WL=zeros(1,N); +% channel_cost_all_WL=zeros(1,N); +% tot_cost_all_WL=zeros(1,N); +% +% speed_cost_all_VM=zeros(1,length(nVM)); +% switch_cost_all_VM=zeros(1,length(nVM)); +% channel_cost_all_VM=zeros(1,length(nVM)); +% tot_cost_all_VM=zeros(1,length(nVM)); +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Presimulation-for +% for j=1:N % workload +% speed_cost_all_WL(j)=mean(speed_cost_all(:,j)); +% switch_cost_all_WL(j)=mean(switch_cost_all(:,j)); +% channel_cost_all_WL(j)=mean(channel_cost_all(:,j)); +% tot_cost_all_WL(j)=mean(tot_cost_all(:,j)); +% end +% +% for j=1:length(nVM) % VMs +% speed_cost_all_VM(j)=mean(speed_cost_all(j,:)); +% switch_cost_all_VM(j)=mean(switch_cost_all(j,:)); +% channel_cost_all_VM(j)=mean(channel_cost_all(j,:)); +% tot_cost_all_VM(j)=mean(tot_cost_all(j,:)); +% end +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% % figure(100) % non staisfaction numbers +% % plot(,rule1_counter,'--+'); +% % xlabel('Workload'); +% % ylabel('$\overline{\mathcal{E}}_{CPU}$'); +% % grid on +% +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% figure(100) % speed +% plot(1:1:N,speed_cost_all_WL(:)); +% xlabel('Workload'); +% ylabel('$\overline{\mathcal{E}}_{CPU}$'); +% grid on +% +% figure(101) % switch +% plot(1:1:N,switch_cost_all_WL(:)); +% xlabel('Workload'); +% ylabel('$\overline{\mathcal{E}}_{switch}$'); +% grid on +% +% figure(102) % channel +% plot(1:1:N,channel_cost_all_WL(:)); +% xlabel('Workload'); +% ylabel('$\overline{\mathcal{E}}^{net}$'); +% grid on +% +% figure(103) % total +% plot(1:1:N,tot_cost_all_WL(:)); +% xlabel('Workload'); +% ylabel('$\overline{\mathcal{E}}^{tot}$'); +% grid on +% +% figure(104) % speed +% plot(1:1:VMNo,speed_cost_all_VM(:)); +% xlabel('VM'); +% ylabel('$\overline{\mathcal{E}}_{CPU}$'); +% grid on +% +% figure(105) % switch +% plot(1:1:VMNo,switch_cost_all_VM(:)); +% xlabel('VM'); +% ylabel('$\overline{\mathcal{E}}_{switch}$'); +% grid on +% +% figure(106) % channel +% plot(1:1:VMNo,channel_cost_all_VM(:)); +% xlabel('VM'); +% ylabel('$\overline{\mathcal{E}}^{net}$'); +% grid on +% +% figure(107) % total +% plot(1:1:VMNo,tot_cost_all_VM(:)); +% xlabel('VM'); +% ylabel('$\overline{\mathcal{E}}^{tot}$'); +% grid on + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% mu_last=zeros (1,N); +% ni_last=zeros (1,N); +% alpha_last=zeros (1,N); +% pippo_last=zeros (1,N); +% +% for i=1:N +% mu_last(i)=mu_mat(i,iter_mat(i)); +% ni_last(i)=ni_mat(i,iter_mat(i)); +% alpha_last(i)=alpha_mat(i,iter_mat(i)); +% pippo_last(i)=pippo_mat(i,iter_mat(i)); +% end +% +% figure(1000) +% plot(1:1:N,mu_last(:),'r'); +% title('mu'); +% xlabel('WL'); +% ylabel('$\mu$'); +% grid on +% +% figure(1001) +% plot(1:1:N,ni_last(:),'r'); +% title('ni'); +% xlabel('WL'); +% ylabel('$\ni$'); +% grid on +% +% figure(1022) +% plot(1:1:iter_mat1(50),mu_mat1(50,1:iter_mat1(50)),'r',1:1:iter_mat1(1000),mu_mat1(1000,1:iter_mat1(1000)),'b',1:1:iter_mat(50),mu_mat(50,1:iter_mat(50)),'r',1:1:iter_mat(1000),mu_mat(1000,1:iter_mat(1000)),'b'); +% title('$\mu$ in $\Delta=0.1$ (s), $\gamma=0.5$, $T_t=5$ (s), $\beta=0.15$'); +% legend('M=2, $\delta=0.1$, N=50','M=2, $\delta=0.1$, N=1000', 'M=100, $\delta=0.1$, N=50','M=100, $\delta=0.1$, N=1000') +% xlabel('iterations'); +% ylabel('$\mu$'); +% grid on +% +% figure(1023) +% plot(1:1:iter_mat1(50),ni_mat1(50,1:iter_mat1(50)),'r',1:1:iter_mat1(1000),ni_mat1(1000,1:iter_mat1(1000)),'b',1:1:iter_mat(50),ni_mat(50,1:iter_mat(50)),'r',1:1:iter_mat(1000),ni_mat(1000,1:iter_mat(1000)),'b'); +% title('$\ni$ in $\Delta=0.1$ (s), $\gamma=0.5$, $T_t=5$ (s), $\beta=0.15$'); +% legend('M=2, N=50','M=2, N=1000', 'M=100, N=50','M=100, N=1000') +% xlabel('iterations'); +% ylabel('$\ni$'); +% grid on +% +% figure(1024) +% plot(1:1:iter_mat1(50),f_opt_mat1(50,1:iter_mat1(50)),'r',1:1:iter_mat1(1000),f_opt_mat1(1000,1:iter_mat1(1000)),'b',1:1:iter_mat(50),f_opt_mat(50,1:iter_mat(50)),'r',1:1:iter_mat(1000),f_opt_mat(1000,1:iter_mat(1000)),'b'); +% title('$f_{opt}$ in $\Delta=0.1$ (s), $k_e=0.005$, $f_i^{max}=105$, $\gamma=0.5$, $T_t=5$ (s), $\beta=0.15$, $\overline{\mathcal{E}}_i^{max}=60$ $(J)$'); +% legend('M=2, N=50','M=2, N=1000', 'M=100, N=50','M=100, N=1000') +% xlabel('iterations'); +% ylabel('$f_{opt}$'); +% grid on +% +% figure(1025) +% plot(1:1:iter_mat1(50),L_mat1(50,1:iter_mat1(50)),'r',1:1:iter_mat1(1000),L_mat1(1000,1:iter_mat1(1000)),'b',1:1:iter_mat(50),L_mat(50,1:iter_mat(50)),'r',1:1:iter_mat(1000),L_mat(1000,1:iter_mat(1000)),'b'); +% title('$L_{opt}$ in $\Delta=0.1$ (s), $k_e=0.005$, $f_i^{max}=105$, $\gamma=0.5$, $T_t=5$ (s), $\beta=0.15$, $\overline{\mathcal{E}}_i^{max}=60$ $(J)$'); +% legend('M=2, N=50','M=2, N=1000', 'M=100, N=50','M=100, N=1000') +% xlabel('iterations'); +% ylabel('$L_{opt}$'); +% grid on + +% figure(1002) +% plot(1:1:N,alpha_last(:),'r'); +% title('\alpha'); +% xlabel('WL'); +% ylabel('$\alpha$'); +% grid on +% +% figure(1003) +% plot(1:1:N,pippo_last(:),'r'); +% title('\alpha_{NEW}'); +% xlabel('WL'); +% ylabel('$\alpha_{NEW}$'); +% grid on +% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +% figure() +% plot(mu_mat(NNN,2:iter_mat(NNN)),'r'); +% title('mu'); +% +% figure() +% plot(ni_mat(NNN,2:iter_mat(NNN)),'r'); +% title('ni'); + +% figure() +% plot(L_mat(NNN,2:iter_mat(NNN)),'r'); +% title('L'); +% +% figure() +% plot(f_opt_mat(NNN,2:iter_mat(NNN)),'r'); +% title('f ottimo'); + +% figure() +% plot(alpha_mat(NNN,2:iter_mat(NNN)),'r'); +% title('alpha'); +% +% figure() +% plot(pippo_mat(NNN,2:iter_mat(NNN)),'r'); +% title('pippo'); + +% figure() +% bar(MatrixRis(1:M,NNN)); +% title('allocazione carico (L) per il wl 1'); +% +% figure() +% bar(MatrixRis(1+M:M+M,NNN)); +% title('allocazione frequenze (f_opt) per il wl 1'); + + diff --git a/ICC2015_Sourcecode/DVFS_type2_ICC.m b/ICC2015_Sourcecode/DVFS_type2_ICC.m new file mode 100644 index 0000000..eed6066 --- /dev/null +++ b/ICC2015_Sourcecode/DVFS_type2_ICC.m @@ -0,0 +1,312 @@ +clc +clear all +close all + +VM=[1:1:100];%numero Macchine Virtuali +NumSimulazioni=length(VM); + +%IDEAL +costo_speed_VM=zeros(1,NumSimulazioni); +costo_switch_VM=zeros(1,NumSimulazioni); +costo_channel_VM=zeros(1,NumSimulazioni); +costo_tot_VM=zeros(1,NumSimulazioni); +%NICOLA (COMNET) +speed_cost_all_VM=zeros(1,NumSimulazioni); +switch_cost_all_VM=zeros(1,NumSimulazioni); +channel_cost_all_VM=zeros(1,NumSimulazioni); +tot_cost_all_VM=zeros(1,NumSimulazioni); + + +f_VM_ultima=zeros(1,NumSimulazioni); + + +%inizio le simulazioni +P_net_completo=[1:0.25:10000]; +%P_net_completo=zeros(1,100); + + +%Jobs=6 + (10-6).*rand(1,1000); %carico uniformemente distribuito +%Jobs=10.*ones(1,10); %carico deterministico +%Jobs=ciel(abs(10.*Nrand(0,1))); +%Jobs=random('Poisson',1:NumSimulazioni,1,NumSimulazioni); +%Jobs=ceil(abs(random('Normal',0,4,1,10))); +Jobs=load('workloads8PMR125No2000.mat','L_tot_vect'); +Jobs=Jobs.L_tot_vect; +for k=1:NumSimulazioni + tic + k + M=VM(k); + costo_speed=0; + costo_switch=0; + costo_channel=0; + costo_tot=0; + + costo_speed_Nicola=0; + costo_switch_Nicola=0; + costo_channel_Nicola=0; + costo_tot_Nicola=0; + rate_ultima_macchina=0; + + + k_e=0.005; + C_max=15; %(Mb/s) + T_tot=5; %(s) + + W = ones(1,M); %band of each channel (MHz) + Zeta = 0.5 * ones(1,M); %channel parameters (mW) + + + f_max=105.*ones(1,M); %(Mb/s) + f_zero=zeros(1,M); % (Mb/s) + %f_zero=0.2.*f_max; + %f_zero=f_max; + P_net=P_net_completo(1:M); %(mW) + %P_net=1.*ones(1,M); %NB.! ORDINARE LE MACCHINE VIRTUALI IN MODO DA AVERE LE POTENZE IN ORDINE CRESCENTE + %(unicamente perchč semplifica la scritura del + %software - controindicazione: il codicie funziona bene indipendentemente) + Th=2.*P_net./C_max; %Soglia di ibernazione macchina; (tutte le VM per cui mu_opt<=Th vengono ibernate con coefficiente di + % ibernazione alpha_zero) + + E_max=60.*ones(1,M); % (mJ) + omega=1.*ones(1,M); + Delta=0.1.*ones(1,M); % (s) + Delta_max=max(Delta); + L_b=zeros(1,M); % NB. il codice funziona bene per L_b=0, altrimenti aggiungere modifica su f_opt. + + temp=2.*k_e+(2.*E_max.*omega./(f_max.^2)); + alpha_zero=2.*k_e./temp; + alpha_mu=Delta./temp; + +speed_cost_all_WL=zeros(1,length(Jobs)); +switch_cost_all_WL=zeros(1,length(Jobs)); +channel_cost_all_WL=zeros(1,length(Jobs)); +tot_cost_all_WL=zeros(1,length(Jobs)); + + + + for num_job=1:length(Jobs) + L_tot=Jobs(num_job); + + + + + %CHECK FEASIBILITY - controllare funzionamento operatori %%%%%%%%%%%%%%%%%% + + condizione_feas_carico=(sum(f_max.*Delta-L_b)>=L_tot); + condizione_feas_tempo=(L_tot<=C_max.*(T_tot-Delta_max)./2); + condizione_feas_back=min(Delta.*f_max>=L_b); + + + feasibility=condizione_feas_carico && condizione_feas_tempo && condizione_feas_back; + + if ~feasibility + 'VM=' + M + error('Problem unfeasible') + else + %'Problem Feasibile!' + end + + + + + + %SOLUZIONE EQUAZIONE: sum(L_opt)=L_tot; + + %NB. IL PUNTO DI ATTRAVERSAMENTO DELLO ZERO POTREBBE NON ESISTERE. IN QUEL + %CASO mu_opt E' IL PUNTO DI GRADINO FRA LA ZONA POSITIVA E QUELLA NEGATIVA + %E delta_mu (CHE E' IL VALORE DELL'EQUAZIONE IN mu) E' DIVERSO DA ZERO. + + [mu,delta_mu]= Mu_opt_bisezione(alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot); + tol_mu=10^(-2);%tolleranza per decisione macchine in stato limite + tol_carico_allocato=10^(-2); + if ((abs(delta_mu)./L_tot)<tol_carico_allocato)%tutto il carico č allocato con un errore relativo inferiore a tol_allocazione + caso_limite=0; + %'Caso standard: nessuna VM in stato limite' + else + caso_limite=1; + %'Una o piů VM č in stato limite' + VM_limite=find(abs(Th-mu)<tol_mu); + if length(VM_limite)==0 + 'VM=' + M + error('nessuna VM in stato limite e carico complessivo L_tot non allocato correttamente') + end + + end + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%%%%%%%%%%%%%%%%% scheduler ottimo %%%%%%%%%%%%%%%%% + + + + + f_mu=max(mu-2.*P_net./C_max,0); + f_star=alpha_zero.*f_zero+alpha_mu.*f_mu; + f_opt=max(0,min(f_star,f_max)); %N.B. --> NEL CASO GENERALE DI L_b>0 IL MAX VA FATTO RISPETTO A L_b/Delta, NON RISPETTO A 0. + + rate_ultima_macchina=rate_ultima_macchina+f_opt(M); + + + + canali_attivi=f_mu>0; + L_opt=canali_attivi.*(f_opt.*Delta-L_b); + + %riallocazione delle eventuali VM sulla soglia (stato limite) + + if caso_limite + L_opt(VM_limite)=0; + L_allocato=sum(L_opt); + L_residuo=L_tot-L_allocato; + for k2=1:length(VM_limite); + L_opt(VM_limite(k2))=min(L_residuo,f_opt(VM_limite(k2)).*Delta(VM_limite(k2))-L_b(VM_limite(k2))); + L_residuo=L_residuo-L_opt(VM_limite(k2)); + end + canali_attivi=(L_opt>0); + end + + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%%% costo %%%%%%%%%%%%%%%%%% + + Delta_carico=sum(L_opt)-L_tot; + if ((abs(Delta_carico)./L_tot)>=tol_carico_allocato) + 'Errore: Carico non correttamente allocato' + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%descrete + f_precedente=zeros(1,M); + f_successiva=zeros(1,M); + x1=zeros(1,M); + + Q=6; %numero frequenze discrete; + f_discrete=zeros(M,Q); + for conta=1:M + %f_discrete(conta,:)=[0:f_max(conta)./(Q-1):f_max(conta)]; + f_discrete(conta,:)=[0, 5,50,70,90,105]; % Mhz or Mb/s + end + + f_opt_new=f_opt; + + for conta=1:M + + delta_f_discrete=f_discrete(conta,:)-f_opt_new(conta); + [ff,ind_ff]=min(abs(delta_f_discrete)); + if ff==0 + f_precedente(conta)=f_discrete(conta,ind_ff); + f_successiva(conta)=f_discrete(conta,ind_ff); + x1(conta)=1; %qualsiasi valore č indifferente + elseif ind_ff==1 + f_precedente(conta)=f_discrete(conta,1); + f_successiva(conta)=f_discrete(conta,2); + x1(conta)=abs(f_opt_new(conta)-f_precedente(conta))./(f_successiva(conta)-f_precedente(conta)); + elseif ind_ff==Q + f_precedente(conta)=f_discrete(conta,Q-1); + f_successiva(conta)=f_discrete(conta,Q); + x1(conta)=abs(f_opt_new(conta)-f_precedente(conta))./(f_successiva(conta)-f_precedente(conta)); + elseif delta_f_discrete(ind_ff)>0 + f_precedente(conta)=f_discrete(conta,ind_ff-1); + f_successiva(conta)=f_discrete(conta,ind_ff); + x1(conta)=abs(f_opt_new(conta)-f_precedente(conta))./(f_successiva(conta)-f_precedente(conta)); + else + f_precedente(conta)=f_discrete(conta,ind_ff); + f_successiva(conta)=f_discrete(conta,ind_ff+1); + x1(conta)=abs(f_opt_new(conta)-f_precedente(conta))./(f_successiva(conta)-f_precedente(conta)); + end + + end + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %IDEAL + costo_speed=costo_speed+sum(((f_opt./f_max).^2).*omega.*E_max); + costo_switch=costo_switch+sum(k_e.*(f_opt-f_zero).^2); + costo_channel=costo_channel+sum(2.*P_net.*L_opt./C_max); + + %NICOLA + + costo_speed_Nicola=costo_speed_Nicola+sum(((((f_precedente/f_max).^2)).*omega.*E_max).*(1-x1)+((((f_successiva/f_max).^2)).*omega.*E_max).*x1); + costo_switch_Nicola=costo_switch_Nicola+sum((k_e.*(f_precedente-f_zero).^2).*(1-x1)+(k_e.*(f_successiva-f_zero).^2).*x1); + costo_channel_Nicola=costo_channel_Nicola+((T_tot-Delta(1)).*sum(Zeta .* (2.^(2*L_opt./((T_tot-Delta).*W))-1))); + %costo_channel_Nicola=costo_channel_Nicola+sum(2.*P_net.*L_opt./C_max); + + speed_cost_all_WL(num_job)=sum(((((f_precedente/f_max).^2)).*omega.*E_max).*(1-x1)+((((f_successiva/f_max).^2)).*omega.*E_max).*x1); + switch_cost_all_WL(num_job)=sum((k_e.*(f_precedente-f_zero).^2).*(1-x1)+(k_e.*(f_successiva-f_zero).^2).*x1); + channel_cost_all_WL(num_job)=((T_tot-Delta(1)).*sum(Zeta .* (2.^(2*L_opt./((T_tot-Delta).*W))-1))); + tot_cost_all_WL(num_job)=speed_cost_all_WL(num_job)+switch_cost_all_WL(num_job)+channel_cost_all_WL(num_job); + + + + f_zero=f_opt; + + end + + + % risultati e deallocazione + + + k + %IDEAL + costo_speed_VM(k)=costo_speed./length(Jobs); + costo_switch_VM(k)=costo_switch./length(Jobs); + costo_channel_VM(k)=costo_channel./length(Jobs); + costo_tot_VM(k)=costo_speed_VM(k)+costo_switch_VM(k)+costo_channel_VM(k); + %NICOLA (COMNET) + speed_cost_all_VM(k)=costo_speed_Nicola./length(Jobs); + switch_cost_all_VM(k)=costo_switch_Nicola./length(Jobs); + channel_cost_all_VM(k)=costo_channel_Nicola./length(Jobs); + tot_cost_all_VM(k)=speed_cost_all_VM(k)+switch_cost_all_VM(k)+channel_cost_all_VM(k); + f_VM_ultima(k)=rate_ultima_macchina./length(Jobs); + + + clear f_max f_zero P_net Th E_max omega Delta L_b temp alpha_zero alpha_mu + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %%%%%%%%% istogrammi %%%%%%%%%%%%%%%%%%%%%%%%% + + % figure(k); + % bar(f_opt),xlabel('VM'); + % ylabel('Speed f'); + % grid on; + + toc +end + + +figure(1) +plot(VM,costo_speed_VM,'--o',VM,speed_cost_all_VM,'--*'),xlabel('VM'),ylabel('Speed Cost'); +legend('IDEAL(no DVFS)_type2', 'DVFS_type2'); +figure(2) +plot(VM,costo_switch_VM,'--o',VM,switch_cost_all_VM,'--*'),xlabel('VM'),ylabel('Switch Cost'); +legend('IDEAL(no DVFS)_type2', 'DVFS_type2'); +figure(3) +plot(VM,costo_channel_VM,'--o',VM,channel_cost_all_VM,'--*'),xlabel('VM'),ylabel('Net Cost'); +legend('IDEAL(no DVFS)_type2', 'DVFS_type2'); +figure(4) +plot(VM,costo_tot_VM,'--o',VM,costo_tot_VM,'--*'),xlabel('VM'),ylabel('Overall Cost'); +legend('IDEAL(no DVFS)_type2', 'DVFS_type2'); + + +figure(5) +plot(1:1:length(Jobs),speed_cost_all_WL,'--o'),xlabel('#WL'),ylabel('Speed Cost'); +legend('DVFS_type2'); +figure(6) +plot(1:1:length(Jobs),switch_cost_all_WL,'--*'),xlabel('#WL'),ylabel('Switch Cost'); +legend('DVFS_type2'); +figure(7) +plot(1:1:length(Jobs),channel_cost_all_WL,'--*'),xlabel('#WL'),ylabel('Net Cost'); +legend('DVFS_type2'); +figure(8) +plot(1:1:length(Jobs),tot_cost_all_WL,'--*'),xlabel('#WL'),ylabel('Overall Cost'); +legend('DVFS_type2'); + + + +figure(9) +plot(VM,f_VM_ultima,'--o'),xlabel('VM'),ylabel('rate last VM'); + + + diff --git a/ICC2015_Sourcecode/Lyapunov5_Dynamic_V_Fixed_Switch.m b/ICC2015_Sourcecode/Lyapunov5_Dynamic_V_Fixed_Switch.m new file mode 100644 index 0000000..2880a16 --- /dev/null +++ b/ICC2015_Sourcecode/Lyapunov5_Dynamic_V_Fixed_Switch.m @@ -0,0 +1,507 @@ +%variables inizialization utilizzo flessibile delle code , non ha vincoli +%di tempo di servizio.% CHE THROUPUT GARANTISCONO? E COSTO AL VARIARE v +clc +clear all +close all +cc=0; +N = 1; %applications pag 479 +M = 100; %Servers pag 479 + +TT = 2000; +T=2000; +k_e=0.005; %(J/(MHz)^2) +%Lamda = 2000.*ones(N,TT); %Number of slot +%A = 2.*Lamda.*rand(N,TT); %Arrival job uniformed distribuited pag 481 +%A=4000.*rand(N,TT); %PMR = 1 +%A = 3000 +(4000-2000).*rand(N,TT); %PMR = 1.25 +%A = 2000 +(6000-2000).*rand(N,TT) ; %PMR = 1.5 +% A = 1000 +(7000-1000).*rand(N,TT); %PMR = 1.75 +%A = 8000.*rand(N,TT); %PMR = 2 +%save('Avalue4000FIXPMR2.mat','A'); + + +%L_tot_vect = 6+ round((10-6) * rand(N,TT)); % PMR=1.25, L_tot=8+-2 +%save('workloads8PMR125No2000.mat', 'L_tot_vect'); %loading 100 fixed random workloads +A=load('workloads8PMR125No2000.mat','L_tot_vect'); +A=A.L_tot_vect; + + +F = [5,50,70,90,105]; %( Gbyte/s)frequecny range for every VM allocated onto the j-server +I = ones(M,TT); %resource decision allocation +P_cpu1 = zeros(N,M,length(F)); %power consuption for each VM onto each j server +P_min = 10.*ones(N,M,length(F)); %minimum power for the considered VM allocated onto the j-server +P_max = 60.*ones(N,M,length(F)); %maximum power for the considered VM allocated onto the j-server +mu1=zeros(N,M,length(F)) ; +MU=zeros(N,M,TT); %service rate (request/slots) +ww = zeros(1,N); +AU = zeros(N,M); +AAU = zeros(1,N); +SAU = zeros(1,M); +AAS = zeros(1,N); +Avg_ADELAY = zeros(1,N); +avg_MU = zeros(N,M); +avg_AMU = zeros(1,N); +avg_SMU = zeros(1,M); +Avg_SDELAY = zeros(1,M); +Avg_SDelay=zeros(1,M); + +KU= zeros(N,M); +Delay=zeros(1,N); +Delay2=zeros(N,M); + + +alpha = ones(1,N); %throughput utility weights +%V1 = [1:100:1000]; %control parameter for DCA +V = 100; +%V=length(V1) +beta = 1; % non-negative normalizing weight +W = zeros(N,TT); %Buffer Dimension +K = zeros(N,M,TT); % ==R(i,j) number of requests for application i that are routed from the R(i) router Buffer to the j-server in slot t. +U = zeros(N,M,TT); %queing dynamics for the request of application i at server j +P = zeros(M,TT); % power consumed by each server in each time slot for s +Switch=zeros(M,TT); % power consumed by each server in each time slot for s +SW= zeros(1,M); %the time average expected power consuption of server j +r = zeros(1,N); %average expected rate of admitted request for apllication i +e = zeros(1,M); %the time average expected power consuption of server j +R = zeros(N,TT); +Freq = zeros(N,M,length(F)); +Freqtemp = zeros(M,TT); +temp = zeros(N,M,length(F)); +active_servers = zeros(N+1,M,T); +M1=0; +M2=0; +M3=0; +l=0; +on_servers_list=zeros(1,M); +on_servers = zeros(N+1,M); % on-server in each different frame T +off_servers = zeros(N+1,M); % off-server in each different frame T +sleeping_servers= zeros(N+1,M); % Hybernated-server in each different frame T +% a = rand(1,M); % applications variable indicator +% save('avalue.mat','a'); +a=load('avalue.mat','a'); +a=a.a; +a(:)=(a(:) >= 0.4); +for j=1:M + if (a(j)==1) + on_servers(1,j)=j; + l=l+1; + on_servers_list(j)=j; + end +end + +a_temp = zeros(1,M); % temp applications variable indicator +%a_temp(:)=(a_temp(:) >= 0.6); + +for i = 1:N + for j = 1:M + Freq(i,j,:)= F(:); + end +end + +for i=1:N + for j=1:M + mu1(i,j,:) = (8*10^(-3).*F(:)) +0.76; % servers queue for each application service rate (5,0.8)-----(105,1.6) + P_cpu1(i,j,:)=P_min(i,j,:) + (50*10^(-4)).*((Freq(i,j,:)-5).^2); % CPU power of each virtual machine among each j-server pag 480 + end +end + +F1= [0, 5,50,70,90,105]; % (Gbit/s)frequecny range for every VM allocated onto the j-server +P_cpu2 = zeros(N,M,length(F1)); % power consuption for each VM onto each j server +P_min = 10.*ones(N,M,length(F1)); %minimum power for the considered VM allocated onto the j-server +P_max = 60.*ones(N,M,length(F1)); %maximum power for the considered VM allocated onto the j-server +mu2 = zeros(N,M,length(F1)) ; +Freq1 = zeros(N,M,length(F1)); +temp1 = zeros(N,M,length(F1)); +for i = 1:N + for j = 1:M + Freq1(i,j,:)= F1(:); + end +end + +for i=1:N + for j=1:M + mu2(i,j,2:1:length(F1)) = (8*10^(-3).*F1(2:1:length(F1)))+0.76; % servers queue for each application service rate (5,0.8)-----(105,1.6) + mu2(i,j,1) = 0; + P_cpu2(i,j,2:1:length(F1))=P_min(i,j,2:1:length(F1)) + (50*10^(-4)).*((Freq1(i,j,2:1:length(F1))-5).^2); % CPU power of each virtual machine among each j-server pag 480 + P_cpu2(i,j,1)=0; + + end +end +i=0; +j=0; +UU=zeros(N,M,TT); +UU1=zeros(N,M,TT); +B = [1:1:TT/T]; +L_off=zeros(1,length(B)); +MM1=zeros(1,length(B)); +MM2=zeros(1,length(B)); +MM3=zeros(1,length(B)); +bb=0; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%main body code +for t = 1 : TT + if (mod(t,T)~= 0) + UU=zeros(N,M,TT); + for jtest=1:M + if (a(jtest)==1) + UU(:,jtest,t)=U(:,jtest,t); + else + UU(:,jtest,t)=nan; + end + end + %if (t>1) + %UU(~UU)=nan; + %end + for i= 1 : N + + % + %j + t + if(W(i,t) > V.*alpha(i)) + R(i,t) = 0; + + else + R(i,t) = A(i,t); + end + + %list U of active (ON) servers. + + + [U1, indexu1]=min(UU(i,:,t));% page 483 routing + if (W(i,t) > U1) || (isnan(U1)) + K(i,indexu1,t) = W(i,t); + else + K(i,:,t)=0; + end + + UU(:,indexu1,t)=nan; + + % [U1, ind]=min(U(i,:,t));% page 483 routing + % if (W(i,t) > U1) + % for ikl=1:M + % for mmmm=1:N + % K(mmmm,ikl,t)=K(mmmm,ikl,t-1); + % end + % end + % K(i,ind,t) = W(i,t); + % + % else + % K(i,:,t)=0; + % end + + + %a(i,j) = (a(i,j) > 0.5); % garantee to set more than half to be -on + % fix number of active server, they are not M , they are + % obviously less + + %if sum(a(i,j)*K(i,j,t)<=W(i,t)) + %if ((W(i,t)-sum(K(i,:,t)))>=0) + + % W(i,t+1) = W(i,t) - sum(a(i,j).*K(i,:,t)) + R(i,t); + W(i,t+1) = W(i,t) - (a*K(i,:,t)') + R(i,t); %% Backlog Queue 1 (2) pag 481 consider only active server + % else + % W(i,t+1)=R(i,t); + % end + + end % for N-application + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% after routing inside each server + for j= 1 : M + if (a(j)==1) + [U_max , index_U_max]=max(U(:,j,t)); % 0=<index_U_max<=N + + for zzz=1:length(F) + temp(index_U_max,j,zzz) = U_max.*(min(mu1(index_U_max,j,zzz),U_max)) - V.*beta.*(P_cpu1(index_U_max,j,zzz)); % Resource allocation pag 483 + + end + [value , index]=max(temp(index_U_max,j,:)); % 1=<index<=length(F) + + MU(index_U_max,j,t) = min(mu1(index_U_max,j,index),U_max); + P(j,t)= P_cpu1(index_U_max,j,index); + if (t==1) + Switch(j,t)=k_e*(F(index))^2; + Freqtemp(j,2)=F(index); + else + Switch(j,t)=k_e*((F(index)-Freqtemp(j,t-1)))^2; + Freqtemp(j,t)=F(index); + end + for i= 1 : N + if (i==index_U_max) + U(index_U_max,j,t+1) = max((U(index_U_max,j,t) - MU(index_U_max,j,t)),0) + K(index_U_max,j,t); %% Backlog Queue 2 (5) pag 481 + else + U(i,j,t+1) = max(U(i,j,t),0) + K(i,j,t); % Backlog Queue 2 (5) pag 481 + end + end + % U(index_U_max,j,t+1) = max(U(index_U_max,j,t) - MU(index_U_max,j,t),0) + a(i,j).*K(index_U_max,j,t); %% Backlog Queue 2 (5) pag 481 + end + end % for each M-server + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%check points + else + bb=bb+1; + UU1=zeros(N,M,TT); + for jtest1=1:M + if (a(jtest1)==1) + UU1(:,jtest1,t)=U(:,jtest1,t); + else + UU1(:,jtest1,t)=nan; + end + end + %if (t>1) + %UU(~UU)=nan; + %end + for i= 1 : N + + if(W(i,t) > V.*alpha(i)) + R(i,t) = 0; + + else + R(i,t) = A(i,t); + end + + %list U of active (ON) servers. + + [U2, indexu2]=min(UU1(i,:,t));% page 483 routing + + %[U2, indexu2]=min(U(i,:,t)); % page 483 routing + if (W(i,t) > U2) + K(i,indexu2,t) = a(indexu2)*W(i,t); + else + K(i,:,t)=0; + end + UU1(:,indexu2,t)=nan; + %a(i,j) = (a(i,j) > 0.5); % garantee to set more than half to be -on + % fix number of active server, they are not M , they are + % obviously less + % if ((W(i,t)-sum(K(i,:,t)))>=0) + + % W(i,t+1) = W(i,t) - sum(a(i,j).*K(i,:,t)) + R(i,t); + W(i,t+1) = W(i,t) - (a*K(i,:,t)') + R(i,t); %% Backlog Queue 1 (2) pag 481 consider only active server + % else + %W(i,t+1)=R(i,t); + end + + + for j= 1 : M + a_temp(j)=a(j); + [U_max1, index_U_max1]=max(U(:,j,t)); % 0=<index_U_max<=N + + for zzz=1:length(F1) + temp1(index_U_max1,j,zzz) = U_max1.*(min(mu2(index_U_max1,j,zzz),U_max1)) - V.*beta.*(P_cpu2(index_U_max1,j,zzz)); % Resource allocation pag 483 + + end + [value2, index2]=max(temp1(index_U_max1,j,:)); % 1=<index<=length(F) + %%%%%%%%%%%%%%%checking + if (((min(mu2(index_U_max1,j,index2),U_max1))==0) && (P_cpu2(index_U_max1,j,index2))==0) + cc=cc+1; + a(j)=0; + if (t==1) + Switch(j,t)=k_e*(F1(index2))^2; + Freqtemp(j,2)=F1(index2); + else + Switch(j,t)=k_e*(F1(index2)-Freqtemp(j,t-1))^2; + Freqtemp(j,t)=F1(index2); + end + MU(index_U_max1,j,t)=0; + P(j,t)=0; + else + a(j)=1; + MU(index_U_max1,j,t) = min(mu2(index_U_max1,j,index2),U_max1); + P(j,t)= P_cpu2(index_U_max1,j,index2); + if (t==1) + Switch(j,t)=k_e*(F1(index2))^2; + Freqtemp(j,2)=F1(index2); + else + Switch(j,t)=k_e*(F1(index2)-Freqtemp(j,t-1))^2; + Freqtemp(j,t)=F1(index2); + end + end + %%%%%%%%%%%% + + + for i= 1 : N + if (i==index_U_max1) + U(index_U_max1,j,t+1) = max(U(index_U_max1,j,t) - MU(index_U_max1,j,t),0) + K(index_U_max1,j,t); % Backlog Queue 2 (5) pag 481 + else + U(i,j,t+1) = max(U(i,j,t),0) + K(i,j,t); % Backlog Queue 2 (5) pag 481 + end + end + % U(index_U_max,j,t+1) = max(U(index_U_max,j,t) - MU(index_U_max,j,t),0) + a(i,j).*K(index_U_max,j,t); %% Backlog Queue 2 (5) pag 481 + % if + end % for each M-server + + + %*************************VM_MIGRATION****************** + on_servers = zeros(N+1,M); % on-server in each different frame T + off_servers = zeros(N+1,M); % off-server in each different frame T + sleeping_servers= zeros(N+1,M); + + for jj = 1 : M + for ii = 1 : N + if ((a_temp(jj)==0) && (a(jj)==1)) || (((a_temp(jj)==1) && (a(jj)==1))) + on_servers(1,jj) = jj; %always ON servers + OFF--->> ON servers + on_servers(ii+1,jj) = U(ii,jj,t); + %M1 = M1 + 1; + else if((a_temp(jj)==1) && (a(jj)==0)) + off_servers(1,jj) = jj; + off_servers(ii+1,jj) = U(ii,jj,t); + %M2 = M2 + 1; + + else + sleeping_servers(1,jj)=jj; %the servers which are never ON, ALWAYS OFF + sleeping_servers(ii+1,jj) = U(ii,jj,t); + %M3=M3+1; + end + + end + + end + end + + + + on_servers = deletezero(on_servers); + off_servers= deletezero(off_servers); + sleeping_servers=deletezero(sleeping_servers); + [x1, x2]=size(on_servers); + M1=x2; + [y1, y2]=size(off_servers); + M2=y2; + [z1, z2]=size(sleeping_servers); + M3=z2; + + L_off(bb)=sum(sum(off_servers(2:N+1,:))) ; % the total migrated backlogs of all aplication in bits from the off servers + for jk = 1 : M2 + for iii = 1 : N + + + [a_tempON, indexON] = min(on_servers(iii+1,:)); + tempOnserver=off_servers(iii+1,jk); + on_servers(iii+1,indexON) = on_servers(iii+1,indexON)+tempOnserver; + off_servers(iii+1,jk)=0; + + + + end + end + + + a=zeros(1,M); + for dom=1:M1 + if (on_servers(1,dom)>=1) + a(on_servers(1,dom))=1; + for i= 1 : N + U(i,on_servers(1,dom),t+1)=on_servers(i+1,dom); + end + end + end + for dom=1:M2 + a(off_servers(1,dom))=0; + for i= 1 : N + U(i,off_servers(1,dom),t+1)=0; + end + end + % for dom=1:M3 + % a(sleeping_servers(1,dom))=0; + % end + + + MM1(bb)=M1; + MM2(bb)=M2; + MM3(bb)=M3; + M1=0; + M2=0; + M3=0; + end % t=nT + + +end % biggggg for TT + + for ii= 1:N + r(ii) = mean(R(ii,:)); % throughput 4 each ii + ww(ii) = mean(W(ii,:)); % average occupation for each applications before router + for jj = 1:M + e(jj) = mean(P(jj,:)); %pag482 (7) + SW(jj)= mean (Switch(jj,:)); + AU(ii,jj) = mean(U(ii,jj,:)); % average occupation of service rate for application i in sererver j in block 2 + KU(ii,jj) = sum(K(ii,jj,:)); % average occupation of backlogs (in queue) of block 2 (queues in servers) + avg_MU(ii,jj)= mean(MU(ii,jj,:)); + end + +end + +KUU=0; + + for i= 1:N + for j= 1:M + KUU=KU(i,j)+KUU; + end + end + +KUU=KUU/(M*N*TT); +for i= 1:N +Delay(i)=ww(i)/ r(i); % delay takes for each application queue before routing + +end + + +Avg_Delay1=mean(Delay(:)); % average delay of BLOCK 1 (before routing to the servers) + + + +for i= 1:N +for j= 1:M +%Delay2(i,j)=AU(i,j)./ KU(i,j); % delay takes for application i in server j in block 2 +Delay2(i,j)=AU(i,j)./ KUU; % delay takes for application i in server j in block 2 +end +end + + + +for j= 1:M +Avg_SDelay(j)=mean(Delay2(:,j)); % average delay takes for server j in block 2 +end + + +Avg_Delay2=mean(Avg_SDelay(:)); % average dalay of BLOCK 2 (after routing to the servers and after servers ) + + + +TOT_DELAY=Avg_Delay1+Avg_Delay2; %average total delay of WHOLE SYSTEM +UUTILITY = alpha(1).*sum(r(:)) - beta.*sum(e(:)); % UTILITY OF THE SYSTEM + + + +%AVG_UTILITY = mean(UUTILITY(:)); % total utility of the SYSTEM + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +% +% +% www=mean(ww(:)); % average occpuation of all applications +% for i = 1 : N +% AAU(i)=mean(AU(i,:)); % average occupation of each backlogs application in the system +% avg_AMU(i)=mean(avg_MU(i,:)); +% end +% +% for j = 1 : M +% SAU(j)=mean(AU(:,j)); % average occupation of total backlogs applications in each server j +% avg_SMU(jj)=mean(avg_MU(:,j)); +% end +% +% TAU=mean(AAU(:)); % average occupation for : server for : applications +% Tavg_MU=mean(avg_AMU(:)); +% +% +% AS = www + TAU ; % total average occupations of the system +% +% Avg_DELAY = AS/mean(r(:)); % average delay of the system +% +% AAS(:) = ww(:) + AAU(:) ; % total average occupations of the system for each application +% +% Avg_ADELAY(:) = AAS(:)./r(:); % average delay of the system for each application +% +% Avg_SDELAY(:) = SAU(:)./avg_SMU(:); +% +% UTILITY = alpha(1)*sum(r(:)) - beta*sum(e(:)); diff --git a/ICC2015_Sourcecode/Lyapunov5_Static_V_Fixed_Switch.m b/ICC2015_Sourcecode/Lyapunov5_Static_V_Fixed_Switch.m new file mode 100644 index 0000000..8d807cf --- /dev/null +++ b/ICC2015_Sourcecode/Lyapunov5_Static_V_Fixed_Switch.m @@ -0,0 +1,681 @@ +%variables inizialization utilizzo flessibile delle code , non ha vincoli +%di tempo di servizio.% CHE THROUPUT GARANTISCONO? E COSTO AL VARIARE v +clc +clear all +close all +cc=0; +N = 1; %applications pag 479 +M = 100; %Servers pag 479 +Ts = 2; %time slot (sec) +TT = 2000; +T=2000; +k_e=0.005; %(milliJ/(MHz)^2) +%Lamda = 2000.*ones(N,TT); %Number of slot +%A = 2.*Lamda.*rand(N,TT); %Arrival job uniformed distribuited pag 481 +%A=4000.*rand(N,TT); %PMR = 1 +%A = 3000 +(4000-2000).*rand(N,TT); %PMR = 1.25 +%A = 2000 +(6000-2000).*rand(N,TT) ; %PMR = 1.5 +% A = 1000 +(7000-1000).*rand(N,TT); %PMR = 1.75 +%A = 8000.*rand(N,TT); %PMR = 2 +%save('Avalue4000PMR2.mat','A'); +%A=load('Avalue4000PMR2.mat','A'); + +%L_tot_vect = 6+ round((10-6) * rand(N,TT)); % PMR=1.25, L_tot=8+-2 +%save('workloads8PMR125No2000.mat', 'L_tot_vect'); %loading 100 fixed random workloads +A=load('workloads8PMR125No2000.mat','L_tot_vect'); +A=A.L_tot_vect; + + +%F1 = [1.6*10^9 :0.2*10^9:2.6*10^9]; %frequecny range for every VM allocated onto the j-server +F1 = [5,50,70,90,105]; %( Gbyte/s)frequecny range for every VM allocated onto the j-server +I = ones(M,TT); %resource decision allocation +P_cpu1 = zeros(N,M,length(F1)); +mu1=zeros(N,M,length(F1)) ; %power consuption for each VM onto each j server +P_min1 = 0.*ones(N,M,length(F1)); %minimum power for the considered VM allocated onto the j-server +P_max1 = 60.*ones(N,M,length(F1)); %maximum power for the considered VM allocated onto the j-server + +MU=zeros(N,M,TT); %service rate (request/slots) +ww = zeros(1,N); +AU = zeros(N,M); +AAU = zeros(1,N); +SAU = zeros(1,M); +AAS = zeros(1,N); +Avg_ADELAY = zeros(1,N); +avg_MU=zeros(N,M); +avg_AMU=zeros(1,N); +avg_SMU=zeros(1,M); +Avg_SDELAY = zeros(1,M); +Avg_SDelay=zeros(1,M); + +KU= zeros(N,M); +Delay=zeros(1,N); +Delay2=zeros(N,M); +%Avg_Delay1=0; +%UUTILITY = 0; + +alpha = ones(1,N); %throughput utility weights +%V1 = [1:100:1000]; %control parameter for DCA +V = 100; +%V=length(V1) +beta = 1; % non-negative normalizing weight +W = zeros(N,TT); %Buffer Dimension +K = zeros(N,M,TT); % ==R(i,j) number of requests for application i that are routed from the R(i) router Buffer to the j-server in slot t. +U = zeros(N,M,TT); %queing dynamics for the request of application i at server j +P = zeros(M,TT); % Switch consumed by each server in each time slot for s +Switch=zeros(M,TT); % power consumed by each server in each time slot for s +r = zeros(1,N); %average expected rate of admitted request for apllication i +e = zeros(1,M); %the time average expected power consuption of server j +SW= zeros(1,M); %the time average expected power consuption of server j +R = zeros(N,TT); %the time average expected switch power consuption of server j +Freq1 = zeros(N,M,length(F1)); +Freqtemp = zeros(M,TT); +temp1 = zeros(N,M,length(F1)); +active_servers = zeros(N+1,M,T); +M1=0; +M2=0; +M3=0; +l=0; +on_servers_list=zeros(1,M); +on_servers = zeros(N+1,M); % on-server in each different frame T +off_servers = zeros(N+1,M); % off-server in each different frame T +sleeping_servers= zeros(N+1,M); % Hybernated-server in each different frame T + a = rand(1,M); % applications variable indicator + save('avalue.mat','a'); +a=load('avalue.mat','a'); +a=a.a; +a(:)=(a(:) >= 0.4); +ACTIVE_Num=1; +a1=zeros(1, M); +%a1(:) = a(:); +count=0; % static servers 1: static server is and 0: this servers is Dynamic +for j=1:M + if (a(j)==1) && (count<ACTIVE_Num) + a1(j)=1; + count=count+1; + end +end +for j=1:M + if (a(j)==1) + on_servers(1,j)=j; + l=l+1; + on_servers_list(j)=j; + end +end + +a_temp = zeros(1,M); % temp applications variable indicator +%a_temp(:)=(a_temp(:) >= 0.6); + +for i = 1:N + for j = 1:M + Freq1(i,j,:)= F1(:); + end +end + +for i=1:N + for j=1:M + mu1(i,j,:) = (8*10^(-3).*F1(:)) +0.76; % servers queue for each application service rate (5,0.8)-----(105,1.6) + P_cpu1(i,j,:)=P_min1(i,j,:) + (50*10^(-4)).*((Freq1(i,j,:)-5).^2); % CPU power of each virtual machine among each j-server pag 480 + end +end + +i=0; +j=0; +F3= [0, 5,50,70,90,105]; %frequecny range for every VM allocated onto the j-server +temp3 = zeros(N,M,length(F3)); +P_cpu3 = zeros(N,M,length(F3)); % power consuption for each VM onto each j server +P_min3 = 0.*ones(N,M,length(F3)); %minimum power for the considered VM allocated onto the j-server +P_max3 = 60.*ones(N,M,length(F3)); %maximum power for the considered VM allocated onto the j-server +mu3 = zeros(N,M,length(F3)) ; +Freq3 = zeros(N,M,length(F3)); +for i = 1:N + for j = 1:M + Freq3(i,j,:)= F3(:); + end +end + +for i=1:N + for j=1:M + mu3(i,j,2:1:length(F3)) = (8*10^(-3).*F3(2:1:length(F3)))+0.76; % servers queue for each application service rate (5,0.8)-----(105,1.6) + mu3(i,j,1) = 0; + P_cpu3(i,j,2:1:length(F3))=P_min3(i,j,2:1:length(F3)) + (50*10^(-4)).*((Freq3(i,j,2:1:length(F3))-(5)).^2); % CPU power of each virtual machine among each j-server pag 480 + P_cpu3(i,j,1)=0; + + end +end +F2= [0, 105]; %frequecny range for every VM allocated onto the j-server (STATIC server) +P_cpu2 = zeros(N,M,length(F2)); +P_min2 = 0.*ones(N,M,length(F2)); %minimum power for the considered VM allocated onto the j-server +P_max2 = 60.*ones(N,M,length(F2)); %maximum power for the considered VM allocated onto the j-server +mu2 = zeros(N,M,length(F2)) ; +%temp2 = zeros(N,M,length(F2)); +Freq2 = zeros(N,M,length(F2)); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%(STATIC server) +for i=1:N + for j=1:M + mu2(i,j,2) = (8*10^(-3).*F2(2))+0.76; % servers queue for each application service rate (5,0.8)-----(105,1.6) + mu2(i,j,1) = 0; + P_cpu2(i,j,2)=P_min2(i,j,length(F2)) + (50*10^(-4)).*((Freq2(i,j,length(F2))-(5)).^2); % CPU power of each virtual machine among each j-server pag 480 + P_cpu2(i,j,1)=0; + + end +end + +i=0; +j=0; +UU=zeros(N,M,TT); +UU1=zeros(N,M,TT); +B = [1:1:TT/T]; +L_off=zeros(1,length(B)); +MM1=zeros(1,length(B)); +MM2=zeros(1,length(B)); +MM3=zeros(1,length(B)); +bb=0; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%main body code +for t = 1 : TT + if (mod(t,T)~= 0) + UU=zeros(N,M,TT); + for jtest=1:M + if (a(jtest)==1) + UU(:,jtest,t)=U(:,jtest,t); + else + UU(:,jtest,t)=nan; + end + end + %if (t>1) + %UU(~UU)=nan; + %end + for i= 1 : N + + % + %j + t + if(W(i,t) > V.*alpha(i)) + R(i,t) = 0; + + else + R(i,t) = A(i,t); + end + + %list U of active (ON) servers. + + + [U1, indexu1]=min(UU(i,:,t));% page 483 routing + if (W(i,t) > U1) || (isnan(U1)) + K(i,indexu1,t) = W(i,t); + else + K(i,:,t)=0; + end + + UU(:,indexu1,t)=nan; + + % [U1, ind]=min(U(i,:,t));% page 483 routing + % if (W(i,t) > U1) + % for ikl=1:M + % for mmmm=1:N + % K(mmmm,ikl,t)=K(mmmm,ikl,t-1); + % end + % end + % K(i,ind,t) = W(i,t); + % + % else + % K(i,:,t)=0; + % end + + + %a(i,j) = (a(i,j) > 0.5); % garantee to set more than half to be -on + % fix number of active server, they are not M , they are + % obviously less + + %if sum(a(i,j)*K(i,j,t)<=W(i,t)) + %if ((W(i,t)-sum(K(i,:,t)))>=0) + + % W(i,t+1) = W(i,t) - sum(a(i,j).*K(i,:,t)) + R(i,t); + W(i,t+1) = W(i,t) - (a*K(i,:,t)') + R(i,t); %% Backlog Queue 1 (2) pag 481 consider only active server + % else + % W(i,t+1)=R(i,t); + % end + + end % for N-application + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% after routing inside each server + for j= 1 : M + if (a(j)==1) && (a1(j)==0) % for Dynamic ON server + [U_max1 , index_U_max1]=max(U(:,j,t)); % 0=<index_U_max<=N + + for zzz=1:length(F1) + temp1(index_U_max1,j,zzz) = U_max1.*(min(mu1(index_U_max1,j,zzz),U_max1)) - V.*beta.*(P_cpu1(index_U_max1,j,zzz)); % Resource allocation pag 483 + + end + + [value1 , index1]=max(temp1(index_U_max1,j,:)); % 1=<index<=length(F) + + MU(index_U_max1,j,t) = min(mu1(index_U_max1,j,index1),U_max1); + P(j,t)= P_cpu1(index_U_max1,j,index1); + if (t==1) + Switch(j,t)=k_e*(F1(index1))^2; + Freqtemp(j,2)=F1(index1); + else + Switch(j,t)=k_e*((F1(index1)-Freqtemp(j,t-1)))^2; + Freqtemp(j,t)=F1(index1); + end + for i= 1 : N + if (i==index_U_max1) + U(index_U_max1,j,t+1) = max((U(index_U_max1,j,t) - MU(index_U_max1,j,t)),0) + K(index_U_max1,j,t); %% Backlog Queue 2 (5) pag 481 + else + U(i,j,t+1) = max(U(i,j,t),0) + K(i,j,t); % Backlog Queue 2 (5) pag 481 + end + end + % U(index_U_max,j,t+1) = max(U(index_U_max,j,t) - MU(index_U_max,j,t),0) + a(i,j).*K(index_U_max,j,t); %% Backlog Queue 2 (5) pag 481 + + + + % for STATIC server % for STATIC server % for STATIC server % for STATIC server % for STATIC server % for STATIC server + + + elseif (a(j)==1) && (a1(j)==1) % for Static ON server + + [U_max2 , index_U_max2]=max(U(:,j,t)); % 0=<index_U_max<=N + + MU(index_U_max2,j,t) = min(mu2(index_U_max2,j,length(F2)),U_max2); + %P(j,t)= P_cpu2(index_U_max2,j,length(F2)); + P(j,t)= P_max2(index_U_max2,j,length(F2)); + if (t==1) + Switch(j,t)=k_e*(F2(length(F2)))^2; + Freqtemp(j,2)=F2(length(F2)); + else + Switch(j,t)=k_e*((F2(length(F2))-Freqtemp(j,t-1)))^2; + Freqtemp(j,t)=F2(length(F2)); + end + for i= 1 : N + if (i==index_U_max2) + U(index_U_max2,j,t+1) = max((U(index_U_max2,j,t) - MU(index_U_max2,j,t)),0) + K(index_U_max2,j,t); %% Backlog Queue 2 (5) pag 481 + else + U(i,j,t+1) = max(U(i,j,t),0) + K(i,j,t); % Backlog Queue 2 (5) pag 481 + end + end + + end + end % for each M-server + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%check points + else + bb=bb+1; + UU1=zeros(N,M,TT); + a_temp = zeros(1,M); + for jtest1=1:M + if (a(jtest1)==1) + UU1(:,jtest1,t)=U(:,jtest1,t); + else + UU1(:,jtest1,t)=nan; + end + end + %if (t>1) + %UU(~UU)=nan; + %end + for i= 1 : N + + if(W(i,t) > V.*alpha(i)) R(i,t) = 0; + + else + R(i,t) = A(i,t); + end + + %list U of active (ON) servers. + + [U2, indexu2]=min(UU1(i,:,t));% page 483 routing + + %[U2, indexu2]=min(U(i,:,t)); % page 483 routing + if (W(i,t) > U2) + K(i,indexu2,t) = a(indexu2)*W(i,t); + else + K(i,:,t)=0; + end + UU1(:,indexu2,t)=nan; + %a(i,j) = (a(i,j) > 0.5); % garantee to set more than half to be -on + % fix number of active server, they are not M , they are + % obviously less + % if ((W(i,t)-sum(K(i,:,t)))>=0) + + % W(i,t+1) = W(i,t) - sum(a(i,j).*K(i,:,t)) + R(i,t); + W(i,t+1) = W(i,t) - (a*K(i,:,t)') + R(i,t); %% Backlog Queue 1 (2) pag 481 consider only active server + % else + %W(i,t+1)=R(i,t); + end + + + for j= 1 : M + a_temp(j)=a(j); + + if (a1(j)==0) % for Dynamic server + + [U_max3, index_U_max3]=max(U(:,j,t)); % 0=<index_U_max<=N + + for zzz=1:length(F3) + temp3(index_U_max3,j,zzz) = U_max3.*(min(mu3(index_U_max3,j,zzz),U_max3)) - V.*beta.*(P_cpu3(index_U_max3,j,zzz)); % Resource allocation pag 483 + + end + [value3, index3]=max(temp3(index_U_max3,j,:)); % 1=<index<=length(F) + + if (((min(mu3(index_U_max3,j,index3),U_max3))==0) && (P_cpu3(index_U_max3,j,index3)==0)) + cc=cc+1; + a(j)=0; + MU(index_U_max3,j,t) = 0; + P(j,t)= 0; + if (t==1) + Switch(j,t)=k_e*(F3(index3))^2; + Freqtemp(j,2)=F3(index3); + else + Switch(j,t)=k_e*(F3(index3)-Freqtemp(j,t-1))^2; + Freqtemp(j,t)=F3(index3); + end + else + a(j)=1; + MU(index_U_max3,j,t) = min(mu3(index_U_max3,j,index3),U_max3); + P(j,t)= P_cpu3(index_U_max3,j,index3); + if (t==1) + Switch(j,t)=k_e*(F3(index3))^2; + Freqtemp(j,2)=F3(index3); + else + Switch(j,t)=k_e*(F3(index3)-Freqtemp(j,t-1))^2; + Freqtemp(j,t)=F3(index3); + end + end + + for i= 1 : N + if (i==index_U_max3) + U(index_U_max3,j,t+1) = max(U(index_U_max3,j,t) - MU(index_U_max3,j,t),0) + K(index_U_max3,j,t); % Backlog Queue 2 (5) pag 481 + else + U(i,j,t+1) = max(U(i,j,t),0) + K(i,j,t); % Backlog Queue 2 (5) pag 481 + end + end + + % for STATIC server % for STATIC server % for STATIC server % for STATIC server % for STATIC server % for STATIC server + + elseif (a1(j)==1) % for STATIC server + + [U_max4 , index_U_max4]=max(U(:,j,t)); % 0=<index_U_max<=N + MU(index_U_max4,j,t) = min(mu2(index_U_max4,j, length(F2)),U_max4); + %P(j,t)= P_cpu2(index_U_max4,j,length(F2)); + P(j,t)= P_max2(index_U_max4,j,length(F2)); + a(j)=1; % STATIC SERVER IS ALWAYS ON + if (t==1) + Switch(j,t)=k_e*(F2(length(F2)))^2; + Freqtemp(j,2)=F2(length(F2)); + else + Switch(j,t)=k_e*(F2(length(F2))-Freqtemp(j,t-1))^2; + Freqtemp(j,t)=F2(length(F2)); + end + for i= 1 : N + if (i==index_U_max4) + U(index_U_max4,j,t+1) = max(U(index_U_max4,j,t) - MU(index_U_max4,j,t),0) + K(index_U_max4,j,t); % Backlog Queue 2 (5) pag 481 + else + U(i,j,t+1) = max(U(i,j,t),0) + K(i,j,t); % Backlog Queue 2 (5) pag 481 + end + end + + end % end of for Dynamic server + + % U(index_U_max,j,t+1) = max(U(index_U_max,j,t) - MU(index_U_max,j,t),0) + a(i,j).*K(index_U_max,j,t); %% Backlog Queue 2 (5) pag 481 + % if + end % for each M-server + + + %*************************VM_MIGRATION****************** + on_servers = zeros(N+1,M); % on-server in each different frame T + off_servers = zeros(N+1,M); % off-server in each different frame T + sleeping_servers= zeros(N+1,M); + + for jj = 1 : M + for ii = 1 : N + if ((a_temp(jj)==0) && (a(jj)==1)) || (((a_temp(jj)==1) && (a(jj)==1))) + on_servers(1,jj) = jj; %always ON servers + OFF--->> ON servers + on_servers(ii+1,jj) = U(ii,jj,t); + %M1 = M1 + 1; + elseif((a_temp(jj)==1) && (a(jj)==0)) + off_servers(1,jj) = jj; + off_servers(ii+1,jj) = U(ii,jj,t); + %M2 = M2 + 1; + + elseif ((a_temp(jj)==0) && (a(jj)==0)) + sleeping_servers(1,jj)=jj; %the servers which are never ON, ALWAYS OFF + sleeping_servers(ii+1,jj) = U(ii,jj,t); + %M3=M3+1; + end + + end + + end + + + +% on_servers = deletezero(on_servers); +% [x1, x2]=size(on_servers); +% i=0; j=0; +% for j=1:x2 +% %for j=1:N +% if (on_servers(2:1:(N+1),j)==0) +% +% if ((a_temp(j)==1) && (a(j)==0) && (a1(j)==0)) +% off_servers(1,j) = j; +% off_servers(2:1:(N+1),j) = 0; +% elseif ((a_temp(jj)==0) && (a(jj)==0) && (a1(j)==0)) +% sleeping_servers(1,j)=j; %the servers which are never ON, ALWAYS OFF +% sleeping_servers(2:1:(N+1),j) = 0; +% end +% +% end +% end + on_servers = deletezero(on_servers); + on_servers = deletezero(on_servers); + off_servers= deletezero(off_servers); + sleeping_servers=deletezero(sleeping_servers); + [x1, x2]=size(on_servers); + M1=x2; + [y1, y2]=size(off_servers); + M2=y2; + [z1, z2]=size(sleeping_servers); + M3=z2; + + L_off(bb)=sum(sum(off_servers(2:N+1,:))) ; % the total migrated backlogs of all aplication in bits from the off servers + for jk = 1 : M2 + for iii = 1 : N + + + [a_tempON, indexON] = min(on_servers(iii+1,:)); + tempOnserver=off_servers(iii+1,jk); + on_servers(iii+1,indexON) = on_servers(iii+1,indexON)+tempOnserver; + off_servers(iii+1,jk)=0; + + + + end + end + + + a=zeros(1,M); + for dom=1:M1 + if (on_servers(1,dom)>=1) && (a1(on_servers(1,dom))==0) % dynamic server + a(on_servers(1,dom))=1; + for i= 1 : N + U(i,on_servers(1,dom),t+1)=on_servers(i+1,dom); + end + elseif (on_servers(1,dom)>=1) && (a1(on_servers(1,dom))==1) % static server + a(on_servers(1,dom))=1; + for i= 1 : N + U(i,on_servers(1,dom),t+1)=on_servers(i+1,dom); + end + end + end + for dom=1:M2 + a(off_servers(1,dom))=0; + for i= 1 : N + U(i,off_servers(1,dom),t+1)=0; + end + end + for dom=1:M3 + a(sleeping_servers(1,dom))=0; + end + + + MM1(bb)=M1; + MM2(bb)=M2; + MM3(bb)=M3; + M1=0; + M2=0; + M3=0; + end % t=nT + + +end % biggggg for TT + + +for ii= 1:N + r(ii) = mean(R(ii,:)); + ww(ii) = mean(W(ii,:)); % average occupation for each applications before router + for jj = 1:M + e(jj) = mean(P(jj,:)); %pag482 (7) + SW(jj)= mean (Switch(jj,:)); + AU(ii,jj) = mean(U(ii,jj,:)); % average occupation of service rate for application i in sererver j in block 2 + KU(ii,jj) = sum(K(ii,jj,:)); % average occupation of backlogs (in queue) of block 2 (queues in servers) + end + +end + +KUU=0; + + for i= 1:N + for j= 1:M + KUU=KU(i,j)+KUU; + end + end + +KUU=KUU/(M*N*TT); +for i= 1:N +Delay(i)=ww(i)/ r(i); % delay takes for each application queue before routing + +end + + +Avg_Delay1=mean(Delay(:)); % average delay of BLOCK 1 (before routing to the servers) + + + +for i= 1:N +for j= 1:M +%Delay2(i,j)=AU(i,j)./ KU(i,j); % delay takes for application i in server j in block 2 +Delay2(i,j)=AU(i,j)./ KUU; % delay takes for application i in server j in block 2 +end +end + + + +for j= 1:M +Avg_SDelay(j)=mean(Delay2(:,j)); % average delay takes for server j in block 2 +end + + +Avg_Delay2=mean(Avg_SDelay(:)); % average dalay of BLOCK 2 (after routing to the servers and after servers ) + + + +TOT_DELAY=Avg_Delay1+Avg_Delay2; %average total delay of WHOLE SYSTEM +UUTILITY = alpha(1).*sum(r(:)) - beta.*sum(e(:)); % UTILITY OF THE SYSTEM + + + +%AVG_UTILITY = mean(UUTILITY(:)); % total utility of the SYSTEM + + + + + + + + + + + + + + + + + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%for t= 1:TT-1 +% +% for ii= 1:N +% r(ii) = mean(R(ii,:)); % throughput 4 each ii +% ww(ii) = mean(W(ii,:)); % average occupation for each applications before router +% +% for jj = 1:M +% e(jj) = mean(P(jj,:)); %pag482 (7) +% AU(ii,jj) = mean(U(ii,jj,:)); % average occupation of backlogs applications of each server +% avg_MU(ii,jj)= mean(MU(ii,jj,:)); +% end +% +% end +% %end +% www=mean(ww(:)); % average occpuation of all applications +% for i = 1 : N +% AAU(i)=mean(AU(i,:)); % average occupation of each backlogs application in the system +% avg_AMU(i)=mean(avg_MU(i,:)); +% end +% +% for j = 1 : M +% SAU(j)=mean(AU(:,j)); % average occupation of total backlogs applications in each server j +% avg_SMU(jj)=mean(avg_MU(:,j)); +% end +% +% TAU=mean(AAU(:)); % average occupation for : server for : applications +% Tavg_MU=mean(avg_AMU(:)); +% +% +% AS = www + TAU ; % total average occupations of the system +% +% Avg_DELAY = AS/mean(r(:)); % average delay of the system +% +% AAS(:) = ww(:) + AAU(:) ; % total average occupations of the system for each application +% +% Avg_ADELAY(:) = AAS(:)./r(:); % average delay of the system for each application +% +% Avg_SDELAY(:) = SAU(:)./avg_SMU(:); +% +% UTILITY = alpha(1)*sum(r(:)) - beta*sum(e(:)); +% +% + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ICC2015_Sourcecode/Mu_opt_bisezione.m b/ICC2015_Sourcecode/Mu_opt_bisezione.m new file mode 100644 index 0000000..199aacc --- /dev/null +++ b/ICC2015_Sourcecode/Mu_opt_bisezione.m @@ -0,0 +1,65 @@ +%calcolo moltiplicatori con metodo bisezione + +function [mu,delta_mu]= Mu_opt_bisezione(alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot) + + +%NB. +%LA FUNZIONE DI CUI CALCOLARE LO ZERO č ASSUNTA MONOTONA CRESCENTE +%CON VALORE IN ZERO NEGATIVO E ALL'INFINITO POSITIVO +%SI ASSUME CHE VENGA CHIAMATA SOLO NEI CASI IN CUI LO ZERO ESISTE FINITO. +%ALTRIMENTI VA IN LOOP! + +% definisco gli estremi in cui cercare +a_mu = 0;% per mu=0 si ha sum(L)<L_tot +%b_mu = 2.*10^3; %<==== NB. SCEGLIERE CON ATTENZIONE IN BASE AI PARAMETRI DI SISTEMA! +b_mu=max(((1./alpha_mu).*(f_max-alpha_zero.*f_zero))+2.*P_net./C_max); % <== per questo mu si ha f=f_max quindi sum(L)>L_tot +%b_mu = 2.*10^0; + + +toll = 10^-6; + +fa=delta_carico(a_mu,alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot); +fb=delta_carico(b_mu,alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot); + +% verifico che la funzione abbia uno zero +while (fa.*fb) > 0 + b_mu=2.*b_mu; + fb=delta_carico(b_mu,alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot); + %fprintf('%d\n',t) + error('estremi iniziali ricerca mu_opt errato') + +end + + +iterazioni = ceil(log2(b_mu-a_mu)-log2(toll)); +% fprintf('%d\n......iteraion',iterazioni); +% fprintf('%d\n......b_mu',b_mu); +% fprintf('%d\n......a_mu',a_mu); +% fprintf('%d\n......toll',toll); + + for i = 1: iterazioni + c_mu=(a_mu+b_mu)/2;% punto medio + fc = delta_carico(c_mu,alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot); + if abs(fc)<toll + break + end + if abs(b_mu-a_mu)< toll + break + end +% tolf = toll.*(abs((fb-fa)./(b_mu-a_mu))); %ELIMINATO - NEL CASO +% DI GRADINO FUORVIANTE +% if abs(fc)<=tolf +% 'Attenzione Probabile Gradino' +% i +% break +% end + if (fa.*fc)<0 %la soluzione č fra a e il punto medio + b_mu=c_mu; %tengo la met sinistra dell'intervallo + fb = fc; + else % altrimenti tengo la metŕ destra + a_mu=c_mu; + fa = fc; + end + end + mu=c_mu; + delta_mu=fc; diff --git a/ICC2015_Sourcecode/X.mat b/ICC2015_Sourcecode/X.mat new file mode 100644 index 0000000000000000000000000000000000000000..7ef5d3d6c698db0217767edf2f306a9221cfac39 GIT binary patch literal 75859 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 N;(|Fk{s;JcAU(&P7jXap literal 0 HcmV?d00001 diff --git a/ICC2015_Sourcecode/copyright notice.docx b/ICC2015_Sourcecode/copyright notice.docx new file mode 100644 index 0000000000000000000000000000000000000000..784f337f42d8b9b1b48e5d0f96aff2ff41d5cf93 GIT binary patch literal 15593 zcmeI3g<BlUw&(|UcXxsYm*B3!0t9yn4#C~so#5{7?(XjH5C|IF-ejM%?>;+szxV!t zdwafby84@5t5?-jb^TVYRr1nc;OGEI05kvqAOYwTd=qm80RSQ)001-qG^mEKwUxb* zmA#IVi;a<;)_Z453*sDbP^v5dDDeLOJ^lx`K%J6|oSy)4d+I&WkT!zFNjJ9Qir+#m zd-cGzqZ1XLo>Oh@%i|rQyd)cfQYjXy>c$|CGfRraD5<)ixTVZU;IOx-Zl3ZAo#HK* zSGcvBzaTaRtU0j}w*Whij&}F~HxxF?itfl2@*2S*l^qoX<$_Ok+}PtM@Rl3tGk<q1 z>8(Y-ZiJ)-a7GeD3@E%PLSnR1QjuADUaK_ZG|{_pw*;jTf4hK0(r5+k^s8J>BnU^q zqL_yr)_FRGf7vk8B4Xt&>?C@`B5Y3b#kOSpo}YD@il$mKjcH)s>JbWWs*$=-Smjb$ zBPufWb&bSI+$WRS6R_S2z_S|`!g<J*HP_xO9hf9hD}NN~uGvvu3}@GEsUS4^3^l2a zS9cSG{Tj=i`cl`<{-!2=^d0VS5uRN&)s}ys7q*!6x;d%*rqANy_A;MY%6mz(fiaDs zI{s&dfmb@$fXHH7ME9vFwVTf|iIdCMg7xd@MPw^&8wI;az~1)u1_qG-+mP+iO}YLF z{6!WxBH@5TR>#)J!j9qnukZgIs{ez>=YLc^Jhod3j0rjL-1i*$U?bfU0>!ie3&j<! z7>SX5c0IpUQbNpfb3;%`Q`J05(zxT{;N8jiSNt)&!<j){J+*mV&ZeWMDRt*%-uGu+ z=-FGQ!9Mh9O<e`e9qRno0y#4ICyGo`F#SUBV$V>*PMq^T_4f(t+%iRxyN=OQ+CrJ( zs5p3pJ#c`fz|2~-2ejQtGqx(u48PUxdTw%i2A?_X5wnolsAn6F(1!)wedB$s9FR%? zIkfzowEEmm9Z9z*39U8OCZT3GGGkuDFZBH?Z*jkNCv9qcUubs!aA!N$=HhgcRzYf0 zjPn6v9O@qj3Bbf*n;1B+HG=^F_yA}SCu>_nhJTF|Lu&&EOW+juYi|2<)PMjdIN;s? zvyZa4aoJu*WdC!CHotxDub;Arl?t&0zGL`uwoY(W2mct-_Po0Nrj#F|-a~;U-AX&@ zZXTg>!Y~_+bRoz+YMPiA@10OF*Rb<5-?^<RpFFE7-y{t}mK)kWJu|aBBMSwaAwa#+ zM+5_pvm9lWd%(A>J2<)t(;|)PFrrKKF|=N&BLsGdR3>Q*iOqy>hCDS^v6GsCn!1IZ z>#g!f{0!<@x;uyNr9T9mH#P^Hg5o`F^sL9bkhJ)8v8EKXZM23-adf`}^r4$H;t@5v zz6PIOgXe|<;zT<kUHB0|7K56Xu_F9(8azlVWx*qINJmDE&a<9%-Ou-&0U`E*KX&fX zdQ-p7EKgi28@yzpOYkrgh2P>^{M^2>{>L6>d0*K<0}BAq@B#oRz&rlvVgK2;PBq4D zcO+0dtou5IAqvl6!YN+IBY8>kdZ=*0XhUxA>l6}Ub4?}lqy0@MO?3=)tTGK*q@k}D ztxh*02q2$yMPQ7SjrVnoJRcvDD)j^iU1A?eTj+{0@<p8YU?-yp-%FzvIxW19VKs;u z1Vy<Vok5e6?$ms_Vc=)r%CI>kiDCvN	{oULT#I8{L_BaQQyrJTxP9)EXku&sy3< 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 GSN{jt*BiwE literal 0 HcmV?d00001 diff --git a/ICC2015_Sourcecode/deletezero.m b/ICC2015_Sourcecode/deletezero.m new file mode 100644 index 0000000..fe70e1a --- /dev/null +++ b/ICC2015_Sourcecode/deletezero.m @@ -0,0 +1,12 @@ +function C = deletezero(A) + +%delete columns of A containing all zero entries + +b = sum(abs(A)); +if (sum(b == 0) >= 1) + ind = find(b == 0,1,'first'); + A(:,ind) = []; + C = deletezero(A); +else + C = A; +end \ No newline at end of file diff --git a/ICC2015_Sourcecode/delta_carico.m b/ICC2015_Sourcecode/delta_carico.m new file mode 100644 index 0000000..632f943 --- /dev/null +++ b/ICC2015_Sourcecode/delta_carico.m @@ -0,0 +1,16 @@ +%FUNZIONE CHE DEFINISCE L'EQUAZIONE DA RISOLVERE PER IL CALCOLO DEL Mu +%ottimo (equazione di carico su L_tot) + + + + +function y=delta_carico(mu,alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot) + +f_mu=max(mu-2.*P_net./C_max,0); +f_star=alpha_zero.*f_zero+alpha_mu.*f_mu; +f_opt=max(0,min(f_star,f_max)); + +canali_attivi=(f_mu>0); +L_opt=canali_attivi.*(f_opt.*Delta-L_b); +y=sum(L_opt)-L_tot; % N.B. PER MU=0 Y<O; PER MU-->INF Y>0 + \ No newline at end of file diff --git a/ICC2015_Sourcecode/grafica_delta_carico.m b/ICC2015_Sourcecode/grafica_delta_carico.m new file mode 100644 index 0000000..853884e --- /dev/null +++ b/ICC2015_Sourcecode/grafica_delta_carico.m @@ -0,0 +1,6 @@ +function y=grafica_delta_carico(mu,alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot) + +y=zeros(1,length(mu)); +for k=1:length(mu) + y(k)=delta_carico(mu(k),alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot); +end \ No newline at end of file diff --git a/ICC2015_Sourcecode/tracking3.m b/ICC2015_Sourcecode/tracking3.m new file mode 100644 index 0000000..b43fa87 --- /dev/null +++ b/ICC2015_Sourcecode/tracking3.m @@ -0,0 +1,180 @@ + +%VERSIONE DEL TRACKING CON PUNTO INIZIALE DI RICERCA PER MU. + +function [conv,iter,mu_opt,ni_opt,f_opt,L_opt,alpha_step_finale,V_step_finale,mu_vect]= tracking3(L_tot,L_b,alpha_zero,alpha_mu,chi,W,T_tot,Delta,f_zero,f_max,M,Th,mu_iniz,ni_iniz,f_iniz,L_iniz,alpha_step_iniz,V_step_iniz) + + + +epsilon_ni=0; %<== N.B. shift numerico introdotto su ni; + +toll = 10^(-3);%10^(-2); +num_iterazioni=100000; +conv=0; %viene settato a 1 se il tracking arriva a convergenza. + +ni=zeros(num_iterazioni,M); +ni(1,:)=ni_iniz; +f=zeros(num_iterazioni,M); +f(1,:)=f_iniz; +L=zeros(num_iterazioni,M); +L(1,:)=L_iniz; +mu=zeros(num_iterazioni,1); +mu(1)=mu_iniz; %<== importante, inizializzazione del parametro mu. + + +beta=0.04;%0.01;%0.7;%0.1;%10^(-3);%10^(-4); +gamma=0.6;%0.4; +alpha_step=beta.*ones(num_iterazioni,1); +%alpha_step(1)=alpha_step_iniz; +V_step=zeros(num_iterazioni,1); +%V_step(1)=V_step_iniz; + +gap=zeros(num_iterazioni,1); + + +for k=2:num_iterazioni + + gap(k-1)=sum(L(k-1,:))-L_tot; + if abs(gap(k-1)./L_tot)<toll %errore relativo sotto la tolleranza + conv=1; + break + end + mu(k)=mu(k-1)-alpha_step(k-1).*gap(k-1); + mu(k)=max(0,mu(k)); + + ni_star=mu(k)-2.*log(2).*(chi./W).*2.^(2.*L(k-1,:)./(W.*(T_tot-Delta))); + ni(k,:)=max(0,ni_star); + + f_star=alpha_zero.*f_zero+alpha_mu.*ni(k,:); + f(k,:)=max(0,min(f_star,f_max)); %N.B. --> NEL CASO GENERALE DI L_b>0 IL MAX VA FATTO RISPETTO A L_b/Delta, NON RISPETTO A 0. + + canali_attivi=ni(k,:)>epsilon_ni; %<== N.B. shift numerico introdotto su ni;; + %L(k,:)=canali_attivi.*(f(k,:).*Delta-L_b)+(~canali_attivi).*max(0,(((T_tot-Delta).*W./2).*log(mu(k)./Th)./log(2))); + %L(k,:)=max(0,(((T_tot-Delta).*W./2).*log(mu(k)./Th)./log(2))); + L(k,:)=min((f(k,:).*Delta-L_b),max(0,(((T_tot-Delta).*W./2).*log(mu(k)./Th)./log(2)))); + + + + + V_step(k)=(1-alpha_step(k-1)).*V_step(k-1)-gap(k-1); + alpha_step(k)=max(0,(min(beta,alpha_step(k-1)-gamma.*V_step(k-1).*gap(k-1)))); + %alpha_step(k)=(min(beta,alpha_step(k-1)-gamma.*V_step(k-1).*gap(k-1))); + +end + + + +% V_step +% alpha_step +% gap +% mu +% ni +% f +% L + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% GRAFICI +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%% +% +% figure(num_iterazioni+1) +% plot(gap,'--o'),xlabel('iterazioni'),ylabel('gap'); +% +% figure(num_iterazioni+2) +% plot(mu,'--o'),xlabel('iterazioni'),ylabel('mu'); +% +% figure(num_iterazioni+3) +% plot(ni,'--o'),xlabel('iterazioni'),ylabel('ni'); +% +% figure(num_iterazioni+4) +% plot(f,'--o'),xlabel('iterazioni'),ylabel('f'); +% +% figure(num_iterazioni+5) +% plot(L,'--o'),xlabel('iterazioni'),ylabel('L'); +% +% figure(num_iterazioni+6) +% plot(V_step,'--o'),xlabel('iterazioni'),ylabel('V_step'); +% +% figure(num_iterazioni+7) +% plot(alpha_step,'--o'),xlabel('iterazioni'),ylabel('alpha_step'); + + + + +% I VALORI SONO CORRETTI SOLTANTO SE CONV=1 +iter=k-1; %numero iterazioni per convergenza +mu_opt=mu(k-1); +mu_vect=mu(1:k-1);% < == N.B. Restituisce in uscita il vettoredi tracking +ni_opt=ni(k-1,:); +f_opt=f(k-1,:); +L_opt=L(k-1,:); + +alpha_step_finale=alpha_step(k-1); +V_step_finale=V_step(k-1); + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +% +% +% +% +% %NB. +% %LA FUNZIONE DI CUI CALCOLARE LO ZERO č ASSUNTA MONOTONA CRESCENTE +% %CON VALORE IN ZERO NEGATIVO E ALL'INFINITO POSITIVO +% %SI ASSUME CHE VENGA CHIAMATA SOLO NEI CASI IN CUI LO ZERO ESISTE FINITO. +% %ALTRIMENTI VA IN LOOP! +% +% % definisco gli estremi in cui cercare +% a_mu = 0;% per mu=0 si ha sum(L)<L_tot +% %b_mu = 2.*10^3; %<==== NB. SCEGLIERE CON ATTENZIONE IN BASE AI PARAMETRI DI SISTEMA! +% b_mu=max(((1./alpha_mu).*(f_max-alpha_zero.*f_zero))+2.*P_net./C_max); % <== per questo mu si ha f=f_max quindi sum(L)>L_tot +% %b_mu = 2.*10^0; +% +% +% toll = 10^-6; +% +% fa=delta_carico(a_mu,alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot); +% fb=delta_carico(b_mu,alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot); +% +% % verifico che la funzione abbia uno zero +% while (fa.*fb) > 0 +% b_mu=2.*b_mu; +% fb=delta_carico(b_mu,alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot); +% %fprintf('%d\n',t) +% error('estremi iniziali ricerca mu_opt errato') +% +% end +% +% +% iterazioni = ceil(log2(b_mu-a_mu)-log2(toll)); +% +% +% for i = 1: iterazioni +% c_mu=(a_mu+b_mu)/2;% punto medio +% fc = delta_carico(c_mu,alpha_zero,alpha_mu,P_net,C_max,f_zero,f_max,Delta,L_b,L_tot); +% if abs(fc)<toll +% break +% end +% if abs(b_mu-a_mu)< toll +% break +% end +% % tolf = toll.*(abs((fb-fa)./(b_mu-a_mu))); %ELIMINATO - NEL CASO +% % DI GRADINO FUORVIANTE +% % if abs(fc)<=tolf +% % 'Attenzione Probabile Gradino' +% % i +% % break +% % end +% if (fa.*fc)<0 %la soluzione č fra a e il punto medio +% b_mu=c_mu; %tengo la met sinistra dell'intervallo +% fb = fc; +% else % altrimenti tengo la metŕ destra +% a_mu=c_mu; +% fa = fc; +% end +% end +% mu=c_mu; +% delta_mu=fc; diff --git a/ICC2015_Sourcecode/variabili.m b/ICC2015_Sourcecode/variabili.m new file mode 100644 index 0000000..1e3b8aa --- /dev/null +++ b/ICC2015_Sourcecode/variabili.m @@ -0,0 +1,10 @@ +clear all; +close all; +clc; +X = rand(1,10000000); +EPS = rand(1,10000000); +DELTA_IP = rand(1,10000000); + +save('X'); +save('EPS'); +save('DELTA_IP'); \ No newline at end of file -- GitLab