summaryrefslogtreecommitdiff
path: root/fitness.m
blob: 00cbadaf2d9cc6edce96cf1df980b7ad601bddec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
function [Energy, Waist, Penalty] = fitness( q_0, q_final, x_final, optics_positions, optics_focal_length, lambda )
%FITNESS Summary of this function goes here
%   Detailed explanation goes here
    x0 = 0;
    Np=20;
    x=linspace(x0,x_final,Np);
    q_f_trial_forward = gbeam_propagation(x,q_0,x0,optics_placer(optics_positions, optics_focal_length));
    [Waist_trial_forward, Radius_trial_forward] = q2wr(q_f_trial_forward, lambda);
    q_f_trial_backward = gbeam_propagation(x,q_final,x_final,optics_placer(optics_positions, optics_focal_length));
    [Waist_trial_backward, Radius_trial_backward] = q2wr(q_f_trial_backward, lambda);
      
    Energy = 0;
    Penalty_waist_mismatch = sum(abs((Waist_trial_forward-Waist_trial_backward)./min(Waist_trial_forward, Waist_trial_backward)))/Np;
    Penalty_waist_mismatch = 0*Penalty_waist_mismatch + 1e9*sum(abs((Waist_trial_forward-Waist_trial_backward)))/Np;
    Penalty_radius_mismatch = sum(abs((Radius_trial_forward-Radius_trial_backward)./max(Radius_trial_forward, Radius_trial_backward)))/Np;
    
    Energy = 0*Penalty_radius_mismatch + Penalty_waist_mismatch;
    
    % 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 = 1;
   
    penalty_lenses_too_closely_spaced =coef*sum( exp(-(d/(lens_size)).^12) );
    
    Energy = Energy + penalty_lenses_too_closely_spaced;
    
    % 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-2;
    distance_scaling=100;
    penalty_lenses_outside_optical_path = coef * sum(1 + tanh(distance_scaling*d));
    
    Energy = Energy + penalty_lenses_outside_optical_path;
    
    % make collimated region between 2nd and 3rd lens   
    %intialize intermediate points between lenses
    intermediate_positions = linspace(optics_positions(2), optics_positions(3),10);
    f_q_x = @(x) gbeam_propagation(x,q_0,x0,optics_placer(optics_positions, optics_focal_length));
    q_intermediate = arrayfun(f_q_x,intermediate_positions);
    lambda_over_waist_sq = (-imag(1./q_intermediate)); %with numerical factor
    
    coef = 1e-3;
    penalty_not_collimated_beam = coef * sum(exp((std(lambda_over_waist_sq)/mean(lambda_over_waist_sq)/abs(optics_positions(2) - optics_positions(3)))));
    Energy = Energy + penalty_not_collimated_beam;
    
    Penalty = [ penalty_lenses_too_closely_spaced; penalty_lenses_too_closely_spaced; penalty_not_collimated_beam];
end