Konuyu görüntüle
IUCODERS FORUM > Programlama > JAVA > yardımm...
Yazar
eerdil


avatar

Kayıt: 13.10.2009
26.06.2010-16:20 #69988
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


avatar
istanbul
admin
Kayıt: 17.11.2005
26.06.2010-22:11 #69999
tum kodu bi yere upload et bakalım boyle cok muallak duruyor.





N/A
Yazar
fastman


avatar
MEXICO CITY
Kayıt: 24.04.2006
27.06.2010-00:52 #70001
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


avatar

Kayıt: 13.10.2009
27.06.2010-02:08 #70002
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


avatar
MEXICO CITY
Kayıt: 24.04.2006
27.06.2010-13:03 #70003
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


avatar

Kayıt: 13.10.2009
27.06.2010-13:41 #70004
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


avatar

Kayıt: 13.10.2009
27.06.2010-15:35 #70006
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