2012-07-29 38 views
7

Obecnie próbuję zrealizować bardzo prosty przykład algorytmów genetycznych.Przekraczanie dwóch liczb całkowitych bitowych

W pewnym momencie musisz zrobić "Cross-Over" (biologia) z dwoma liczbami (rodzicami), aby uzyskać "dziecko".

można znaleźć wyjaśnienie cross-over here: (. Druga ilustracja, tym łatwiej "punktowe" cross-over jest jeden Próbuję zrobić)

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

Chromosomy (rodzice i dziecko) to liczby, ale "Cross-Over" będzie nieco operacją.

I znalazł rozwiązanie dla jednego z „chromosomach”, który jest następujący:

  • Przenieść ilość bitów X na prawo (>>> operatora)
  • a następnie przenieść bity ponownie X pozycje ale tym razem w lewo (operator <<)

To zatrzymałoby koniec jednego z chromosomów i wypełniłoby początek 0s.

Ale tak naprawdę nie wiem, jak rozwiązać problem drugiego chromosomu, a następnie zrobić Cross-Over.

(prawdopodobnie XOR raz Ciągle początku/końcu chromosomów i wypełnione resztę z 0s).

Albo mam nawet podejść do tego problemu z innej strony?

+0

Czy zawsze wiemy jak duży dwa wejścia są numery (np 16-bitowe liczby całkowite) ? – David

+0

Tak, zawsze są to 16-bitowe liczby całkowite. Jedna rzecz, którą można zmodyfikować, to% Cross-Over. Na przykład 75% zachowałoby pierwsze 4 (25%) bitów rodzica A, a następnie podążyłoby za tymi 4 bitami z 12 (75%) bitami od rodzica B. –

Odpowiedz

4

Jeśli ułamek rozgraniczającej oznacza P (na przykład, p = 0,25), to powinno działać:

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

kilka komunikatów:

  • To właśnie pseudokod . Możesz tam potrzebować kilku rzutów.
  • To traktuje p inaczej niż traktujesz to w powyższym komentarzu. (Wystarczy zastąpić str 1-p, aby dostać się do definicji p.)
+0

Wow, mind = dmuchane! Zajmie mi to trochę czasu, aby zrozumieć ten kod. ^^ Dziękuję za szybką odpowiedź! –

+0

Cóż, przesunięcie schematu 0xffff w prawo, a następnie w lewo, robi to samo, co w opisie, więc jeśli twoja p = .5, twoja maska1 skończy się jako 0xff po prawej zmianie, a następnie 0xff00 po lewej zmianie plecy. XORing to z 0xffff pobiera wszystkie bity, które nie są włączone w mask2. – David

+0

Dziękuję za wyjaśnienie! –

1

Naiwny podejście byłoby użyć 4 zmienne lokalne:

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

Następnie przypisać przychodzącej chromatid1 do pierwszego dwie zmienne i chromatid2 do dwóch ostatnich zmiennych.

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

Wykonać prawą Shift na Start zmiennych chromatyd do punktu skrzyżowania, a następnie lewy shift dokładnie taką samą kwotę. Na zmiennych chromatydowych End, przesunięcie w lewo do punktu przecięcia, a następnie przesunięcie w prawo dokładnie o tę samą wartość.

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); 

Z tym, można przejechać rozpoczęcia jednego z końcem drugiego:

int daughterChromatid1 = chromatid1Start + chromatid2End; 
int daughterChromatid2 = chromatid2Start + chromatid1End; 
Powiązane problemy