2012-02-25 5 views
6

Çalıştığım bir yazılım mühendisliği sınıfı için bir proje üzerinde çalışıyorum. Amaç, sağlanan eğitim verilerine uyan bir matematiksel ifade oluşturmak için genetik programlama kullanacak bir program tasarlamaktır.Genetik Programlama Amaçlı Java'da bir ikili ağaç oluşturma

Proje üzerinde çalışmaya başladım ve kafamı, kullanıcı tanımlı ağaç yüksekliğine izin verecek ve her düğümün geçişini ve mutasyonunu daha basit hale getirmek için ayrı tutulacak bir ikili ağacın nasıl oluşturulacağı üzerine sarmaya çalışıyorum bu süreçleri uygulamaya başladığımda.

Şimdiye kadar oluşturduğum düğüm sınıfları. Lütfen emin olduğum şeyden dolayı acımasız tecrübemden özür dilerim.

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

Bu benim düğümler kendileri dışında gereken her şeyi yapar, ama daha büyük bir ağaca bunlar nasıl açacağınızı anlamaya çalışıyorum sorunlarla çalıştırıyorum. Bir çeşit koleksiyon türü kullanmam gerektiğinin farkındayım, ancak Kütüphanede, yapmaya çalıştığım şey için uygun görünen bir tane bulunamıyor gibi görünebilir.

Doğru yönde bir dürtme bile büyük ölçüde takdir edilecektir.

+0

Sorunuza gerçekten bir cevap değil, jgap'a baktınız mı? http://jgap.sourceforge.net/ –

+0

Karşılıklı olarak koşabilirdim, ama bunu sıfırdan yapmak için fazladan krediye sahibiz ve gerçekten, bu sadece kişisel çıkarlarımı anlamak istediğim bir şey. – sitrick2

cevap

2

OperatorNode s, OperandNode s ve XNode s rasgele bir ağaç oluşturmak istiyor musunuz? Ve ağaç derinliği kullanıcısını tanımlamak istediğini söyledin?

buildRandomTree veya benzeri bir özyineleme işlevi tanımlayın. Ağaç derinliği için tek bir int parametresini almalıdır. Derinlik parametresi 1 ise, rasgele bir yaprak düğümü (OperandNode veya XNode) döndürür. Derinlik parametresi 1'den fazlaysa, rastgele bir OperatorNode oluşturun ve sol ve sağ alttuşları oluşturmak için tekrarlı aramalar yapın (mevcut seviyeden daha az derinlik 1 ile).

Düğümlerle ne yapmak istediğinize bağlı olarak, diğer özyinelemeli işlevleri tanımlamanız gerekir. Örneğin, muhtemelen ifade ağaçlarınızın metinsel gösterimlerini oluşturmak isteyeceksiniz. Bunun için, düğüm sınıflarının her birinde toString() tanımlayabilirsiniz. (OperatorNode.toString(), sol ve sağ alttuşlarda toString()'u çağırmak zorunda kalacaktır.)

Büyük olasılıkla ifade ağaçlarını değerlendirmek isteyeceksiniz (değişkenler için verilen değerler). Bunun için belki evaluate() olarak adlandırılan başka bir özyinelemeyi tanımlayabilirsiniz. İfade ile değerlendirmek istediğiniz değişken değerleri (veya "bağlamaları") verecek bir parametre, muhtemelen bir Map almak zorunda olacaktır. (Şu anda ifade ağaçlarınız sadece tek bir "x" değişkeni içerebilir, ancak daha fazlasını eklemek isteyebileceğinizi hayal ediyorum. Tek bir değişken kullanacağınızdan eminseniz evaluate değeri tek bir sayısal argüman alabilir. "x".)

3 düğüm sınıfınız için evaluate uygulanması çok basit olacaktır. OperandNode ve VariableNode yalnızca bir değeri doğrudan döndürecektir; OperatorNode, sol ve sağ alttuşlarda evaluate'u aramak zorundadır, değerleri uygun işlemi kullanarak birleştirin, ardından sonucu döndürün.

+0

Bu temelde yönettiğim yönündeydi, ama kafamı karıştırmak, onları oluşturduktan sonra Düğüm değerlerini alma hakkında nasıl gidileceğidir. Bir koleksiyon ya da benzersiz bir tanımlayıcı olmadan, yalnızca alamadığım düğümlü Düğüm nesneleri yaratmıyorum? – sitrick2

+0

Düzenlenmiş cevabımı görün. –

2

Belki de this'a bakmanız size yardımcı olacaktır.

+0

Devam ediyor ve kafamı etrafına sarmaya çalışıyor. Bağlantı için teşekkürler. – sitrick2