├── parameters.mat ├── README.md ├── test.m ├── Nonreturn_AoI_solver.m ├── AoI_solver.m ├── AoI_Energy_solver.m └── Energy_solver.m /parameters.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yuanliaoo/AoIEnergyUAVPathPlanning/HEAD/parameters.mat -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AoIEnergyUAVPathPlanning 2 | 3 | Code for the UAV trajectory optimization problem (P1) in the paper 'Energy and Age Pareto Optimal Trajectories in UAV-assisted Wireless Data Collection' . 4 | -------------------------------------------------------------------------------- /test.m: -------------------------------------------------------------------------------- 1 | %% 2 | %Calculate the upper and lower bound of energy and AoI 3 | [~,AoI_lower,Energy_upper] = AoI_solver(); 4 | [~,AoI_upper,Energy_lower] = Energy_solver(); 5 | 6 | AoI_bound = table(AoI_lower,AoI_upper); 7 | Energy_bound = table(Energy_lower,Energy_upper); 8 | 9 | %% 10 | % Calculate the proposed multi-return-allowed mode 11 | AoI_weight = 0.5; Energy_weight = 0.5; weights = table(AoI_weight,Energy_weight); 12 | [Trajectory_05_05,Avg_AoI_05_05,Energy_05_05] = AoI_Energy_solver(weights,AoI_bound,Energy_bound); 13 | 14 | %% 15 | % Calculate the path from reference [1] 16 | [Trajectory_nonreturn,Avg_AoI_nonreturn,Energy_nonreturn] = Nonreturn_AoI_solver(); -------------------------------------------------------------------------------- /Nonreturn_AoI_solver.m: -------------------------------------------------------------------------------- 1 | function [Trajectory,Avg_AoI,Energy] = Nonreturn_AoI_solver() 2 | 3 | load('parameters.mat'); 4 | [num_BS_user,~] = size(BS_user_locations); 5 | 6 | %% 7 | %cvx solve the average AoI 8 | 9 | time_did_num = time_matrix./(num_BS_user-1); 10 | 11 | cvx_solver gurobi_2 12 | 13 | cvx_begin quiet 14 | variable Xij(num_BS_user,num_BS_user) binary 15 | variable Fij(num_BS_user,num_BS_user) nonnegative 16 | 17 | minimize sum(sum(Fij.*time_did_num)) 18 | 19 | subject to 20 | 21 | for i = 1:num_BS_user 22 | sum(Xij(i,:)) == 1; 23 | sum(Xij(:,i)) == 1; 24 | end 25 | 26 | for i = 2:num_BS_user 27 | sum(Fij(i,:)) - sum(Fij(:,i)) == 1; 28 | end 29 | 30 | Fij(1,:) == 0; 31 | 32 | Fij <= num_BS_user.*Xij; 33 | 34 | cvx_end 35 | 36 | %% 37 | Trajectory = Xij; 38 | Avg_AoI = cvx_optval; 39 | Energy = sum(sum(Trajectory.*energy_matrix)); 40 | 41 | end 42 | 43 | -------------------------------------------------------------------------------- /AoI_solver.m: -------------------------------------------------------------------------------- 1 | function [Trajectory,Avg_AoI,Energy] = AoI_solver() 2 | 3 | load('parameters.mat'); 4 | [num_BS_user,~] = size(BS_user_locations); 5 | 6 | %% 7 | %cvx solve the average AoI 8 | 9 | time_did_num = time_matrix./(num_BS_user-1); 10 | 11 | cvx_solver gurobi_2 12 | 13 | cvx_begin quiet 14 | variable Xij(num_BS_user,num_BS_user) binary 15 | variable Fij(num_BS_user,num_BS_user) nonnegative 16 | 17 | minimize sum(sum(Fij.*time_did_num)) 18 | 19 | subject to 20 | 21 | sum(Xij(1,2:end)) == sum(Xij(2:end,1)); 22 | 23 | for i = 2:num_BS_user 24 | sum(Xij(i,:)) == 1; 25 | sum(Xij(:,i)) == 1; 26 | end 27 | 28 | for i = 2:num_BS_user 29 | sum(Fij(i,:)) - sum(Fij(:,i)) == 1; 30 | end 31 | 32 | Fij(1,:) == 0; 33 | 34 | Fij <= num_BS_user.*Xij; 35 | 36 | cvx_end 37 | 38 | %% 39 | Trajectory = Xij; 40 | Avg_AoI = cvx_optval; 41 | Energy = sum(sum(Trajectory.*energy_matrix)); 42 | 43 | end 44 | -------------------------------------------------------------------------------- /AoI_Energy_solver.m: -------------------------------------------------------------------------------- 1 | function [Trajectory,Avg_AoI,Energy] = AoI_Energy_solver(weights,AoI_bound,Energy_bound) 2 | 3 | load('parameters.mat'); 4 | [num_BS_user,~] = size(BS_user_locations); 5 | 6 | %% 7 | %pre_calculate parameters 8 | AoI_para = weights.AoI_weight/(AoI_bound.AoI_upper - AoI_bound.AoI_lower); 9 | Energy_para = weights.Energy_weight/(Energy_bound.Energy_upper - Energy_bound.Energy_lower); 10 | 11 | %% 12 | %cvx solve the energy+energy 13 | 14 | time_did_num = time_matrix./(num_BS_user-1); 15 | 16 | cvx_solver gurobi_2 17 | 18 | cvx_begin quiet 19 | variable Xij(num_BS_user,num_BS_user) binary 20 | variable Fij(num_BS_user,num_BS_user) nonnegative 21 | 22 | minimize AoI_para*(sum(sum(Fij.*time_did_num)) - AoI_bound.AoI_lower)... 23 | + Energy_para*(sum(sum(Xij.*energy_matrix)) - Energy_bound.Energy_lower) 24 | 25 | 26 | subject to 27 | 28 | sum(Xij(1,2:end)) == sum(Xij(2:end,1)); 29 | 30 | for i = 2:num_BS_user 31 | sum(Xij(i,:)) == 1; 32 | sum(Xij(:,i)) == 1; 33 | end 34 | 35 | for i = 2:num_BS_user 36 | sum(Fij(i,:)) - sum(Fij(:,i)) == 1; 37 | end 38 | 39 | Fij(1,:) == 0; 40 | 41 | Fij <= num_BS_user.*Xij; 42 | 43 | cvx_end 44 | 45 | %% 46 | Trajectory = Xij; 47 | Avg_AoI = sum(sum(Fij.*time_did_num)); 48 | Energy = sum(sum(Trajectory.*energy_matrix)); 49 | %gplot(Trajectory,BS_user_locations,'-k'); 50 | 51 | 52 | end 53 | -------------------------------------------------------------------------------- /Energy_solver.m: -------------------------------------------------------------------------------- 1 | function [Trajectory,Avg_AoI,Energy] = Energy_solver() 2 | 3 | load('parameters.mat'); 4 | [num_BS_user,~] = size(BS_user_locations); 5 | 6 | %% 7 | %cvx minimize the energy 8 | 9 | cvx_solver gurobi_2 10 | 11 | cvx_begin quiet 12 | variable Xij(num_BS_user,num_BS_user) binary 13 | variable Fij(num_BS_user,num_BS_user) nonnegative 14 | 15 | minimize sum(sum(Xij.*energy_matrix)) 16 | 17 | subject to 18 | 19 | sum(Xij(1,2:end)) == sum(Xij(2:end,1)); 20 | 21 | for i = 2:num_BS_user 22 | sum(Xij(i,:)) == 1; 23 | sum(Xij(:,i)) == 1; 24 | end 25 | 26 | for i = 2:num_BS_user 27 | sum(Fij(i,:)) - sum(Fij(:,i)) == 1; 28 | end 29 | 30 | Fij(1,:) == 0; 31 | 32 | Fij <= num_BS_user.*Xij; 33 | 34 | cvx_end 35 | 36 | %% 37 | Trajectory = round(Xij); 38 | Energy = cvx_optval; 39 | 40 | %% 41 | % There are might be two directions of TSP solution 42 | % choose the one with the best AoI 43 | 44 | time_did_num = time_matrix./(num_BS_user-1); 45 | Avg_AoI_1 = sum(sum(round(Fij).*time_did_num)); 46 | 47 | Fij_inv = zeros(num_BS_user,num_BS_user); 48 | for i = 1:num_BS_user 49 | for j = 1:num_BS_user 50 | if Trajectory(i,j) == 1 51 | Fij_inv(j,i) = (num_BS_user-1) - round(Fij(i,j)); 52 | end 53 | end 54 | end 55 | Avg_AoI_2 = sum(sum(Fij_inv.*time_did_num)); 56 | 57 | if Avg_AoI_2 < Avg_AoI_1 58 | Avg_AoI = Avg_AoI_2; 59 | Trajectory = Trajectory'; 60 | else 61 | Avg_AoI = Avg_AoI_1; 62 | end 63 | 64 | end 65 | --------------------------------------------------------------------------------