Yazar |
|
eerdil
Kayıt: 13.10.2009 |
|
Merhaba Arkadaslar;
Asagıda yazdıgım kodla ilgili bir sorunum var. Kısaca soyle anlatayım Chromosome dedigim class BitSet array tutuyor. Asagıdaki kodda 1. okla gosterdigim kısımda bu BitSet array i yazdırıyorum.
Daha sonra 2. okla gosterdigim yerde Mutation fonksiyonu calısıyor. Burda da BitSet arrayin herhangi bir elemanının herhangi bir bitini flip ediyor. Bu flip islemini baska bir chromosome nesnesi uzerinde yapıp nextPopulation adında bir arraylist e ekliyor. initialPopulation icindeki chromosomelar uzerinde bir islem yapılmıyor yani. Buna ragmen initialPopulation icindeki bitSet arrayı (1. ok) tekrar yazdırırken flip edilmis(mutation fonksiyonundan sonraki) halini yazdırıyor.
Bunu yapması garip geldi biraz bana ve nedenini bulamadım bir turlu. Fikri olan varsa ve yardımcı olursa sevinirim...
ArrayList<Chromosome> initialPopulation = this.generateRandomPopulation();
...
for(int j=0;j<this.GenerationSize;j++)
{
//int indexoftheFittest = this.selectionoftheFittest();
------>>>> for(int m=0;m<initialPopulation.get(indexoftheFittest).clusterSize;m++)
{
System.out.println("before crossover : "+initialPopulation.get(indexoftheFittest).clusters[m]);
}
System.out.println();
Chromosome chr = this.Crossover(initialPopulation.get(indexoftheFittest));
for(int m=0;m<chr.clusterSize;m++)
{
System.out.println("after crossover : "+chr.clusters[m]);
}
System.out.println();
----->>>> if(chr.clusterSize!=1){chr = this.Mutation(chr);}
for(int m=0;m<chr.clusterSize;m++)
{
System.out.println("after mutation : "+chr.clusters[m]);
}
System.out.println();
nextPopulation.add(chr);
}
this.computeFitness(nextPopulation);
nextPopulation = this.sortwithRespecttoFitness(nextPopulation);
this.normalizeQuality();
this.recordBestChromosomes(nextPopulation);
initialPopulation.removeAll(initialPopulation);
for(int m=0;m<this.GenerationSize;m++)
{
initialPopulation.add(nextPopulation.get(m));
}
nextPopulation.removeAll(nextPopulation);
}
|
|
Yazar |
|
orhan
istanbul
admin
Kayıt: 17.11.2005 |
|
tum kodu bi yere upload et bakalım boyle cok muallak duruyor.
N/A
|
|
Yazar |
|
fastman
MEXICO CITY
Kayıt: 24.04.2006 |
|
Chromosome chr = this.Crossover(initialPopulation.get(indexoftheFittest));
benim anladıgım kadariyla sorun burada. Crossover() methoduna parametre olarak bir kromozom yani object göndermişsin. bu durumda method içinde objenin kopyası değil direkt kendi referansı üzerinde işlem yapılır ve yine bu object geri döndürülmüş.
ardından bu objeyi chr'ye atamışsın ki bu durumda chr yine bu objecti gösterir durumda. yani chr üzerinde yapılan işlem aslında initialPopulationdan aldıgın object üzerinden yapılmakta. sorunun kaynağı budur bence.
Çözüm önerim: bu atama satırını kaldır ve bir klonlama methodu yazarak bir kromozomu bu şekilde klonlamayı dene.
Who is Hamilton? Forza Kimi !!!!
http://www.burhanaras.net/
|
|
Yazar |
|
eerdil
Kayıt: 13.10.2009 |
|
Tüm kodu ornek input dosyasıyla birlikte buraya upload ettim.
http://rapidshare.com/files/403084501/src.rar.html
Run edince program inputları isteyecek. Sırasıyla;
clustering.txt 3 8 1 -1 5 5 5 0,1 0,1 degerleri girilerek calıstırılabilir.
Sorundan tekrar kısaca bahsedeyim. Bitset array in sadece tek bir elemanında true degerini alabilir.
{1, 2, 3, 7}
{0, 4, 5, 6, 7}
Yukarıdaki ornekte 7 her iki bitsette de var bu benim olmasını istemedigim bir output.
Crossover() fonksiyonuna parametre olarak initial populaiton degil de bir kopyasını gondermeyi denedim ama aynı sorun tekrar oldu. Benim anladıgım kadarıyla Mutation() fonksiyonuyla ilgili bir sorun var ama ne onu bilmiyorum.
Tüm koda bakabilirseniz sevinirim. Tesekkurler ilgilendiginiz icin...
|
|
Yazar |
|
fastman
MEXICO CITY
Kayıt: 24.04.2006 |
|
kopyasını gonderdim derken kastetiğin kopyayı yine atama operatoru ile yapmışsan aynı hataya düşmüş olursun. tekrar söylüyorum, klonlama için özel bir method yazabilirsin dostum.
Who is Hamilton? Forza Kimi !!!!
http://www.burhanaras.net/
|
|
Yazar |
|
eerdil
Kayıt: 13.10.2009 |
|
Yazdıgım klonlama methodu asagıdaki gibi. Boyle bisey anladım ben senin soylediginden ama yanlıssam duzelt cok hakim degilim java konusunda.
public Chromosome clone(Chromosome cloneChr)
{
Chromosome copyChr = new Chromosome(minRange, maxRange, columns);
copyChr.ConstructClusters(cloneChr.clusterSize, columns);
for(int i=0;i<cloneChr.clusterSize;i++)
{
copyChr.clusters[i] = cloneChr.clusters[i];
}
return copyChr;
}
....
Chromosome chrClone = this.clone(initialPopulation.get(indexoftheFittest));
Chromosome chr = this.Crossover(chrClone);
|
|
Yazar |
|
eerdil
Kayıt: 13.10.2009 |
|
Klonlama olayını anladım sanırım. Klonlarken BitSet arrayleri de atama yoluyla kopyalayınca yine sorun cıkarıyor. Yeni birer bitset olusturup eskisiyle or layarak kopyalayınca sorun kalmadı. Seninde demek istedigin buydu galiba.
Cok tesekkur ederim yardımlarınız icin...
|
|
|
|
-
Del.icio.us
-
Digg
-
Facebook
-
Furl
-
Google
-
Blink
-
Simpy
-
Spurl
-
Y! MyWeb
|
|
| | | |