10

लगभग एक साल तक मैं प्रोग्राम लिखने वाले प्रोग्राम लिखने के बारे में सोच रहा हूं। यह मुख्य रूप से एक चंचल व्यायाम होगा जो मुझे कुछ नई अवधारणाओं को सिखा सकता है। मेरी प्रेरणा negentropy से हुई थी और अनंत उत्तराधिकार में आदेश से उत्पन्न होने के लिए अराजकता और नए अराजकता से उभरने की क्षमता थी।क्या ऐसे कार्यक्रम हैं जो नए कार्यक्रम लिखते हैं?

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

यह स्पष्ट रूप से थोड़ा मूर्खता से अधिक है, लेकिन मैंने सोचा कि इस तरह के कार्यक्रम को आजमाने और विकसित करना मजेदार होगा। और एक उपज के रूप में मुझे अद्वितीय कार्यक्रमों का एक गुच्छा मिलता है जिसे मैं कल्पना और कला कह सकता हूं।

मैं शायद इसे सरल सिंटैक्स और गतिशील संकलन के कारण रुबी में लिखूंगा और फिर मैं रूबी-प्रसंस्करण का उपयोग करके प्रसंस्करण में कल्पना करूंगा।

क्या मैं जानना चाहूंगा है:

  • वहाँ प्रोग्रामिंग के इस प्रकार के लिए एक नाम है?
  • इस क्षेत्र में वर्तमान में क्या मौजूद है?
  • प्राथमिक योगदानकर्ता कौन हैं?
  • बोनस! - मैं किस तरीके से प्रक्रियाओं को संकलित (y/n) से बाहर प्रोग्राम आउटपुट के लिए मूल्य असाइन कर सकता हूं?
    मैं पैरामीटर के आधार पर एक प्रोग्राम उत्पन्न करने के लिए इस प्रोग्राम की कार्यक्षमता को विस्तारित करना चाहता हूं, लेकिन मैं चाहता हूं कि कार्यक्रम उन पैरामीटर को परिभाषित करने के लिए प्रोग्राम प्रोग्राम आउटपुट को संकलित और असाइन करने वाले प्रोग्राम चलाए। यह प्रश्न शायद बोनस के लिए उचित से अधिक शामिल है, लेकिन यदि आप 23 लाइनों या एक हाइपरलिंक से कम में ऐसा कुछ करने के लिए एक आसान तरीका सोच सकते हैं, तो कृपया इसे अपनी प्रतिक्रिया में टॉस करें।

मुझे पता है कि यह काफी मेटा प्रोग्रामिंग नहीं है और मुझे एआई और जनरेटिव एल्गोरिदम के बारे में पता है, वे आमतौर पर जो सोच रहे हैं उससे अधिक लक्ष्य उन्मुख होते हैं। इष्टतम क्या होगा एक कार्यक्रम जो लगातार खुद को फिर से लिखता है और सुधारता है, इसलिए मुझे^_^

+12

मैं वास्तव में एक अद्भुत कार्यक्रम है जो ऊपर के सभी करता है लिखा है। यह टिप्पणी बॉक्स इसे रखने के लिए बहुत छोटा है। – zildjohn01

+0

डब्ल्यूटीएफ ...........! – Kasturi

+6

यह "जॉन कॉनर" नामक लड़के द्वारा खुद को मारने के लिए एक शानदार तरीका लगता है। –

उत्तर

6

"आनुवंशिक प्रोग्रामिंग" देखें। टिप्पणियों का जवाब करने के लिए

संपादित करें:

@chris, @Kasturi: सच। ओपी में जो वर्णन किया गया था वह ब्रूट-फोर्स द्वारा व्याकरण को कुछ ठोस वाक्यविन्यास संकलित करने के प्रयासों के लिए एक व्याकरण है, और उसके बाद व्याकरण से नए ठोस वाक्यविन्यास को वापस उत्पन्न करता है। यदि आप उस विवरण से बहुत करीब से मेल खाते हैं ... मेरी सबसे अच्छी सलाह है कि कुछ कम से कम वाक्यविन्यास वाले कुछ भाषा में कंक्रीट सिंटैक्स से छुपा मार्कोव मॉडल बनाने में देखना है। मैं एक न्यूनतम संयोजक तर्क का उपयोग करने पर विचार करता हूं (अनलम्ब्डा भाषा में भावना के समान कुछ)।

दूसरी तरफ, जेनेटिक प्रोग्रामिंग कुछ विकसित अभ्यास और साहित्य के साथ एक तकनीक है, और यह "निर्धारक" नहीं बल्कि एक स्टोकास्टिक प्रक्रिया है। यह भी एक बहुत व्यापक शब्द है --- तर्कसंगत रूप से ओपी की प्रणाली 0% क्रॉसओवर और 100% उत्परिवर्तन के साथ जीपी का एक सीमित मामला है।

+0

जेनेटिक प्रोग्रामिंग कुछ अलग है !!!! – Kasturi

+0

मैंने ऐसा किया है और यह मेरी अपेक्षा से अधिक निर्धारक प्रतीत होता है। मैं आपके दिमाग की तरह एक अंतर्निहित शोर प्रणाली की तलाश में हूं http://www.youtube.com/watch?v=mC7Q-ix_0Po – smothers

+0

@chris, @ कस्तुरी: संपादित करें देखें! स्पष्टीकरण के लिए –

1

एक अलग प्रोजेक्ट जो आप कर सकते हैं वह एक ऐसा काम है जो यूनिट परीक्षण पास करने के लिए एक निश्चित इकाई परीक्षण को पारित करने से उत्परिवर्तित नहीं होता है।

उदाहरण के लिए

, एक कार्यान्वयन

def add(a,b) 
    a 
end 

आप एक परीक्षण

assert_equal 3, Foo.new.add(1,2) 

जोड़ सकते हैं और अपने कार्यक्रम पूछना add भीतर a पर तरीकों में से किसी भी संयोजन की कोशिश करने के लिए (उदाहरण के लिए, a.-(b) के लिए, a.to_s सकता दिया , a.+(b)) जब तक कि म्यूटेंट में से कोई एक परीक्षण और मौजूदा परीक्षण पास नहीं करता है।

आप परीक्षण किए जा रहे कोड बदलने के उदाहरणों के लिए हेक्ले (या ज़ेंटस्ट?) देखना चाहते हैं।

+0

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

5

क्या आपने nanopond के बारे में सुना है? अवधारणा आपके समान है। प्रत्येक पिक्सेल को यादृच्छिक रूप से जेनरेट की गई स्ट्रिंग दी जाती है जिसे एक कंपाइलर के माध्यम से चलाया जाता है। आमतौर पर, यह किसी भी वैध कार्यक्रम का उत्पादन नहीं करता है। हालांकि, हर बार एक बार में, एक यादृच्छिक रूप से जेनरेट की गई स्ट्रिंग किसी भी तरह से एक पड़ोसी पिक्सेल में खुद को पुन: पेश करने में सक्षम होने के लिए पूरी तरह से स्वरूपित की जाएगी। जल्द ही, यह एक लड़ाई बन जाती है जिसके लिए कार्यक्रम दूसरे की तुलना में बेहतर पुनरुत्पादन कर सकता है।

आप किस बारे में बात कर रहे हैं वह आनुवांशिक एल्गोरिदम है, हां, लेकिन एक चीज को अधिकतम करना और अकेला एक चीज़: पुन: पेश करने की क्षमता।

यह सभी स्वाभाविक रूप से होने वाली नकारात्मक अव्यवस्था घटना के लिए आवश्यक मूल है: एक यादृच्छिक रूप से गठित जटिल इकाई में पुनरुत्पादन करने की क्षमता होती है।

शास्त्रीय अनुवांशिक एल्गोरिदम कृत्रिम प्रजनन मानदंड - कार्यक्रम जो सबसे अच्छा काम करता है कृत्रिम रूप से पुनरुत्पादन के लिए चुना जाता है।

जो आप निहित कर रहे हैं वह कम्प्यूटेशनल प्राकृतिक चयन का एक प्रकार है। यही है, कार्यक्रम की क्षमता के आधार पर विकसित होंगे, और कुछ और नहीं।

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

दुर्भाग्य से, आपके वर्णित सिस्टम में अभी भी कुछ कृत्रिम प्रजनन मानदंड हैं: संकलन करने की क्षमता।

संकलन करने की क्षमता = पुन: उत्पन्न करने की क्षमता, आपने कृत्रिम रूप से संकलन की दिशा में विकसित होने के लिए अपने कार्यक्रम निर्धारित किए हैं।

क्या संकलन? इससे कोई फर्क नहीं पड़ता, क्योंकि संकलित करने वाला कोई भी प्रोग्राम आखिरी के रूप में पुन: उत्पन्न होने की संभावना है। आइए मान लें कि आपने किसी ऐसे प्रोग्राम को जेनरेट किया है जो फाइबोनैकी अनुक्रम को आउटपुट करेगा। या एक कार्यक्रम जो शतरंज ग्रैंडमास्टर को हरा सकता है। ठंडा! दुर्भाग्य से, क्या इसे पुन: उत्पन्न किया जाएगा? क्या यह विशेष होगा?

बिलकुल नहीं; यह कार्यक्रम print('k')

मैं शायद बेतरतीब ढंग से चल रहे कार्यक्रमों के तार कि एपीआई के लिए उपयोग किया की एक रूपरेखा के संचालन करने का सुझाव के रूप में प्रजनन के लिए "फिट" के रूप में माना था कि कर सकते हैं:

  • पढ़ें/लिखने के लिए हार्ड ड्राइव, और अचानक, आपके पास ऐसे प्रोग्राम हैं जो प्रोग्राम के रूप में यादृच्छिक तार लिख सकते हैं।
  • हटाएँ/हार्ड ड्राइव पर अन्य फ़ाइलों को संशोधित; यह शायद एक दूसरे के साथ प्रतिस्पर्धा करने के लिए कार्यक्रमों की अनुमति देता है। आपका एपीआई डिज़ाइन किया जा सकता है ताकि फ़ाइल की केवल "ताकत" (मनमानी मूल्य ... शायद वर्ण की लंबाई) फ़ाइल से अधिक मजबूत हो तो फ़ाइल को हटाया जा सकता है।
  • हार्ड ड्राइव पर अन्य स्क्रिप्ट चलाएं ... शायद वे भी जिन्हें वे खुद लिखते हैं
  • इंटरनेट तक पहुंच; एक वेब सर्वर के लिए? ई-मेल लिखने/संलग्न/भेजने/पढ़ने की क्षमता?

मुझे लगता है कि एक प्रोग्राम जो प्रोग्राम लिखता है जो खुद को पुन: उत्पन्न कर सकता है, एक प्रोग्राम से बेहतर परिणाम उत्पन्न कर सकता है जो संकलित कर सकते हैं प्रोग्राम लिखते हैं।

जब तक आप केवल उत्तरार्द्ध चाहते हैं; तो शायद आप प्रोग्राम की लंबाई अधिकतम कर सकते हैं। लेकिन कुछ दिलचस्प होने की संभावना है? इतना भी नहीं; कोई भी कार्यक्रम जो एक निश्चित लंबाई के साथ "संकलित" होता है, उतना ही "पुनरुत्पादन" की तरह होगा।

+0

महान प्रतिक्रिया के लिए धन्यवाद। फिलहाल मुझे अपने प्रोग्राम को उस भाषा को समझने की ज़रूरत है, जिसमें कोड लिख रहा है, अगर केवल सतही है। संकलन पर फिटनेस के आधार पर यही कारण है। एक बार प्रोग्राम प्रोग्रामिंग भाषा की व्याकरणिक संरचना को पर्याप्त रूप से कम कर देता है, उम्मीद है कि मेरे रिकर्सिव इटेटरेटर आल्गो इसके ढेर से बहती है, तो क्या मैं आपके विचारों को कार्यान्वित कर सकता हूं। मुझे डिस्क पर पढ़ने/लिखने और बाहरी एपीआई तक पहुंचने के आपके विचार पसंद हैं, लेकिन अगर मैं स्पैम सीखना चाहता हूं, तो मुझे यादृच्छिक कार्यक्रमों का एक गुच्छा मुफ्त रीइन करने में भी संकोच नहीं है। – smothers

+0

अपनी डिस्क के एक क्षेत्र को एक सैंडबॉक्स के रूप में बंद करने के अपने विकल्प को न भूलें: पी आप नहीं चाहते हैं कि वे आपके कंप्यूटर पर पागल हो जाएं। लेकिन इंटरनेट पर स्पैमिंग उन्हें वास्तव में पुन: पेश करने में मदद नहीं करता है; इसलिए मुझे यकीन नहीं है कि यह कभी भी होगा। और यदि ऐसा होता है, तो प्राकृतिक चयन उन्हें तुरंत मर जाएगा। –

0

क्या इष्टतम होगा एक कार्यक्रम जो लगातार पुनर्लेखन और बेहतर बनाता है ही तो मैं

की जरूरत नहीं है इन चरणों का क्या है:

  1. में छद्म यादृच्छिक संख्या जनरेटर लिखें सभा। (वास्तविक मोड)
  2. संशोधित कार्यक्रम तो यह बाहर लिखते हैं (उदाहरण के लिए) यादृच्छिक संख्या की 64k और पहली बाइट के लिए एक सुदूर जेएमपी करता है।
  3. (वैकल्पिक) अनंत लूप को रोकने के लिए घड़ी कुत्ते टाइमर के लिए ड्राइवर बनाएं
  4. कुछ डिवाइस के बूटसेक्टर पर लोड करें।
  5. एकाधिक कंप्यूटर प्राप्त करें। कॉन्फ़िगर करें ताकि अगर वे तीन गुना गलती करेंगे तो वे आपके डिवाइस के बूटसेक्टर से रीबूट और बूट करेंगे
  6. कंप्यूटर को बूट करें और कुछ उपयोगी (0 शताब्दियों, जो कुछ भी) कुछ उपयोगी
  7. लाभ प्रदान करने के लिए प्रतीक्षा करें!
0

इन लाइनों के साथ प्रारंभिक लेकिन बहुत ही रोचक काम डौग लेनैट के "एएम" (ए गणितज्ञ) और Eurisko (एएम का एक सामान्यीकरण) था।

Eurisko की जांच सीमा की स्थिति एक समस्या को सुलझाने प्रभावित कैसे द्वारा hueristics का एक सेट विकसित हुआ। इसके बाद यह जंक उत्पन्न नहीं करता था, बल्कि इसे कमजोर समस्या सुलझाने की विधि लेती थी और उन मामलों को मिला जहां यह एक बेहतर काम हो सकता था, और समस्या हल करने वाला एक पैच संस्करण बनाया।

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