Tworze kontener zbior=new LinkedHashSet<Osobnik> ()
dodaje do niego obiekty
przypisuje wartości zmiennym obiektom w kontenerze
usuwam i dodaje nowe obiekty:
zbior.clear();
zbior.addAll(nowaPopulacja);
i w miedzy czasie nie moge nadać wartości zmiennym w kontenerze , wartości nadane na początku są juz nie do zmienienia za pomocą:
for(Osobnik os:zbior)
{
wartosc_rzeczywista=bajtToReal(os.genotyp);
os.ocena=wartosc_rzeczywista * wartosc_rzeczywista;
}
ocena ma wartość 0 mimo że nie ma mieć.
Wyglada to tak jakby kontenerów było wiecej o on operuje ciągle na tym pierwszym
Spotkał się ktoś z takim czymś?
public class ProstyAE
{
public static void main(String args[] )
{
Populacja populacja=new Populacja();
System.out.println("Drukuje pop poczatkowa:");//////
populacja.druk_pop();//////
populacja.ocen(populacja.zbior);
for(int i=0;i<10;i++)
{
populacja.selekcja(populacja.zbior);
//populacja.zbior.
System.out.println("Po seleckcji zostalo:");//////
populacja.druk_pop();////////
populacja.krzyzowanie();
System.out.println("Po krzyzowaniu jest:");//////
populacja.druk_pop();////////
/*populacja.mutacja();
System.out.println("Po mutacji jest:");//////
populacja.druk_pop();////////*/
populacja.ocen(populacja.zbior);
System.out.println("\n===============================");//////
}
}
}
//drugi plik
import java.util.*;
public class Populacja
/*opis lista osobnikow*/
{
static int DOLNA=1;
static int GORNA=14;
static float DELTA=0.1F;
static int LICZBA_BITOW=8;
static int DUGOSC_PRZEDZIALU=bajtJedynek();
static int ZAKRES_GENOTYPU=potega2(LICZBA_BITOW);
static int potega2(int a)
{
int wynik=1;
for(byte i=0;i<a;i++)wynik*=2;
return wynik;
}
static byte bajtJedynek()
{
byte b=0;
for(byte i=0;i<8;i++)
{
b<<=1;
b=(byte)(b|1);
}
return b;
}
Random rand=new Random();
Set<Osobnik> zbior;
int suma=0;
float sumaOcen=0;
Populacja()
{
/*Utwórz liste genow o losowyej wartosci*/
zbior=new LinkedHashSet<Osobnik>();
int genotyp;
//utwórz 80 losowych genotypów
for(byte i=0;i<8;i++)
{
genotyp=0;
for(byte j=8;j>0;j--)
{
int znak=0;
if( rand.nextBoolean() ){znak=1;}else{znak=0;}
//wstawieni znaku do ciagu bitow na pozycje j
for(byte z=8;z>j;z--)
{
znak=(int)(znak<<1);
}
genotyp=(int)(genotyp|znak);
}
zbior.add(new Osobnik(genotyp) );
}
}
/* ocena populacji i zsumowanie ocen */
void ocen(Set<Osobnik> zbior)
{
sumaOcen=0;
float wartosc_rzeczywista;
for(Osobnik os:zbior)
{
wartosc_rzeczywista=bajtToReal(os.genotyp);
os.ocena=wartosc_rzeczywista * wartosc_rzeczywista;
sumaOcen+=os.ocena;
}
}
void selekcja(Set<Osobnik> zbior)
{
Set<Osobnik> nowaPopulacja=new LinkedHashSet<Osobnik>();
int los=rand.nextInt((int)sumaOcen);
for(int i=0;i<4;)//wylosuj 40 osobnikow
{
los=rand.nextInt((int)sumaOcen);
suma=0;
boolean znalaz=false;//zapobiega daleszmu dodawaniu osobnikow do nowejPopulacji po znalezieniu pierwszego
for(Osobnik o:zbior)
{
suma+=o.ocena;
if( los >= suma )//wybierz ten osobnik
{
if(!znalaz)//wstaw
{
if( !nowaPopulacja.contains(o) ){nowaPopulacja.add(o);++i;znalaz=!znalaz;}
}
}
}
}
zbior.clear();
zbior.addAll(nowaPopulacja);
}
List<Osobnik> list;
int prawdKrzyz=80;
int prawdMut=20;//tak naprawde prawdopodobnienstwo mut jest 10
void krzyzowanie()
{
int licznosc=zbior.size();
list=new ArrayList<Osobnik>(zbior);
Osobnik o1,o2;
for(int i=0;i<licznosc;i++)
{
int losKrzyz=rand.nextInt(100+1);
if(losKrzyz<prawdKrzyz)
{
o1=list.get(rand.nextInt(licznosc));
o2=list.get(rand.nextInt(licznosc));
zbior.add(krzyzuj(o1, o2));
}
}
}
void mutacja()
{
for(Osobnik o:zbior)
{
int losMut=rand.nextInt(100+1);
if(losMut<prawdMut)
{
mutuj(o);
}
}
}
void mutuj(Osobnik o)
{
int los=rand.nextInt(LICZBA_BITOW);
int a=1;
int i;
for(i=0;i<los;i++)a<<=1;
o.genotyp ^= a;
}
boolean los;
Osobnik tmp;
int prawa=15, lewa=240, tmplewa, tmpprawa;
Osobnik krzyzuj(Osobnik o1,Osobnik o2)
{
los=rand.nextBoolean();
if(los){tmp=o2;o2=o1;o1=tmp;}//wymieszanie
tmplewa=o1.genotyp & lewa;
tmpprawa=o2.genotyp & prawa;
return new Osobnik(tmplewa | tmpprawa);
}
void druk_bajt(int val)
{
int t=128;
for(byte i=8;i>0;i--)
{
if( (val & t)==0 ) { System.out.print("0 "); }else{ System.out.print("1 "); }
t=t >> 1;
}
}
void druk_pop()
{
int i=0;
for(Osobnik o:zbior){ System.out.print(i++ +". genotyp:"+o.genotyp+", wartosc rzeczywista: "+bajtToReal(o.genotyp));System.out.print(". bajt:");druk_bajt(o.genotyp); System.out.println(", ocena: "+o.ocena);}
}
float bajtToReal(int genotyp)
{
return (float)1+(float)13/(float)256*(float)genotyp;
}
}
class Osobnik
/*opis jednego genu*/
{
int genotyp;
/*ocena nadana przec funkce ocena*/
float ocena;
Osobnik(int genotyp)
{
this.genotyp=genotyp;
}
}