2012-07-29 21 views
7

मैं वर्तमान में जेनेटिक एल्गोरिदम का एक बहुत ही सरल उदाहरण महसूस करने की कोशिश कर रहा हूं।क्रॉस-ओवर दो पूर्णांक बिटवाई

एक बिंदु पर, आपको "बच्चे" प्राप्त करने के लिए दो नंबर (माता-पिता) के साथ "क्रॉस ओवर" (जीवविज्ञान) करना होगा।

आप क्रॉस-ओवर का एक विवरण यहाँ पा सकते हैं: (। दूसरा चित्रण, आसान "एक बिंदु" क्रॉस-ओवर एक मैं क्या करने की कोशिश कर रहा हूँ है)

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

गुणसूत्र (माता-पिता और बच्चे) संख्याएं हैं लेकिन "क्रॉस-ओवर" थोड़ा सा ऑपरेशन होगा।

  • चाल सही करने के लिए बिट्स एक्स राशि (>>> ऑपरेटर)
  • और उसके बाद फिर X स्थितियां बिट्स के लिए कदम:

    मैं "क्रोमोसोम" में से एक के लिए एक समाधान है, जो निम्नलिखित है पाया लेकिन बाएं (<< ऑपरेटर) को इस बार

तो यह गुणसूत्रों में से एक के अंत रखने के लिए और 0s के साथ शुरुआत को भरना था।

लेकिन मुझे वास्तव में अन्य गुणसूत्र की समस्या को हल करने का तरीका नहीं पता है और फिर क्रॉस-ओवर भी करते हैं।

(शायद एक XOR एक बार मैं गुणसूत्रों की शुरुआत/अंत रखा और 0 से बाकी भरा।) या मैं भी एक और कोण से इस समस्या को संपर्क करना चाहिए?

+0

आप हमेशा जानते हैं कि कैसे बड़े अपने दो आदानों संख्या के रूप में कर रहे हैं क्या (जैसे, 16-बिट पूर्णांक) ? – David

+0

हां, वे हमेशा 16 बिट पूर्णांक होते हैं। एक चीज जिसे संशोधित किया जा सकता है क्रॉस ओवर का% है। उदाहरण के लिए 75% माता-पिता ए के पहले 4 (25%) बिट्स रखेंगे और फिर उन बी बिट्स का पालन करें जो माता-पिता बी से 12 (75%) बिट्स के साथ होंगे। –

उत्तर

4

क्रॉस ओवर के अंश पी है (जैसे, पी = .25), तो यह काम करना चाहिए:

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

कुछ नोट:

  • यह सिर्फ स्यूडोकोड है । आप वहां कुछ जानवरों को चाहते हैं।
  • यह उपरोक्त आपकी टिप्पणी में इसका इलाज करने से अलग है। (बस पी की अपनी परिभाषा को पाने के लिए 1-पी के साथ पी की जगह।)
+0

वाह, दिमाग = उड़ा! मुझे इस कोड को समझने में कुछ समय लगेगा। ^^ आपके त्वरित उत्तर के लिए धन्यवाद! –

+0

ठीक है, 0xffff पैटर्न को सही स्थानांतरित करना और फिर बाएं वही काम कर रहा है जो आपके विवरण में था, इसलिए यदि आपका पी = .5, आपका मास्क 1 सही शिफ्ट के बाद 0xff होने के बाद समाप्त हो जाएगा, और फिर बाएं शिफ्ट के बाद 0xff00 वापस। 0xffff के साथ इसे एक्सोर करना आपको उन सभी बिट्स को प्राप्त करता है जो मास्क 2 में चालू नहीं होते हैं। – David

+0

स्पष्टीकरण के लिए धन्यवाद! –

1

एक अनुभवहीन दृष्टिकोण 4 स्थानीय चर का उपयोग किया जाएगा: तब

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

, पहली को भेजे chromatid1 आवंटित पिछले दो चरों में दो चर और chromatid2

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

विदेशी बिंदु तक Start chromatid चर पर एक सही बदलाव को पूरा करें, तो बाएं बदलाव ठीक उसी राशि। End क्रोमैटिड वैरिएबल पर, क्रॉसओवर पॉइंट तक बाएं-शिफ्ट करें, फिर सटीक उसी राशि को दाएं-स्थानांतरित करें।

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

कि के साथ, आप अन्य के अंत के साथ एक के शुरू होने से पार कर सकते हैं:

int daughterChromatid1 = chromatid1Start + chromatid2End; 
int daughterChromatid2 = chromatid2Start + chromatid1End; 
संबंधित मुद्दे