clc;
clear;
format long;
total_p_h_num = 30;%物理主机总个数
total_v_h_num = 150;%虚拟机总个数
rand('state',0);
[V,P,data,cost,B,X_map,E] = init(total_v_h_num,total_p_h_num); %初始化
m = 20; % 蚂蚁个数
Ng_max = 20; % 最大迭代次数
volatile_factor = 0.2;% 挥发因子
pheromone_factor = 2;% 信息素启发因子
visibility_factor = 3;% 能见度启发式因子
pheromone_max = 5;% 信息素最大浓度
pheromone_g = 5;% 下限因子
same_v_h_cost = 0;% 同一宿主机下的虚拟机之间通信开销为0
different_v_h_cost = 6;% 不同宿主机下的虚拟机之间通信开销(不同物理主机之间通信开销)为6
E = init_E(E,pheromone_max,pheromone_g);% 初始化信息素浓度矩阵
min_best_cost = [];
min_c_best = inf;
for Ng = 1:Ng_max
rand_h_pos = randperm(total_p_h_num);
m_pos(1,:)=rand_h_pos(1,1:m)';%将m只蚂蚁放随机放在total_p_h_num个物理主机上
for m_num = 1:m
X_map = init_X_map(X_map);
B = init_B(B);
pos = m_pos(m_num);
% 将虚拟机放置到物理主机上
num_v_h = 1;
while(num_v_h <= total_v_h_num)
visibility = calculate_visibility(B,P,V);%计算能见度
probability = calculate_probability(visibility,E,pheromone_factor,visibility_factor,pos);%计算概率转移函数
v_h = find(X_map(:,2) == 0);%寻找未被放置的虚拟机
u_v_h = [v_h';probability(v_h')];
[pro,index] = sort(u_v_h(2,:),'descend');
v_pos = v_h(index(1));
pos = find_p_pos(B,V,v_pos,pos,total_p_h_num);%寻找虚拟机放置位置
[B,X_map] = put_v_p(V,v_pos,B,pos,X_map);% 将虚拟机放置在物理机中
num_v_h = num_v_h + 1;
pos = rand_pos(total_p_h_num);%随机选择一个物理主机作为下一个虚拟机的放置点
end
% 计算通信开销
cost = calculate_cost(X_map,cost,same_v_h_cost,different_v_h_cost);% 计算虚拟机通信开销
c_best = calculate_total_cost(P,B,data,cost)
if( min_c_best - c_best)>0.00000001
min_c_best = c_best;
end
min_c_best
% 更新信息素
min_best_cost = [min_best_cost; min_c_best];
E = update_E(E,min_c_best,volatile_factor,pheromone_max,pheromone_g);
end
end
figure(1);
plot(min_best_cost');
xlabel('迭代次数'),ylabel('最小代价');
title('首次适应法-FF');
评论1
最新资源