2012-02-04 17 views
9

मैं सिर्फ एक बहुत अच्छा ted talk डैनी Hillis दिनांकित 1994विकास प्रोग्रामिंग

वीडियो में एक बिंदु पर ने देखा, वह "विकास की प्रोग्रामिंग", यानी वह कंप्यूटर यादृच्छिक उत्पन्न करके कार्यक्रमों के सैकड़ों उत्पन्न करने के लिए पूछता है के बारे में बात आदेशों के अनुक्रम, फिर यह देखने के लिए परीक्षण करता है कि प्रत्येक प्रोग्राम कितनी अच्छी तरह से संख्याओं को दिखाता है। वह उन कार्यक्रमों में से 10% रखता है जो संख्याओं को सर्वश्रेष्ठ प्रकार देते हैं, फिर 10% के आधार पर कार्यक्रमों के अगले दौर को उत्पन्न करते हैं जो कि अच्छा प्रदर्शन करते हैं और आखिरकार अंतिम सॉर्टिंग प्रोग्राम उत्पन्न करने के लिए जितनी बार चाहें उतना बार दोहराते हैं।

क्या वहां उपकरण/प्रोग्रामिंग भाषाएं हैं जो ऐसा करती हैं? जैसे कुछ बाधाओं को देखते हुए, सी कोड उत्पन्न करता है जो उन बाधाओं को सर्वोत्तम रूप से संतुष्ट करता है।

मैंने "विकासवादी प्रोग्रामिंग" से संबंधित कुछ विकिपीडिया लेखों का दौरा किया है; वहां बहुत सारे सिद्धांत प्रतीत होते हैं, लेकिन ऐसा लगता है कि आप जो कुछ भी खेल सकते हैं उसे ढूंढना आसान नहीं लगता है।

उत्तर

5

जावा में लागू एक बहुत ही सरल और सामान्य मुफ्त डाउनलोड करने योग्य स्रोत TinyGP है। वैसे .. इस बारे में अधिक जानकारी के लिए आपको "विकासवादी प्रोग्रामिंग" के बजाय "जेनेटिक प्रोग्रामिंग" के बारे में जानकारी खोजनी चाहिए। यह सब कुछ उलझन में है क्योंकि "जेनेटिक एल्गोरिदम", "विकासवादी रणनीतियों", "विकासवादी प्रोग्रामिंग", "जेनेटिक प्रोग्रामिंग" जैसे नामों में छोटे भिन्नताओं के साथ विकासवादी गणना के इतने सारे उप-क्षेत्र हैं ... लेकिन मुझे लगता है कि आप क्या करते हैं वास्तव में आनुवंशिक प्रोग्रामिंग

3

एक व्यावहारिक उदाहरण:

Csmith एक उपकरण है जो यादृच्छिक सी प्रोग्राम हैं जो स्थिर और गतिशील C99 मानक के अनुरूप उत्पन्न कर सकते हैं। यह तनाव परीक्षण कंपिलरों, स्थिर विश्लेषकों, और अन्य उपकरण जो सी कोड को संसाधित करने के लिए उपयोगी है। क्रिसमस ने परीक्षण किए गए हर टूल में बग पाई हैं, और हमने इसे 400 से अधिक पूर्व-अज्ञात कंपाइलर बग खोजने और रिपोर्ट करने के लिए उपयोग किया है।

+0

इसका विकासवादी कंप्यूटिंग के साथ कुछ लेना देना नहीं है - बिल्कुल कोई चयन नहीं है, क्रिसमस में कोई यादृच्छिक कार्यक्रम 100% मान्य है। –

+0

यह ड्राइवर को निष्पादित करने वाले ड्राइवर पर निर्भर करता है - स्वचालित चयन इस आधार पर हो सकता है कि जेनरेट कोड एक पता लगाने योग्य कंपाइलर बग ट्रिगर करता है या नहीं; नया आउटपुट या तो स्क्रैच से या पूर्व आउटपुट पर उत्परिवर्तन करके उत्पन्न किया जा सकता है। – smokris

+0

यह दिलचस्प है, मैं इसे आज़मा दूंगा। मैंने पहले परीक्षण के लिए पूरी तरह यादृच्छिक जेनरेट कोड का उपयोग किया है। –

3

क्लासिक उदाहरण Tierra और Avida हैं।

एक प्रासंगिक क्षेत्र हार्डवेयर विकास और विकासवादी रोबोटिक्स है, उदाहरण के लिए this page देखें।

गणित में विकासवादी कंप्यूटिंग के बारे में भी एक अच्छा book है।

1

मुझे नाराज होने से नफरत है, लेकिन हमने विकासवादी प्रोग्रामिंग के साथ कुछ परीक्षण किया और पाया कि बहुत सारी समस्याओं पर, संपूर्ण खोज तेज थी।

निकटवर्ती क्षेत्रों को आनुवांशिक एल्गोरिदम पसंद आया है, जिसे मैंने रोबोट चलने के लिए उपयोग किया है आदि। मैंने इसके लिए गैलीब का उपयोग किया। यह शायद अब प्राचीन है।

हालांकि विचार "शांत" है, विकासवादी तकनीकों और सीखने (यानी मजबूती सीखने) के संयोजन का उपयोग करने के लिए सबसे अच्छा तरीका हो सकता है।

यह वैसे ही है जैसे इंसान कैसे सीखते हैं। दीर्घकालिक विकास धीरे-धीरे प्रयोग कर रहा है, साथ ही सीखना जो चीजों को ठीक करता है और पर्यावरण को सिस्टम को अनुकूलित करता है।

लेकिन, विकास में कुशल होने में बहुत लंबा समय लगता है।

+1

एमए की तरह, तो? http://en.wikipedia.org/wiki/Memetic_algorithm – Alexander

-1

शायद विकासवादी कार्यक्रम बनाने के लिए सबसे बहुमुखी कार्यक्रम असेंबलर होगा। यह एकमात्र भाषा है जिसे मैं जानता हूं कि इसमें अन्य कार्यक्रमों को ओवरराइट करने और अपना कोड बदलने की क्षमता है। आप पुराने कोर वार्स कार्यक्रमों पर एक नज़र डालना चाहते हैं - इन कार्यक्रमों में से एक का एक अलग या अधिक अद्यतित संस्करण प्रतिस्पर्धा को विकसित करने और हरा करने में सक्षम हो सकता है। इसके अलावा, आपके पास सबसे ज्यादा जीवित रहने की संभावना है, क्योंकि सीमित निर्देशिकाएं हैं।

+0

असेंबलर के साथ आप सब कुछ कर सकते हैं, लेकिन इसका मतलब यह नहीं है कि इसका उपयोग करना आसान है ... और निश्चित रूप से यह सबसे अच्छा समाधान नहीं है (वहां बहुत सारे हैं अधिक शक्तिशाली प्रोग्रामिंग भाषाएं, जैसे LISP या C, जिनका उपयोग इन उद्देश्यों के लिए किया जा सकता है)। –

2

प्रोग्राम उत्पन्न करने वाले विकासवादी गणना का क्षेत्र जेनेटिक प्रोग्रामिंग (जीपी) कहा जाता है। जीपी कई पीढ़ियों के माध्यम से व्यक्तियों की आबादी के जैविक विकास को अनुकरण करता है। आम तौर पर, एक व्यक्ति एक कार्यक्रम (या इसका प्रतिनिधित्व, आमतौर पर एक पेड़ डेटा-संरचना के रूप में) होता है और जीवित रहने और पुनरुत्पादन की संभावनाओं को एक कार्य को हल करने के अपने प्रदर्शन के संदर्भ में मापा जाता है।

आजकल आप ईमानदारी से रोजमर्रा के कार्यों के लिए व्यावहारिक उत्पादन कोड नहीं बना सकते हैं। इसके बजाय, आधुनिक शोध में जीपी और कई अन्य मशीन लर्निंग तकनीकों की जांच की जाती है और इन्हें बहुत बड़ी कंपनियों (यानी Google, फेसबुक इत्यादि) द्वारा उपयोग किया जाता है। वास्तव में, जीपी दृष्टिकोण बहुत उपयोगी होता है जब आप जानते हैं कि आप उद्देश्य-कार्यक्रम क्या करना चाहते हैं (यानी, आप इनपुट को देखते हुए आउटपुट जानते हैं) लेकिन आपको इस बारे में कोई जानकारी नहीं है कि (या यह आपके लिए मुश्किल है) लिखने के लिए अपने आप से कोड

विषय को सही ढंग से समझने के लिए, शायद आप स्क्रॉल से विकसित इंजन लिखना और इसके साथ खेलना चाहते हैं। सैद्धांतिक वर्णन से शुरू कोड लिखना बिल्कुल ठीक है। कुछ "प्री-बिल्ट सॉफ़्टवेयर", इमो का उपयोग करने के बजाए ये बातें कैसे काम करती हैं, यह जानने का सबसे अच्छा तरीका है। इसके अलावा, मैं आपको जेनेटिक एल्गोरिदम (जीए) से शुरू करने का सुझाव देता हूं, क्योंकि वे आम तौर पर सरल होते हैं। वास्तव में, जीए में आप आम तौर पर व्यक्तियों के जीनोटाइप का मूल्यांकन करते हैं, यानी उन्हें लिखने वाली बिट्स, जबकि जीपी में आप पेड़ों को प्रोग्राम में ट्रांसफर करना, उन्हें निष्पादित करना, आउटपुट को देखना और आखिरकार उनके प्रदर्शन को मापना चाहते हैं (इतनी सीधी नहीं, ओह ?)। इसे देखें: http://www.theprojectspot.com/tutorial-post/creating-a-genetic-algorithm-for-beginners/3

प्रयोगशाला जहां मैंने अपने मास्टर की थीसिस की है, यह साबित कर रहा है कि जीपी के पाठ निष्कर्षण के उदाहरणों से नियमित अभिव्यक्ति उत्पन्न करने में बहुत अच्छा प्रदर्शन है। वे अपने इंजन के साथ खेलने के लिए एक जीयूआई बनाते हैं: http://regex.inginf.units.it/demo.html। उन्होंने जिथूब पर इंजन कोड भी साझा किया: https://github.com/MaLeLabTs/RegexGenerator। अंत में, मेरे एक दोस्त ने अपने ब्लॉग में जीपी और जीए (जेनेटिक एल्गोरिदम) का उपयोग करके कुछ मजेदार दृश्य प्रयोगों को कोड किया। एक नज़र डालें: http://www.nicassio.it/daniele/gp/enviroment/, http://www.nicassio.it/daniele/gp/santaclaus/

संबंधित मुद्दे