-
Notifications
You must be signed in to change notification settings - Fork 0
/
g_algo.m
39 lines (37 loc) · 2.07 KB
/
g_algo.m
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
function [antibody,mo,apodosh] = g_algo(antigen,Na,gen,p_cross,p_mut)
% Ne είναι ο αριθμός των αντιγώνων
% Na είναι ο αριθμός των αντισωμάτων
% L είναι το κοινό μήκος αντιγών και αντισωμάτων
% gen δηλώνει τον αριθμό των γενεών
% p_cross είναι η πιθανότητα να γίνει διασταύρωση
% p_mut είναι η πιθανότητα μετάλλαξης
[~,L]=size(antigen); % τα αντιγώνα έχουν μήκος L το κάθε ένα
antibody=organism(Na,L); %Δημιουργούμε τα αντισώματα
for i=1:gen % Βρόγχος που εκτελείται τόσες φορές όσες είναι οι γενιές
[d,~,mo,max]=selection(antibody,antigen); %επιστρέφει τα επιλεγμένα αντισώματα για διασταύρωση, την μέση τιμή αξιολόγησης αυτής της γενιάς
% και την τιμή αξιολόγησης του καλύτερου αντισώματος αυτής της γενιάς
apodosh(i)=max;% σε αυτό το μητρώο κρατάμε την τιμή του καλύτερου
% αντισώματος για κάθε γενιά (για το 3ο ερώτημα)
g=1;
while g<Na %κάνουμε τόσες επαναλήψεις, όσες και ο αριθμός των αντισωμάτων μας
point=cross(antibody,p_cross); %βρίσκουμε το σημείο διασταύρωσης
if point>=0 %όταν δεν γίνεται διασταύρωση point=-1
for e=1:point %μέχρι το σημείο της διασταύρωσης, οι επιλεγμένοι πληθυσμοί
%παιρνούν αναλλοίωτοι
antibody(g,e)=d(g,e);
antibody(g+1,e)=d(g+1,e);
end
next =point+1; %από το επόμενο του σημείου διασταύρωσης, ανταλλάσσονται τα χρωμοσώματα του κάθε ζευγαριού
for e= next:L
antibody(g,e)=d(g+1,e);
antibody(g+1,e)=d(g,e);
end
else %όταν δεν γίνεται διασταύρωση, οι επιλεγμένοι πληθυσμοί παιρνούν ως έχουν
antibody(g,1:L)=d(g,1:L);
antibody(g+1,1:L)=d(g+1,1:L);
end
g=g+2; %η διασταύρωση γίνεται ανα ζευγάρια των 2
end
antibody=mutation(antibody,p_mut); %στέλνουμε τα αντισώματα στη συνάρτηση μετάλλαξης
end
end