2012-01-06 12 views
5

This question answers pseudocode for roulette wheel selection। लेकिन यह अधिकतम करने की समस्या के लिए है। लेकिन मेरी समस्या फिटनेस फ़ंक्शन के मूल्य को कम करना है। इसका मतलब है, कम फिटनेस वाले व्यक्तियों को उच्च फिटनेस वाले व्यक्ति की तुलना में चयन करने की उच्च संभावना होती है। मैं इसे कैसे कार्यान्वित कर सकता हूं?फ़ंक्शन कम करने के लिए रूले व्हील चयन

अग्रिम धन्यवाद।

उत्तर

4
import java.util.Random; 
import java.util.Arrays; 
import java.util.Comparator; 

class MyComparator implements Comparator 
{ 
    public int compare(Object o1, Object o2) 
    { 
     Number n1 = (Number) o1; 
     Number n2 = (Number) o2; 

     if(n1.jump > n2.jump) 
     { 
      return 1; 
     } 
     else if(n1.jump < n2.jump) 
     { 
      return -1; 
     } 
     else 
     { 
      return 0; 
     } 
    } 
} 


class Number 
{ 
    public double i; 
    public int pos; 
    public double jump = 0; 


    public Random r = new Random(); 

    public Number(int pos) 
    { 
     this.pos = pos; 

     i = r.nextInt(); 
    } 
} 


public class Temp 
{ 
    public static void main(String[] args) 
    { 
     Number[] n = new Number[50]; 

     double total = 0; 

     for(int i=0; i<50; i++) 
     { 
      n[i] = new Number(i); 

      total += n[i].i; 
     } 

     for(int i=0; i<50; i++) 
     { 
      n[i].jump = n[i].i/total; 
     } 


     Arrays.sort(n, new MyComparator());  

     for(int i=0; i<50; i++) 
     { 
      System.out.print(n[i].pos + ", "); 
     } 

     System.out.println(); 

     for(int i=0; i<50; i++) 
     { 
      n[i].jump = n[i].i/total; 
      n[i].jump = 1-n[i].jump; 
     } 

     Arrays.sort(n, new MyComparator());  

     for(int i=0; i<50; i++) 
     { 
      System.out.print(n[i].pos + ", "); 
     } 

     System.out.println(); 
    } 
} 

ऊपर के उदाहरण में के अनुपात में बनाने के लिए, कहते हैं कि संख्या वर्ग अपने व्यक्तिगत वर्ग है, मैं फिटनेस, कूद संभावना है माता-पिता के रूप में चुना जा रहा है। सबसे पहले हम पहले की तरह माता-पिता के रूप में चुने जाने की संभावना की गणना करते हैं। इस कदम पर, उच्च फिटनेस उच्च संभावना प्राप्त करेगा। फिर हम 1 से संभावना घटाते हैं। इससे कम फिटनेस व्यक्तिगत उच्च फिटनेस (चयन के लिए छद्म फिटनेस) देता है। अब संभावना का पुनर्मूल्यांकन करें। देखें, पूरी तरह से उलट दिया जा रहा है।

4

ही एल्गोरिदम का उपयोग करें, लेकिन प्रत्येक व्यक्ति = maxfitness - fitness

+1

वास्तविक जीवन की समस्या के लिए, MAX_FITNESS को MIN_FITNESS के रूप में जानना बहुत संभावना नहीं है। – user

+0

मुझे निरंतर-संकेतक कैप्स का उपयोग नहीं करना चाहिए था। रूले व्हील/लॉटरी का आकार वर्तमान पीढ़ी की फिटनेस का योग है, इसलिए आपके रूले व्हील के लिए अधिकतमदर्शी वर्तमान पीढ़ी की अधिकतम फिटनेस है। –

2

रूले व्हील को स्केलिंग के कारण कम करने के लिए उपयोग नहीं किया जा सकता है। इसके अलावा, इसका उपयोग तब भी नहीं किया जा सकता जब नकारात्मक या शून्य फिटनेस हों क्योंकि उनकी संभावना नकारात्मक या शून्य होगी।

लैरी द्वारा सुझाए गए अनुसार आप स्थानीय आबादी का उपयोग अपनी आबादी की अधिकतम फिटनेस, प्रत्येक व्यक्ति की फिटनेस के लिए घटा सकते हैं, लेकिन फिर आपको अधिकतम फिटनेस को ठीक करना होगा ताकि इसकी शून्य संभावना न हो।

मैं आपको एक टूर्नामेंट चयन का उपयोग करने का सुझाव देता हूं जो रूले से कई बार बेहतर साबित हुआ है।

2

बहुत देर हो सकती है, लेकिन मैं max_fitness - fitness की अनुशंसा नहीं करता क्योंकि आप सबसे खराब तत्वों को खो देंगे (वे अन्वेषण में सहायता कर सकते हैं)। इसके बजाय आप एक तरह का उलटा कर सकते हैं।

def roulette_selection(population): 
    fs = [fitness(i) for i in population] 
    sum_fs = sum(fs) 
    max_fs = max(fs) 
    min_fs = min(fs) 
    p = random()*sum_fs 
    t = max_fs + min_fs 
    choosen = population[0] 
    for i in population: 
     if MAXIMIZATION: 
      p -= fitness(i) 
     elif MINIMIZATION: 
      p -= (t - fitness(i)) 
     if p < 0: 
      choosen = i 
      break 
    return choosen 
+0

मेरे लिए काम किया, धन्यवाद –

1

फिटनेस_न्यू = 1/फिटनेस_ओल्ड में फिटनेस बदलें और आपके पास फिर से अधिकतम समस्या है। यदि fitness_old = 0 संभव है, तो शून्य से विभाजन से बचने के लिए denominator में 1 जोड़ें।

संबंधित मुद्दे