2012-02-25 4 views
6

나는 내가 수행하고있는 소프트웨어 엔지니어링 클래스를 위해 프로젝트 작업을하고 있습니다. 목표는 제공된 프로그래밍 데이터에 적합한 수학적 표현을 생성하기 위해 유전 프로그래밍을 사용할 프로그램을 설계하는 것입니다.유전 프로그래밍 목적을위한 Java에서 이진 트리 만들기

방금 ​​프로젝트를 시작했는데, 사용자 정의 트리 높이를 허용하고 각 노드를 분리하여 교차 및 변이를 더 간단하게 만드는 이진 트리를 작성하는 방법에 대해 머리를 쓰려고합니다. 내가 그러한 프로세스를 구현할 때.

다음은 지금까지 작성한 노드 클래스입니다. 내가 분명히 드러내는 것이 나의 명백한 경험이 아님을 용서해주십시오.

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 s, OperandNode s 및 XNode s의 무작위 트리를 생성 하시겠습니까? 트리 깊이를 사용자가 정의하도록 하시겠습니까?

buildRandomTree 또는 이와 비슷한 재귀 함수를 정의하십시오. 트리 깊이에 대해 하나의 int 매개 변수를 사용해야합니다. depth 매개 변수가 1이면 임의의 리프 노드 (OperandNode 또는 XNode)를 반환합니다. depth 매개 변수가 1보다 크면 임의의 OperatorNode를 생성하고 재귀 호출을 수행하여 왼쪽 및 오른쪽 하위 트리 (현재 수준보다 작은 깊이 1)를 생성합니다.

노드를 사용하여 수행 할 작업에 따라 다른 재귀 함수를 정의해야합니다. 예를 들어, 표현 트리의 텍스트 표현을 생성하고자 할 것입니다. 이를 위해 각 노드 클래스에 toString()을 정의 할 수 있습니다. (OperatorNode.toString()은 왼쪽 및 오른쪽 하위 트리에 toString()을 호출해야합니다.)

아마도 변수에 대해 지정된 값을 사용하여 표현 트리를 평가해야 할 것입니다. 이를 위해 evaluate()이라고하는 다른 재귀 함수를 정의 할 수 있습니다. 표현식을 평가할 변수 값 (또는 "바인딩")을 제공하는 하나의 매개 변수 (예 : Map)를 가져야합니다. (지금 당신의 표현식 트리는 하나의 변수 "x"만을 가질 수 있지만 더 많은 것을 추가 할 수 있다고 생각합니다. 당신이 오직 하나의 변수만을 사용할 것이라면, evaluate은 그 값에 대해 하나의 숫자 인자를 취할 수 있습니다 "x".)

3 노드 클래스의 evaluate 구현은 모두 매우 간단합니다. OperandNodeVariableNode은 값을 직접 반환합니다. OperatorNode은 왼쪽 및 오른쪽 하위 트리에 evaluate을 호출하고 해당 작업을 사용하여 값을 결합한 다음 결과를 반환해야합니다.

+0

이것은 기본적으로 내가 지향하는 방향 이었지만 나를 혼란스럽게 만드는 것은 노드 값을 생성 한 후 Node 값을 검색하는 방법입니다. 컬렉션이나 고유 한 식별자가 없으면 검색 할 수없는 모양이 아닌 노드 객체 만 만들면 안됩니까? – sitrick2

+0

내 수정 된 답변보기 –

2

어쩌면 this을 보면 도움이 될 것입니다.

+0

그것을 통해 가고 그것의 주위에 나의 머리를 감싸는 것을 시도하는. 링크를 가져 주셔서 감사합니다. – sitrick2