2012-07-29 13 views
7

Şu anda genetik algoritmaların çok basit bir örneğini gerçekleştirmeye çalışıyorum. Bir noktada, bir "çocuk" almak için iki sayıyla (ebeveynler) bir "Cross-Over" (biyoloji) yapmak zorundasınızdır.Kesişen iki tamsayı bitwise

Burada Çapraz-Over ilgili bir açıklama bulabilirsiniz: (. İkinci illüstrasyon, daha kolay "tek nokta" Çapraz Üzeri ben yapmaya çalışıyorum biridir)

How to "crossover" two strings (1234 & abcd -> 12cd & ab34)

Kromozomlar (ebeveynler ve çocuklar) sayılardır, ancak "Geçiş" işlemi biraz çalışır.

  • hareket sağa bit X miktarı (>>> operatörü)
  • ve yeniden X konumlarının bit hareket:

    aşağıdaki olan "kromozom" biri için bir çözüm, bulunan ama sol (<< operatör) için bu kez

Yani bu kromozomların birinin ucunu tutmak ve 0s ile başlangıcını doldururdu. Ama diğer kromozomun problemini nasıl çözeceğimi ve sonra Cross-Over'ı da nasıl yapacağımı bilmiyorum.

(Muhtemelen XOR bir kez kromozomların başı/sonu tuttu ve 0s ile dinlenme doldurdu.)

Ya ben bile başka bir açıdan bu sorunu yaklaşım gerekir? Çapraz-Over kesir p ise

+0

her zaman iki giriş numaraları gibi ne kadar büyük biliyor musunuz (örneğin 16 bit tamsayı) ? – David

+0

Evet, her zaman 16 bit tam sayıdır. Değiştirilebilen bir şey Çapraz Geçişin% 'si. Örneğin,% 75, ilk A (% 25) bit A'yı tutuyor ve daha sonra, bu 4 biti, ana B'den 12 (% 75) bit ile takip ediyordu. –

cevap

4

(örneğin, p = 0,25), o zaman bu çalışması gerekir:

mask1 = ((0xffff >> 16*p) << 16*p) 
mask2 = 0xffff^mask1 
output1 = (input1 & mask1)^(input2 & mask2) 
output2 = (input1 & mask2)^(input2 & mask1) 

birkaç not:

  • Bu sadece pseudocode olduğunu . Orada bazı oyuncular isteyebilirsin.
  • Bu, yukarıdaki yorumunuza göre uyguladığınızdan farklı davranır. (Sadece p tanımlarınıza almak için 1-p ile p değiştirin.)
+0

Vay, akla = patladı! Bu kodu anlamak için biraz zaman alacak. ^^ Hızlı cevabınız için teşekkür ederiz! –

+0

0xffff desenini sağa ve sola kaydırmak, açıklamanızdakiyle aynı şeyi yapıyor, bu yüzden p = .5'inizde, mask1'iniz doğru kaymadan sonra 0xff olacak ve sol kaymadan sonra 0xff00 olacak geri. Bunu 0xffff ile XORing, mask2'de açılmayan tüm bitleri alır. – David

+0

Açıklama için teşekkür ederiz! –

1

Saf bir yaklaşım 4 yerel değişkenleri kullanmak olacaktır: Sonra

int chromatid1Start; 
int chromatid1End; 
int chromatid2Start; 
int chromatid2End; 

, ilk gelen chromatid1 atamak Son iki değişkene iki değişken ve chromatid2.

chromatid1Start = chromatid1; 
chromatid1End = chromatid1; 
chromatid2Start = chromatid2; 
chromatid2End = chromatid2; 

geçit noktaya kadar Start kromatid değişkenler üzerinde sağ shift gerçekleştirin, sonra sola-shift aynı miktarda. End kromatid değişkenlerinde, geçiş noktasına kadar sola kaydırın, ardından aynı miktarda sağa kaydırın.Bunun üzerine

chromatid1Start = (chromatid1Start >> 16 * crossoverPercent) << 16 * crossoverPercent; 
chromatid1End = (chromatid1End << 16 * (1 - crossoverPercent)) >> 16 * (1 - crossoverPercent); 
chromatid2Start = (chromatid2Start >> 16 * crossoverPercent) << 16 * crossoverPercent; 
chromatid2End = (chromatid2End << 16 * (1 - crossoverPercent)) >> 16 * (1 - crossoverPercent); 

, diğer ucuyla birinin başlangıcını geçebilir:

int daughterChromatid1 = chromatid1Start + chromatid2End; 
int daughterChromatid2 = chromatid2Start + chromatid1End; 
İlgili konular