2012-02-25 14 views
6

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

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

यहां तक ​​कि नोड कक्षाएं हैं जिन्हें मैंने अभी तक बनाया है। कृपया क्षमा करें जो मुझे यकीन है कि मेरा स्पष्ट अनुभवहीनता है।

public class Node 
{ 
    Node parent; 
    Node leftchild; 
    Node rightchild; 

    public void setParent(Node p) 
    { 
     parent = p; 
    } 

    public void setLeftChild(Node lc) 
    { 
     lc.setParent(this); 
     leftchild = lc; 
    } 

    public void setRightChild(Node rc) 
    { 
     rc.setParent(this); 
     rightchild = rc; 
    } 
} 


public class OperatorNode extends Node 
{ 
    char operator; 


    public OperatorNode() 
    { 
     double probability = Math.random(); 

     if (probability <= .25) 
     { 
      operator = '+'; 
     } 
     else if (probability > .25 && probability <= .50) 
     { 
      operator = '-'; 
     } 
     else if (probability > .50 && probability <= .75) 
     { 
      operator = '*'; 
     } 
     else 
     { 
      operator = '/'; 
     } 
    } 

    public void setOperator(char op) 
    { 
     if (op == '+' || op == '-' || op == '*' || op == '/') 
     { 
      operator = op; 
     } 
    } 


/** 
* Node that holds x variables. 
*/ 
public class XNode extends Node 
{ 
    char x; 

    public XNode() 
    { 
     x = 'x'; 
    }  
} 

import java.util.Random; 


public class OperandNode extends Node 
{ 
    int operand; 

    /** 
    * Initializes random number generator, sets the value of the node from zero to 9. 
    */ 
    public OperandNode() 
    { 
     Random rand = new Random(); 
     operand = rand.nextInt(10); 
    } 

    /** 
    * Manually changes operand. 
    */ 
    public void setOperand(int o) 
    { 
     operand = o; 
    } 
} 

यह सब कुछ मैं नोड्स खुद को से बाहर की जरूरत पूरा करता है, लेकिन मैं कैसे एक बड़ा पेड़ में इन चालू करने के लिए यह पता लगाने की कोशिश कर समस्याओं में चल रहा हूँ। मुझे एहसास है कि मुझे किसी प्रकार के संग्रह प्रकार का उपयोग करने की आवश्यकता है, लेकिन ऐसा लगता है कि लाइब्रेरी में ऐसा कोई नहीं लगता है जो मैं करने की कोशिश कर रहा हूं।

यहां तक ​​कि सही दिशा में भी एक झुकाव की सराहना की जाएगी।

+0

वास्तव में आपके प्रश्न का उत्तर नहीं है, लेकिन क्या आपने jgap को देखा है? http://jgap.sourceforge.net/ –

+0

मैं इसे पार कर दूंगा, लेकिन हमें इसे खरोंच से बनाने के लिए अतिरिक्त क्रेडिट मिलता है, और वास्तव में, यह कुछ है जो मैं अपने व्यक्तिगत लाभ के लिए समझना चाहता हूं। – sitrick2

उत्तर

2

तो आप OperatorNode एस, OperandNode एस, और XNode एस का यादृच्छिक पेड़ बनाना चाहते हैं? और आपने कहा कि आप वृक्ष गहराई उपयोगकर्ता को परिभाषित करना चाहते हैं?

buildRandomTree या कुछ समान नामक एक पुनरावर्ती फ़ंक्शन को परिभाषित करें। इसे वृक्ष गहराई के लिए एक int पैरामीटर लेना चाहिए। यदि गहराई पैरामीटर 1 है, तो एक यादृच्छिक पत्ता नोड (ऑपरेंड नोड या एक्सनोड) लौटाएं। यदि गहराई पैरामीटर 1 से अधिक है, तो एक यादृच्छिक ऑपरेटर नोड उत्पन्न करें, और बाएं और दाएं उपट्री उत्पन्न करने के लिए रिकर्सिव कॉल करें (वर्तमान स्तर से गहराई 1 कम के साथ)।

नोड्स के साथ आप क्या करना चाहते हैं इसके आधार पर, आपको अन्य रिकर्सिव फ़ंक्शंस को परिभाषित करना होगा। उदाहरण के लिए, आप शायद अपने अभिव्यक्ति पेड़ों के पाठ प्रस्तुतिकरण उत्पन्न करना चाहते हैं। इसके लिए, आप प्रत्येक नोड कक्षाओं पर toString() परिभाषित कर सकते हैं। (OperatorNode.toString() को बाएं और दाएं उपट्री पर toString() पर कॉल करना होगा।)

आप शायद अभिव्यक्ति पेड़ों का मूल्यांकन करना चाहते हैं (चर के लिए दिए गए मानों के साथ)। इसके लिए, आप एक और रिकर्सिव फ़ंक्शन को परिभाषित कर सकते हैं, जिसे शायद evaluate() कहा जाता है। इसे एक पैरामीटर लेना होगा, शायद Map, जो वेरिएबल वैल्यू (या "बाइंडिंग्स") देगा, जिसके साथ आप अभिव्यक्ति का मूल्यांकन करना चाहते हैं। (अभी आपके अभिव्यक्ति पेड़ में केवल एक चर "x" हो सकता है, लेकिन मुझे लगता है कि आप और जोड़ना चाहते हैं। अगर आपको यकीन है कि आप केवल एक ही चर का उपयोग करेंगे, तो evaluate मूल्य के लिए एक संख्यात्मक तर्क ले सकता है "एक्स" का।)

आपके 3 नोड कक्षाओं के लिए evaluate का कार्यान्वयन बहुत आसान होगा। OperandNode और VariableNode सिर्फ एक मूल्य सीधे लौटाएगा; OperatorNode को बाएं और दाएं उपट्री पर evaluate पर कॉल करना होगा, उचित ऑपरेशन का उपयोग करके मूल्यों को गठबंधन करना होगा, फिर परिणाम वापस कर देना होगा।

+0

यह मूल रूप से जिस दिशा में मेरा नेतृत्व किया गया था, लेकिन मुझे भ्रमित करने वाला यह है कि मैं उन्हें बनाने के बाद नोड मानों को पुनर्प्राप्त करने के बारे में कैसे जाना है। एक संग्रह या अद्वितीय पहचानकर्ता के बिना, क्या मैं सिर्फ डिब्बेड नोड ऑब्जेक्ट्स नहीं बना रहा हूं जिन्हें मैं पुनर्प्राप्त नहीं कर सकता? – sitrick2

+0

मेरा संपादित उत्तर देखें। –

2

शायद this पर आपकी सहायता करेगा।

+0

इसके माध्यम से जा रहा है और इसके चारों ओर अपने सिर लपेटने की कोशिश कर रहा है। लिंक के लिए धन्यवाद। – sitrick2