سؤال

أنا أعمل على مشروع لفصل هندسة البرمجيات الذي أدرسه.الهدف هو تصميم برنامج يستخدم البرمجة الجينية لتوليد تعبير رياضي يناسب بيانات التدريب المقدمة.

لقد بدأت للتو العمل في المشروع، وأحاول أن أركز على كيفية إنشاء شجرة ثنائية تسمح بارتفاع الشجرة المحدد من قبل المستخدم وتبقي كل عقدة منفصلة لجعل التقاطع والتحول أكثر بساطة عندما أتمكن من ذلك تنفيذ تلك العمليات.

فيما يلي فئات العقدة التي قمت بإنشائها حتى الآن.يرجى العفو عن ما أنا متأكد من قلة خبرتي الواضحة.

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

يؤدي هذا إلى إنجاز كل ما أحتاجه من العقد نفسها، لكنني أواجه مشكلات أثناء محاولة معرفة كيفية تحويلها إلى شجرة أكبر.أدرك أنني بحاجة إلى استخدام نوع مجموعة من نوع ما، ولكن يبدو أنه لا يمكنني العثور على نوع في المكتبة يبدو مناسبًا لما أحاول القيام به.

وحتى الدفعة في الاتجاه الصحيح ستكون موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

لذلك تريد بناء شجرة عشوائية من OperatorNodeس، OperandNodeرمل XNodeس؟وقلت أنك تريد تحديد المستخدم لعمق الشجرة؟

تحديد وظيفة العودية تسمى buildRandomTree أو شيئا من هذا القبيل.ينبغي أن يستغرق واحدا int معلمة عمق الشجرةإذا كانت معلمة العمق هي 1، فقم بإرجاع عقدة طرفية عشوائية (OperandNode أو XNode).إذا كانت معلمة العمق أكثر من 1، فقم بإنشاء OperatorNode عشوائي، وقم بإجراء استدعاءات متكررة لإنشاء الشجرتين الفرعيتين اليسرى واليمنى (مع عمق 1 أقل من المستوى الحالي).

اعتمادًا على ما تريد فعله بالعقد، سيتعين عليك تحديد وظائف متكررة أخرى.على سبيل المثال، قد ترغب في إنشاء تمثيلات نصية لأشجار التعبير الخاصة بك.ولهذا يمكنك تحديد toString() على كل فئة من فئات العقدة.(OperatorNode.toString() سوف تضطر إلى الاتصال toString() على الأشجار الفرعية اليسرى واليمنى.)

ربما تريد أيضًا تقييم أشجار التعبير (مع قيم معينة للمتغيرات).لذلك، يمكنك تحديد دالة عودية أخرى، ربما تسمى evaluate().سيتعين عليها أن تأخذ معلمة واحدة، ربما أ Map, ، والتي ستعطي قيم المتغير (أو "الارتباطات") التي تريد تقييم التعبير بها.(في الوقت الحالي، يمكن أن تحتوي أشجار التعبير الخاصة بك على متغير واحد فقط "x"، لكنني أتصور أنك قد ترغب في إضافة المزيد.إذا كنت متأكدًا من أنك ستستخدم متغيرًا واحدًا فقط، إذن evaluate يمكن أن تأخذ وسيطة رقمية واحدة لقيمة "x".)

تنفيذ evaluate لفئات العقدة الثلاثة الخاصة بك ستكون جميعها بسيطة للغاية. OperandNode و VariableNode سيرجع فقط قيمة مباشرة؛ OperatorNode سوف تضطر إلى الاتصال evaluate على الشجرتين الفرعيتين اليمنى واليسرى، قم بدمج القيم باستخدام العملية المناسبة، ثم قم بإرجاع النتيجة.

نصائح أخرى

ربما تبحث في هذا سوف يساعدك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top