Adam Lipowski





import java.awt.*;

import java.applet.*;
import java.awt.event.*;
public class gen_str1 extends Applet implements ActionListener {
    TextField pole = new TextField(9);
    TextField ileosob = new TextField(5);
    TextField ilespij = new TextField(5);
    Button start =  new Button("Start");
    Label info = new Label("podaj tekst");
    Label label1 = new Label("  podaj # osobnikow   ");
    Label label2 = new Label(" uspij na (ms) ");
    Label wydruk = new Label("        wydruk kontrolny                             ");
    int nosob,l,nosob2,maxfit,dlsnu,pokolenie;
    byte [] tekstbyte;
    byte [] najlepszy;
    byte [][] popul;
    int [] fit;
    String st_naj;
    public void init(){
       add(label2);
       add(ilespij);
       ilespij.addActionListener(this);        
       add(label1);
       add(ileosob);
       ileosob.addActionListener(this);
       add(info);   
       add(pole);
       pole.addActionListener(this);  
       add(start);
       start.addActionListener(this);  
       add(wydruk);
    }
    public void actionPerformed(ActionEvent e){
    int i,j,ktory,j1,sor,sor1,k;
    String st;
    if(e.getSource()==ilespij){dlsnu=Integer.parseInt(ilespij.getText());}
    else
    if(e.getSource()==ileosob){
    nosob=Integer.parseInt(ileosob.getText());
    nosob2=nosob/2;
    }
    else
    if(e.getSource()==pole){
    st=pole.getText();
    l=st.length();      
    int l1=l-1;
    tekstbyte = new byte[l];
    tekstbyte = st.getBytes();   
    popul=new byte[nosob][l];  
    for(i=0;i<=nosob-1;i++){
        for(j=0;j<=l-1;j++){
          popul[i][j]=(byte)(26.0*Math.random()+97.0);
        }
    }
    fit=new int[nosob];
    for(i=0;i<=nosob-1;i++){
        fit[i]=0;
        for(j=0;j<=l-1;j++){
          if(popul[i][j]==tekstbyte[j]) fit[i]=fit[i]+1;
        }
    }
    maxfit=fit[0];
    ktory=0;
    for(i=1;i<=nosob-1;i++){
        if(fit[i]>maxfit) {maxfit=fit[i];
                           ktory=i;}
    }  
    najlepszy = new byte[l];
    for(i=0;i<=l-1;i++){
       najlepszy[i]=popul[ktory][i];
    }
    st_naj= new String(najlepszy);
    info.setText(""+st_naj);
    }           
    else{// begin of start  
        pokolenie=0;
    while(maxfit<l){
        pokolenie=pokolenie+1;
        int n1=nosob-1;
        int[] sort = new int[nosob];
        for(i=0;i<=n1;i++){sort[i]=i;}
        int n2=n1-1;
        for (i=0;i<=n2;i++){
            j=i;
            j1=j+1;
            while((j>=0)&&(fit[sort[j]]<fit[sort[j1]])){
                sor=sort[j];
                sort[j]=sort[j1];
                sort[j1]=sor;
                j=j-1;
                j1=j+1;
            }
        }
        for(i=0;i<=nosob2-1;i++){
            sor=sort[i];
            sor1=sort[i+nosob2];
            for(j=0;j<=l-1;j++){popul[sor1][j]=popul[sor][j];}
            fit[sor1]=fit[sor];
            k=(int)(l*Math.random());
            byte staryznak=popul[sor1][k];
            byte nowyznak=(byte)(26.0*Math.random()+97.0);
            popul[sor1][k]=nowyznak;
            if((staryznak==tekstbyte[k])&&(nowyznak!=tekstbyte[k])){fit[sor1]=fit[sor1]-1;}
            else
            if((staryznak!=tekstbyte[k])&&(nowyznak==tekstbyte[k])){fit[sor1]=fit[sor1]+1;}   
        }
    maxfit=fit[0];
    ktory=0;
    for(i=1;i<=nosob-1;i++){
        if(fit[i]>maxfit) {maxfit=fit[i];
                           ktory=i;}
    }  
    for(i=0;i<=l-1;i++){
       najlepszy[i]=popul[ktory][i];
    }
    st_naj= new String(najlepszy);
    try{Thread.sleep(dlsnu);} catch(InterruptedException t){}
    wydruk.setText("generation="+pokolenie+", "+st_naj+", fitness="+maxfit);
    }
    }//end of start
    }//end of actionPerformed
}