Professional Documents
Culture Documents
TRABALHO 01
5 CONCLUSÃO................................................................................................................. 13
1 Estruturação do Problema
1.1 Objetivos
Os dois objetivos deste trabalho são: maximizar a cobertura e autonomia da rede de sensores.
A cobertura da rede é dada por:
A interseção entre as áreas cobertas por dois sensores ou mais deverá ser contabilizada apenas
uma vez (área azul mostrada na Figura 1.2); caso parte da cobertura do sensor esteja fora da
área total (área em vermelho), esta será desconsiderada no cálculo da área coberta pela rede.
Número de Ciclos
Autonomia (1.2)
Número de Ciclos Total
O ciclo é definido como o evento onde todos os sensores ativos enviam as informações para o
NRCN. O número de ciclos é a quantidade de ciclos necessários para que a área total coberta
pelos sensores fique abaixo de 90% da área inicial. O número de ciclos total é a máxima
5
quantidade de ciclos até que todos os sensores fiquem impossibilitados de enviar suas
informações para o NRCN, por falta de conexão ou por falta de carga.
X x1 y5
T
x5 y1
(1.3)
1.3 Restrições
2 Descrição da Metodologia
O algoritmo de otimização será composto por três rotinas principais que tem as seguintes
funções:
i. Calcular a área coberta pela rede.
ii. Calcular a autonomia da rede.
iii. Executar a otimização multiobjetivo usando algoritmo genético.
6
Para determinar a área coberta é necessário inicialmente avaliar quais sensores podem enviar
informação para o LRCN. Deve-se então, para um conjunto de sensores, determinar quais são
os sensores vizinhos (possuem distâncias entre si menor que o raio) e qual o caminho mais
rápido para levar a informação até o sensor central. O método adotado nesse trabalho consiste
em transformar a região quadrada onde os sensores são posicionados em uma matriz com
dimensão n x n conforme mostrado na Figura 2.1.
x
ic ceil n
L
y
jc ceil n
L (2.1)
R
nsweep ceil sensor n
L
ic nsweep
Indexinitial
jc nsweep
ic nsweep
Index final
jc nsweep (2.2)
Repetindo esse processo para todos os sensores determina-se a matriz que contém as
relações entre os sensores conforme mostrado abaixo:
0 1 3 4 5 1
1 0 2 1 1 1
2 1 1 1 1 1
R
3 0 5 1 1 1
4 0 5 1 1 1
5 0 3 4 1 1 (2.3)
que esses sensores estão conectados ao LRCN; quando não existe mais sensores conectados
então a posição é preenchida com o valor -1.
Uma vez determinada as conexões dos sensores deve-se procurar pelo caminho mais
curto entre o um determinado sensor e o LRCN, o qual pode ser obtido pelo método BFS
(Breadth First Search). Essa função foi implementada, tendo como entrada a matriz R da
equação 2.3 e retorna como saída a seguinte matriz:
0 0 0 0 0
1 1 3 4 5
1 2 1 1 1
BFS
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1 (2.4)
Cada coluna da matriz mostrada na Equação 2.4 representa o caminho mais curto entre
um sensor e o LRCN. Caso não haja nenhum caminho a coluna será toda igual a -1, o sensor
não irá contribuir para o funcionamento da rede e deverá ser excluído do cálculo.
9
Por fim, o cálculo da área de cobertura será obtido por meio da definição de uma nova
matriz 𝑀𝑡𝑜𝑡𝑎𝑙 que contém a soma das matrizes correspondentes aos nós que são capazes de
enviar informação para o LRCN. Os valores de 𝑀𝑡𝑜𝑡𝑎𝑙 são normalizados de tal forma que serão
iguais a 1 onde existir um sensor e sua área de cobertura e 0 caso contrário. Sendo assim a área
coberta pela rede poderá ser calculada como:
2
10
i 1 j 1 M total (i, j)
n n
Área Coberta Pela Rede (2.5)
n 1
Na Figura 2.3 abaixo está ilustrado o processo iterativo utilizado para calcular a autonomia da
rede. O algoritmo é composto por um ciclo global, que será executado no máximo 100 vezes.
Cada vez que esse ciclo é executado realiza-se o envio de informação de todos os sensores,
atualiza-se a carga e as conexões até o LRCN.
Durante esse processo a área coberta pela rede é constantemente avaliada e, no momento que
seu valor fica abaixo de 90% da área inicial, grava-se o número de ciclos já executados.
Para executar a otimização multiobjetivo, onde-se deseja maximizar área coberta e a autonomia
da rede é utilizada a função gamultiobj do software Matlab. Essa função recebe como entradas
as funções que se deseja otimizar (funções para cálculo da área e autonomia), o número de
variáveis de entrada e os limites inferior e superior que podem ser atribuidos às mesmas.
O resultado da otimização será uma solução de Pareto ótima, ou seja, o conjunto de
coordenadas de sensores tal que não é possível obter uma melhora em um dos objetivos sem
que haja uma diminuição do outro objetivo.
A Figura 3.1 mostra o espalhamento médio de cada geração até obter a Frente de Pareto
4
3 1
5
2
Objetivo 1 - Autonomia
(3.1)
Objetivo 2 - Cobertura
Figura 3.3 – Posicionamento dos sensores nos pontos da solução de Pareto Ótima
13
Para a situação onde o LRCN está localizado no centro do espaço de projeto a otimização
mostrou que os pontos ótimos da Frente Pareto representam layouts de posicionamento que
estão entre dois extremos, o primeiro onde todos os sensores estão conectados ao LRCN
(favorece a autonomia mas prejudica a cobertura), e o segundo onde todos os sensores se
conectam ao LRCN por meio de um único sensor (posicionamento que possui a pior autonomia
mas a área de cobertura é maior que no primeiro caso).
A solução ótima utilizando a otimização multiobjetivo por meio de um algoritmo
genético resulta em um posicionamento onde pelo menos um dos sensores transmite os dados
de um sensor vizinho, além de seu próprio envio de informação para o LRCN. Além disso, a
distância entre os centros dos sensores e LRCN é a máxima possível, evitando assim a
sobreposição de cobertura com sensores vizinhos e aumentando a área de atuação.
5 Conclusão
6 Código de Otimização
FitnessFunction = @main;
numberOfVariables = 10;
A = []; b = [];
Aeq = []; beq = [];
lb = 0*ones(numberOfVariables,1);
ub = 10*ones(numberOfVariables,1);
options =
gaoptimset('Display','iter','PlotFcns',{@gaplotpareto,@gaplotscoredivers
ity,@gaplotspread});
[x,fval] =
gamultiobj(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub,options);
end
function y = main(x)
R = 2;
L = 10;
n = 150;
n_coord = length(x)/2;
coord_sensor = zeros(n_coord+1,2);
coord_sensor(1,1) = 5;
coord_sensor(1,2) = 5;
coord_sensor(2:end,1) = x(1:n_coord);
coord_sensor(2:end,2) = x(n_coord+1:end);
% plot_chart(coord_sensor,R,title_chart);
[endurance,covered_area_ratio] = get_max_cycles(coord_sensor,R,L,n);
y(1) = endurance;
y(2) = covered_area_ratio;
end
15
[fastest_path,coord_sensor,nodes_to_delete,covered_area_initial] =
updated_fastest_path(coord_sensor,R,L,n);
covered_area_ratio = covered_area_initial/L^2;
max_packs = 100;
max_iter = max_packs*2;
number_of_nodes = size(coord_sensor,1);
covered_area_criteria = 0.90;
number_of_trans_before_reach_cov_area = 0;
packs_count = zeros(number_of_nodes,2);
packs_count(:,1) = find(nodes_to_delete==0)-1;
packs_count(:,2) = max_packs;
number_of_transmission = 0;
all_nodes_died = 0;
if size(fastest_path,2)== 0
% fprintf('\n Max. Number of Transmission: %d\n',0);
else
for kk = 1:max_iter
number_of_cols_to_sweep = size(fastest_path,2);
j = 1;
while j<=number_of_cols_to_sweep
for i=1:size(packs_count,1)%varrendo ao longo das linhas
if fastest_path(i,j)>-1%otimizar isso depois
line_being_checked = find((packs_count(:,1)==fastest_path(i,j))==1);%linha
correspondente ao no que zerou o contador
if line_being_checked>1 %se esta analisando o no apos o NRCN
%reduzindo o numero de transmissoes do contador
packs_count(line_being_checked,2) = packs_count(line_being_checked,2)-1;
end
end
end % iteracao nos packs
if size(line_to_be_deleted,1)>0
16
coord_sensor(line_to_be_deleted,:) = [];
packs_count(line_to_be_deleted,:) = [];
packs_count(line_to_be_deleted:end,1) =
packs_count(line_to_be_deleted:end,1)-1;%cuidado aqui
coord_sensor_old = coord_sensor;
[fastest_path,coord_sensor,nodes_to_delete,covered_area]
= updated_fastest_path(coord_sensor,R,L,n);
nodes_remaining = get_nodes_remaining(fastest_path);
if
(covered_area/covered_area_initial)<covered_area_criteria &&
number_of_trans_before_reach_cov_area == 0
number_of_trans_before_reach_cov_area = kk;
end
packs_count_temp = zeros(size(coord_sensor,1),2);
for qq = 1:size(packs_count_temp,1)
index_row =
find(ismember(coord_sensor_old,coord_sensor(qq,:),'rows')==1);
packs_count_temp(qq,2) = packs_count(index_row,2);
packs_count_temp(qq,1) = nodes_remaining(qq);
end
packs_count = packs_count_temp;
number_of_cols_to_sweep = size(fastest_path,2);
end
if size(fastest_path,2)== 0 | fastest_path==-1
all_nodes_died = 1;
break;
end
j=j+1;
end
if all_nodes_died
% fprintf('\n All nodes died!');
break;
end
end
17
number_of_transmission = kk;
end
if number_of_transmission==0
endurance = 0;
covered_area_initial = 0;
else
endurance =
number_of_trans_before_reach_cov_area/number_of_transmission;
end
endurance = -endurance;
covered_area_ratio = -covered_area_ratio;
for jj = 1:num_nodes
for ii = 1:num_nodes+1
if fastest_path(ii,jj)==-1
break
end
nodes_remaining(jj,1) = fastest_path(ii,jj);
end
end
nodes_remaining = [0;nodes_remaining];
end
function
[fastest_path_new,coord_sensor_new,nodes_to_delete,covered_area] =
updated_fastest_path(coord_sensor,R,L,n)
[m] = get_sensor_coord(coord_sensor,R,L,n);
[m_new] = get_sensor_coord(coord_sensor_new,R,L,n);
m_total = zeros(size(m_new,1),size(m_new,2));
for j = 2:size(m_new,3);
m_total = m_total+m_new(:,:,j);
end
max_element = max(max(m_total));
m_total = ceil(m_total/max(max(m_total)));
d_area = (L/(n-1))^2;
covered_area = sum(sum(m_total))*d_area;
if (max_element==0)
covered_area=0;
end
end
19
number_of_nodes = size(coord_sensor,1);
number_of_nodes = size(m,3);
nodes_sensor = -ones(number_of_nodes,number_of_nodes+1);
nodes_sensor(:,1) = 0:number_of_nodes-1;
for qq = 1:number_of_nodes
matrix_of_node_being_checked = m(:,:,qq);
end
for i=1:number_of_nodes
col_count = 1;
for j=1:number_of_nodes
if i~=j
if nodes_sensor(i,j+1)~=-1
nodes_sensor_temp(i,col_count) = nodes_sensor(i,j+1);
col_count = col_count+1;
end
end
end
end
nodes_sensor (:,2:end) = nodes_sensor_temp;
end
20
max_iter = num_nodes+1;
q = -ones(num_nodes,1);
q(1,1) = nodes(nodes(:,1)==node_1,1);
q_last_filled_index = 1;
visit_table = zeros(num_nodes,2);
visit_table(:,1) = nodes(:,1);
prev = zeros(num_nodes,2);
prev(:,1) = nodes(:,1);
count = 0;
while q(1,1)>-1
visit_table(visit_table(:,1)==q(1,1),2) = 1; %equivalent to
find(visit_table==q(1,1))
line_being_checked = nodes(:,1)==q(1,1);
node_come_from = q(1,1);
%shifting line
q = [q(2:end);-1];
for j = 2:num_cols
node_being_checked = nodes(line_being_checked,j);
q(q_last_filled_index,1) = node_being_checked;
visit_table(visit_table(:,1)==node_being_checked,2) = 1;
prev(visit_table(:,1)==node_being_checked,2) =
node_come_from;
q_last_filled_index = q_last_filled_index + 1;
end
end
q_last_filled_index = q_last_filled_index-1;
count = count+1;
if count==max_iter
disp('stopped');
break
end
end
21
count = 0;
prev(visit_table(:,1)==node_1,2) = -1;
fastest_path = -ones(num_nodes,1);
fastest_path(1,1) = node_2;
id_count = 2;
current_node = node_2;
while current_node~=node_1
fastest_path(id_count,1) = prev(visit_table(:,1)==current_node,2);
current_node = prev(visit_table(:,1)==current_node,2);
id_count = id_count+1;
count = count+1;
if count==max_iter
break
end
end
if (fastest_path)==0
fastest_path = -ones(num_nodes,1);
end
end
22
number_of_sensors = size(coord_sensor,1);
m = zeros(n,n,number_of_sensors);
m_total = zeros(n,n);
for j = 1:number_of_sensors
[m(:,:,j)] = get_matrix_filled(coord_sensor(j,:),L,n,R);
% m_total = m_total+m(:,:,j);
end
% m_total = m_total/max(max(m_total));
% clf
% spy(m_total);
% pause
end
center = ceil(coord_sensor/L*n);
n_sweep = ceil(R/L*n);
for i=1:length(index_initial_sweep)
if index_initial_sweep(i)<1
index_initial_sweep(i) = 1;
end
end
for i=1:length(index_initial_sweep)
if index_final_sweep(i)>n
index_final_sweep(i) = n;
end
end
for i = index_initial_sweep(1):index_final_sweep(1)
for j = index_initial_sweep(2):index_final_sweep(2)
dx = (abs(i-center(1))/n*L);
dy = (abs(j-center(2))/n*L);
end
end
23
for i=1:2
if center(i)>n
center(i) = n;
elseif center(i)<=0
center(i) = 1;
end
end
m(center(1),center(2)) = 2;
m = m';
end
24
function [coord_sensor_new,fastest_path_new,nodes_to_delete] =
delete_unlinked_nodes(coord_sensor,fastest_path)
number_nodes_to_keep = size(coord_sensor,1);
nodes_to_delete = zeros(number_nodes_to_keep,1);
fastest_path_columns_to_delete = zeros(1,size(fastest_path,2));
for j = 1:size(fastest_path,2)
if fastest_path(:,j)==-1
fastest_path_columns_to_delete(1,j) = 1;
nodes_to_delete(j+1) = 1;
number_nodes_to_keep = number_nodes_to_keep-1;
end
end
if max(nodes_to_delete)>0
coord_sensor(nodes_to_delete==1,:) = [];
fastest_path(:,fastest_path_columns_to_delete==1) = [];
end
coord_sensor_new = coord_sensor;
fastest_path_new = fastest_path;
end