5

में रैंकिंग चयन मुझे आनुवांशिक एल्गोरिदम पर ranking selection method के लिए कोड चाहिए। मैंने रूले और टूर्नामेंट चयन विधि बनाई हैं लेकिन अब मुझे रैंकिंग की आवश्यकता है और मैं अटक गया हूं।जेनेटिक एल्गोरिदम कोड

मेरे रूले कोड यहाँ है (मैं आनुवंशिक परमाणुओं के लिए परमाणु struct उपयोग कर रहा हूँ):

const int roulette (const atom *f) 
{ 
    int i; 
    double sum, sumrnd; 

    sum = 0; 
    for (i = 0; i < N; i++) 
    sum += f[i].fitness + OFFSET; 

    sumrnd = rnd() * sum; 

    sum = 0; 
    for (i = 0; i < N; i++) { 
    sum += f[i].fitness + OFFSET; 
    if (sum > sumrnd) 
     break; 
    } 

    return i; 
} 

कहाँ परमाणु:

typedef struct atom 
{ 
    int geno[VARS]; 
    double pheno[VARS]; 
    double fitness; 
} atom; 
+0

कि आप किस भाषा में कोडिंग कर रहे हैं? आशा है कि यह [चर्चा] (http://stackoverflow.com/questions/10152002/building-ranking-with- आनुवांशिक- एल्गोरिदम) आपकी मदद करता है। – bonCodigo

+0

सी ++, यह एक सादा सी हिस्सा है, लेकिन मैं इसे नोकिया क्यूटी फ्रेमवर्क में विकसित कर रहा हूं –

उत्तर

7

रैंक चयन आसान है लागू करने के लिए जब आप पहले से ही रूले पहिया पर पता चयन। फिटनेस का उपयोग करने के बजाय चुनने के लिए संभावना के रूप में आप रैंक का उपयोग करें। तो एन समाधानों की आबादी के लिए सबसे अच्छा समाधान रैंक एन मिलता है, दूसरा सबसे अच्छा रैंक एन -1, इत्यादि। सबसे खराब व्यक्ति के पास रैंक 1 है। अब रूले व्हील का उपयोग करें और चयन करना शुरू करें।

सर्वोत्तम व्यक्ति का चयन करने की संभावना एन/((एन * (एन + 1))/2) या लगभग 2/एन है, सबसे खराब व्यक्ति के लिए यह 2/(एन * (एन + 1) है)) या मोटे तौर पर 2/एन^2।

इसे रैखिक रैंक चयन कहा जाता है, क्योंकि रैंक रैखिक प्रगति का निर्माण करते हैं। आप एक ज्यामितीय प्रगति बनाने वाले रैंकों के बारे में भी सोच सकते हैं, जैसे कि उदाहरण 1/2^n जहां n सबसे अच्छे व्यक्ति के लिए एन से सबसे खराब है। यह निश्चित रूप से सर्वश्रेष्ठ व्यक्ति को बहुत अधिक संभावना देता है।

आप HeuristicLab में कुछ चयन विधियों के कार्यान्वयन को देख सकते हैं।

1

मैंने सी ++ में टेम्पलेट जेनेटिक-एल्गोरिदम क्लास बनाया है।

जेनेटिक एल्गोरिदम की मेरी लाइब्रेरी जेनेटिक एल्गोरिदम और गैपोप्यूलेशन से अलग है। वे सभी टेम्पलेट वर्ग हैं ताकि आप एपीआई दस्तावेज़ों में अपना मूल कोड देख सकें।

2

MatLab में रैंक चयन मेरे कोड:

NewFitness=sort(Fitness); 
NewPop=round(rand(PopLength,IndLength)); 

for i=1:PopLength 
    for j=1:PopLength 
     if(NewFitness(i)==Fitness(j)) 
      NewPop(i,1:IndLength)=CurrentPop(j,1:IndLength); 
      break; 
     end 
    end 
end 
CurrentPop=NewPop; 

ProbSelection=zeros(PopLength,1); 
CumProb=zeros(PopLength,1); 

for i=1:PopLength 
    ProbSelection(i)=i/PopLength; 
    if i==1 
     CumProb(i)=ProbSelection(i); 
    else 
     CumProb(i)=CumProb(i-1)+ProbSelection(i); 
    end 
end 

SelectInd=rand(PopLength,1); 

for i=1:PopLength 
    flag=0; 
    for j=1:PopLength 
     if(CumProb(j)<SelectInd(i) && CumProb(j+1)>=SelectInd(i)) 
      SelectedPop(i,1:IndLength)=CurrentPop(j+1,1:IndLength); 
      flag=1; 
      break; 
     end 
    end 
    if(flag==0) 
     SelectedPop(i,1:IndLength)=CurrentPop(1,1:IndLength); 
    end 
end