Niem zmienia wartości zmiennych w kontenerze

Odpowiedz Nowy wątek
2009-11-17 22:21
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;
    }
}

Pozostało 580 znaków

2009-11-18 09:33
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)


Sun Certificated Java Programmer 6

Pozostało 580 znaków

2009-11-18 11:00
::
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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