function Energy = fitness( q_0, q_final, x_final, optics_positions ) %FITNESS Summary of this function goes here % Detailed explanation goes here x0 = 0; q_f_trial = gbeam_propagation(x_final,q_0,x0,optics_placer(optics_positions)); Energy = abs(q_final-q_f_trial); % penalty calculation % do not put lenses too close to each other and end positions lens_size=0.03; x1=optics_positions(1); x2=optics_positions(2); x3=optics_positions(3); d(1)=abs(x1-x2); d(2)=abs(x2-x3); d(3)=abs(x1-x3); d_from_start=abs(x0-optics_positions); d_from_end=abs(x_final-optics_positions); d=cat(2, d, d_from_start, d_from_end); coef = 1e-1; penalty=coef*sum( exp(-(d/lens_size).^2) ); Energy = Energy + penalty; % make sure that lenses are between ends d_from_start=(x0-optics_positions); d_from_end=(optics_positions-x_final); d = cat(2, d_from_start, d_from_end); coef = 1e-1; penalty = coef * sum(1 + tanh(d.^2)); Energy = Energy + penalty; end