हम कार्यक्रम बढ़ाते हैं

छवि नए साल की छुट्टियां बीत चुकी हैं और मुझे ब्रेनफुक के बारे में याद आया। अपनी खुद की नौसैनिक लड़ाई लिखने की कोई इच्छा नहीं थी, लेकिन मैं परी कथा "वेल, प्रोग्राम्स, योरसेल्फ राइट" में पसंद करना चाहता था।



इसका आधार आनुवंशिक एल्गोरिदम का उपयोग करते हुए लेख "हैलो दुनिया!" था । इसलिए, मैं तुरंत निम्नलिखित समस्या को हल करने के लिए आगे बढ़ूंगा: एक प्रोग्राम लिखें जो ब्रेनफैक में आनुवंशिक एल्गोरिथ्म का उपयोग करके प्रोग्राम लिखेंगे जो दिए गए स्ट्रिंग को प्रदर्शित करता है। इसे जावा में लागू करें।



पहले आपको एक बीएफ कोड दुभाषिया की आवश्यकता है, हम पहिया को फिर से नहीं लगाएंगे, हम बीएफआई लाइब्रेरी * कॉपीराइट © 2003 थॉमस कॉर्ट का उपयोग करेंगे। प्रयोगों के लिए, मैंने उसे एक अलग धागे में चलाने की क्षमता में जोड़ा।



कार्यक्रम विवरण के लिए कक्षा:

class Individ implements Comparable

{

//

String data;

//

double fitness;



// .

// fitness ""

public int compareTo(Object o)

}









अब चलो एक आनुवंशिक एल्गोरिथ्म लिखने के लिए नीचे उतरें। एल्गोरिथ्म के चरणों को चित्र में दिखाया गया है:

छवि



पहला जनसंख्या का गठन है, हम इसे बीएफ शब्दकोश से ऑपरेंड की एक यादृच्छिक व्यवस्था द्वारा प्राप्त करते हैं।



प्रजनन कार्य क्रॉसिंग के लिए जिम्मेदार है, यह दो यादृच्छिक व्यक्तियों को लेता है, इसे दो भागों में विभाजित करता है और जोड़े में परिणामी हिस्सों को glues करता है, और इसी तरह पूरी आबादी के लिए।



तीन प्रकार के म्यूटेशन लागू किए गए हैं:

1) दूसरे के साथ एक ऑपरेंड का प्रतिस्थापन;

2) ऑपरैंड की एक यादृच्छिक स्थिति में जोड़ना;

3) एक लूप जोड़ना।

तीसरा आइटम पेश किया गया है क्योंकि लूप में "[" और "]" होते हैं और यदि आप एक बार में एक जोड़ते हैं, तो प्रोग्राम सही नहीं होगा।



सबसे कठिन कार्य किसी व्यक्ति की उपयुक्तता की गणना करना है। उपयुक्तता मूल्य दर्शाता है कि कार्यक्रम का परिणाम वांछित मूल्य से कितना विचलित हो गया है।

पहली बात जो दिमाग में आई, वह थी स्ट्रिंग में वर्णों के अंतर के योग पर विचार करना, उदाहरण के लिए, abc - aaa = 3, लेकिन इस दृष्टिकोण के साथ, आनुवंशिक एल्गोरिथ्म जल्दी से एक स्थानीय चरम बिंदु पाता है और फिर चक्रों में चला जाता है।

आइए एक उदाहरण देखें। हम स्ट्रिंग "एबीबी" और कार्यक्रम प्राप्त करना चाहते हैं:

++++++++ [<+++++++++++++++++ -> <...

इस तरह के एक कार्यक्रम की उपयुक्तता "bbb" प्रदर्शित करता है 1. "हम एक" हम "डाल करने की जरूरत है" पाने के लिए पहला स्थान प्राप्त करने के लिए - चक्र के बाद:

++++++++ [<+++++++++++++++++>] - <...

यह कार्यक्रम पहले से ही "आआ" प्रदर्शित करता है, लेकिन इसकी उपयुक्तता 2 हो गई है, जो बदतर है और यह "व्यक्ति की मृत्यु" है।

इसलिए, हम प्रतीक की स्थिति के आधार पर उपयुक्तता पर विचार करेंगे, उदाहरण के लिए abc - aaa = | a - a a | * 100 ^ 3 + | b - a | * 100 ^ 2 + | c - a | * 100 ^ 1 = 100200। इस दृष्टिकोण के लिए धन्यवाद, बाईं ओर के चरित्र की एक उच्च प्राथमिकता है।



चयन उपयुक्तता के घटते क्रम में एक सरल छँटाई है।



और जब तक हमें प्रोग्राम नहीं मिलेगा, हम गुणा करेंगे और म्यूट करेंगे।



और यहाँ स्ट्रिंग "हैलो" के लिए कार्यक्रम का परिणाम है:



449 वीं पीढ़ी

कार्यक्रम की लंबाई: 236 चार। कार्यक्रम का पाठ: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++। +++++++++ ++ - ++++++++++++++++++++++। ++ - +++++++++++>>।



Source.google.com पर कोड

आई-फ़ोन दर्पण



All Articles