Niem zmienia wartości zmiennych w kontenerze

0

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;
	}
}
0

Nie bardzo rozumiem o co Ci chodzi :) ale to co mi sie rzuciło w oczy to brak equals i hashCode w klasie Osobnik (która jest wrzucana do kontenera hashującego)

0

Ja sie rowniez nie zaglebialem, mam tylko 1 ale: obiekty wkladane do kolekcji haszujacych jak wlasnie HashSet powinny miec prawdopodobnie przeciazone metody hashCode i equals, jak powiedzial poprzednik. Pola ktore sluza do obliczania haszu i porownywania powinny byc immutable. Przeczytaj w javadocu dlaczego, ja podam prosty przyklad: wlkadasz 2 obiekty, kazdy ma inny hash i equals jest false - tak ma byc. Nastepnie gdzies w innym fragmencie kodu zmieniasz jakostam niektore pola, i teraz sie moze okazac ze w HashSecie sa 2 obiekty ktore maja ten sam hasz - niedobrze, wlasnie zostal zerwany kontrakt.

1 użytkowników online, w tym zalogowanych: 0, gości: 1