Can Genetic Algorithm in MATLAB Return a 3D Matrix as an Optimal Solution?

Hello!
I am currently working on an optimization problem where my optimization variable is a 3D matrix. I am considering using a genetic algorithm (GA) for this task and I have a few questions regarding its capabilities and implementation in MATLAB.
My optimization variable needs to be a 3D matrix due to the nature of the problem I am solving. Is it possible for MATLAB's genetic algorithm functions to handle and return a 3D matrix as the optimal solution? If so, are there any specific considerations or settings I need to be aware of?
Since the calculations and evaluations in my problem are based on this 3D matrix, my fitness function will inherently work with 3D matrices. Are there any best practices or tips for implementing a fitness function in MATLAB that operates on 3D matrices?
Below is a snippet of my current implementation where the optimization variable is a 3D matrix.
numSubTasks = sum(Task_assignment,'all');
num_vehicles = size(Task_assignment, 3);
numSubtasksPerVehicle = size(Updated_Task_assignment, 1);
% Initialize the population matrix
initialPopulation = zeros(num_vehicles, numSubtasksPerVehicle);
for v = 1:num_vehicles
for st = 1:numSubtasksPerVehicle
if st <= size(Updated_Task_assignment, 1)
assignedUAV = find(Updated_Task_assignment(st, :, v), 1);
if isempty(assignedUAV)
assignedUAV = 0;
end
initialPopulation(v, st) = assignedUAV;
else
initialPopulation(v, st) = 0;
end
end
end
% Define GA options
options = optimoptions('ga', ...
'PopulationType', 'doubleVector', ...
'PopulationSize', 200, ...
'MaxGenerations', 100, ...
'CrossoverFraction', 0.8, ...
'EliteCount', 2, ...
'FunctionTolerance', 1e-6, ...
'Display', 'iter');
% fitness = myFitnessFunction(alpha, SR,EU);
function score = myFitnessFunction(initialPopulation)
Offloading_time_Task = calculateOffloadingTime(x_UAV, y_UAV, z_UAV,x_positions,y_positions,x_haps,y_haps,z_haps,num_vehicles,numUAVs, Task_assignment, initialPopulation, all_subtasks,reordered_tasks,initial_data_sizes,dependency_matrix,transmission_time,P_tx,P_Haps,f_c, c, eta_LoS_Ls,numRBs,B_RB_aerial,Noise_aerial,B_RB_dl,Noise_dl,G_u_linear,G_h_linear,h_LoS,kB,Ts,min_value,max_value,Fmax,coverageRadius,a,b,eta_NLoS_Ls);
% Compute Satisfaction Variable
Satisfaction_Variable = zeros(num_vehicles, 1);
for m = 1:num_vehicles
if all(Offloading_time_Task(1, :, m) <= QoS_values(m))
Satisfaction_Variable(m) = 1;
else
Satisfaction_Variable(m) = 0;
end
end
objective1 = MySatisfactionRate(Satisfaction_Variable,reordered_tasks);
objective2 = Compute_Remaining_Energy(E_max,E_HAPS,E_totale);
score = w1 * objective1 + w2 * objective2;
end
numVariables = numSubTasks;
nonlcon = @(initialPopulation) myNonlinearConstraints(initialPopulation,E_totale,Offloading_time_Task, QoS_values, E_max_totale);
[Updated_Task_assignment, fval] = ga(@myFitnessFunction, numVariables, [], [], [], [], [], [], nonlcon,options);
end
I would appreciate any advice, suggestions, or examples from the community regarding the use of genetic algorithms for optimizing 3D matrices in MATLAB.
Thank you in advance for your help and insights!
Best regards,

Answers (1)

No. If you call ga directly then the function must expect a vector and must return a vector. You can reshape() first thing you do.
If you use Problem Based Optimization it will do the reshaping for you.

8 Comments

@Walter Roberson Thank you for your insightful response. I have a follow-up question regarding the reshaping of matrices for the genetic algorithm:
In my problem, I have multiple 3D matrices that are used in various calculations leading up to the evaluation in my fitness function. My question is: Do I need to reshape all these matrices into vectors before passing them to the genetic algorithm, or do I only reshape the primary matrix that directly represents the optimization variable?
Those additional arrays and matrices can be ANYTHING. Any shape. Any form.
If you are using "parameterization", where you are using an anonymous function to pass in additional parameters that are fixed for the optimization operation, then the additional parameters do not need to be converted to vector form.
However, all of the model parameters that are being optimized must be packed into a single vector.
Problem Based Optimization takes care of the details, including packing multiple model parameters together.
i want to tell u that i tried with Problem Based Optimization as follows, and i got this error
Objective must be an OptimizationExpression or a struct containing scalar OptimizationExpressions.
num_vehicles = size(Task_assignment, 3);
numSubtasksPerVehicle = size(Task_assignment, 1);
numLayers = size(Task_assignment, 2);
% Flatten the 3D matrix to a 2D matrix
flattenedSize = num_vehicles * numSubtasksPerVehicle;
% Define optimization variable
optVar = optimvar('optVar', num_vehicles * numSubtasksPerVehicle, numLayers, 'Type', 'integer', 'LowerBound', 0, 'UpperBound', 1);
function score = myFitnessFunction(optVar)
% Reshape optVar back to 3D for calculations
reshapedMatrix = reshape(optVar, [num_vehicles, numSubtasksPerVehicle, numLayers]);
Offloading_time_Task = calculateOffloadingTime(x_UAV, y_UAV, z_UAV,x_positions,y_positions,x_haps,y_haps,z_haps,num_vehicles,numUAVs, Task_assignment, reshapedMatrix, all_subtasks,reordered_tasks,initial_data_sizes,dependency_matrix,transmission_time,P_tx,P_Haps,f_c, c, eta_LoS_Ls,numRBs,B_RB_aerial,Noise_aerial,B_RB_dl,Noise_dl,G_u_linear,G_h_linear,h_LoS,kB,Ts,min_value,max_value,Fmax,coverageRadius,a,b,eta_NLoS_Ls);
% Compute Satisfaction Variable
Satisfaction_Variable = zeros(num_vehicles, 1);
for m = 1:num_vehicles
if all(Offloading_time_Task(1, :, m) <= QoS_values(m))
Satisfaction_Variable(m) = 1;
else
Satisfaction_Variable(m) = 0;
end
end
objective1 = MySatisfactionRate(Satisfaction_Variable,reordered_tasks);
objective2 = Compute_Remaining_Energy(E_max,E_HAPS,E_totale);
score = w1 * objective1 + w2 * objective2;
end
prob = optimproblem;
prob.Objective = @(optVar) myFitnessFunction(optVar);
prob.Constraints.myNonlinearConstraints = @(optVar) myNonlinearConstraints(optVar);
options = optimoptions('ga', ...
'PopulationSize', 200, ...
'MaxGenerations', 100, ...
'CrossoverFraction', 0.8, ...
'EliteCount', 2, ...
'FunctionTolerance', 1e-6, ...
'Display', 'iter');
% Solve the problem
[sol, fval, exitflag, output] = solve(prob, 'Solver', 'ga', 'Options', options);
end
Hello!
I defined Updated_Task_assignment as an optimvar for the GA, which requires it to be in a vectorized form. However, my calculation functions, like calculateOffloadingTime, require it in its original 3D matrix format. I'm struggling with how to handle this transformation within the GA's fitness function. Is there a recommended approach to reshape this vectorized matrix back to 3D within the context of a GA optimization?
numSubtasksPerVehicle = size(Task_assignment, 1);
numLayers = size(Task_assignment, 2);
num_vehicles = size(Task_assignment, 3);
% Define optimization variable
Updated_Task_assignment = optimvar('Updated_Task_assignment', num_vehicles * numSubtasksPerVehicle, numLayers, 'Type', 'integer', 'LowerBound', 0, 'UpperBound', 1);
Task_assignment = customReshape3Dto2D(Task_assignment);
% Define GA options
options = optimoptions('ga', ...
'PopulationType', 'doubleVector', ...
'PopulationSize', 200, ...
'MaxGenerations', 100, ...
'CrossoverFraction', 0.8, ...
'EliteCount', 2, ...
'FunctionTolerance', 1e-6, ...
'Display', 'iter');
[Energy_Total_UAV,Total_HAPS_energy_consumption,E_totale] = Calculate_Total_Energy_Consumption(x_UAV, y_UAV, z_UAV,x_positions,y_positions,x_haps,y_haps,z_haps,num_vehicles,numUAVs, Task_assignment, Updated_Task_assignment, all_subtasks,reordered_tasks,initial_data_sizes,dependency_matrix,transmission_time,P_tx,P_Haps,f_c, c, eta_LoS_Ls,numRBs,B_RB_aerial,Noise_aerial,B_RB_dl,Noise_dl,G_u_linear,G_h_linear,h_LoS,kB,Ts,min_value,max_value,Fmax,coverageRadius,a,b,eta_NLoS_Ls,total_time);
function score = myFitnessFunction(Updated_Task_assignment)
% Compute Satisfaction Variable
Satisfaction_Variable = zeros(num_vehicles, 1);
[Offloading_time_subtask, Offloading_time_Task] = calculateOffloadingTime(x_UAV, y_UAV, z_UAV,x_positions,y_positions,x_haps,y_haps,z_haps,num_vehicles,numUAVs, Task_assignment, Updated_Task_assignment, all_subtasks,reordered_tasks,initial_data_sizes,dependency_matrix,transmission_time,P_tx,P_Haps,f_c, c, eta_LoS_Ls,numRBs,B_RB_aerial,Noise_aerial,B_RB_dl,Noise_dl,G_u_linear,G_h_linear,h_LoS,kB,Ts,min_value,max_value,Fmax,coverageRadius,a,b,eta_NLoS_Ls);
for m = 1:num_vehicles
if all(Offloading_time_Task(1, :, m) <= QoS_values(m))
Satisfaction_Variable(m) = 1;
else
Satisfaction_Variable(m) = 0;
end
end
objective1 = MySatisfactionRate(Satisfaction_Variable,reordered_tasks);
objective2 = Compute_Remaining_Energy(E_max,E_HAPS,E_totale);
score = w1 * objective1 + w2 * objective2;
end
numVariables = numSubTasks;
nonlcon = @(Updated_Task_assignment) myNonlinearConstraints(Updated_Task_assignment,E_totale,Offloading_time_Task, QoS_values, E_max_totale);
% Run GA
[Updated_Task_assignment, fval] = ga(@myFitnessFunction, numVariables, [], [], [], [], [], [], nonlcon,options);
end
Any advice or guidance on how to effectively manage these issues in MATLAB would be greatly appreciated.
Updated_Task_assignment = optimvar('Updated_Task_assignment', [num_vehicles, numSubtasksPerVehicle, numLayers], 'Type', 'integer', 'LowerBound', 0, 'UpperBound', 1);

Sign in to comment.

Asked:

on 3 Dec 2023

Commented:

on 5 Dec 2023

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!