2012-02-25 11 views
6

Tôi đang làm việc trên một dự án cho một lớp kỹ nghệ phần mềm tôi đang dùng. Mục tiêu là thiết kế một chương trình sẽ sử dụng lập trình di truyền để tạo ra một biểu thức toán học phù hợp với dữ liệu đào tạo được cung cấp.Tạo cây nhị phân trong Java cho mục đích lập trình di truyền

Tôi mới bắt đầu làm việc với dự án và cố gắng tạo ra cây nhị phân cho phép chiều cao cây do người dùng xác định và giữ riêng từng nút để tạo sự giao nhau và đột biến đơn giản hơn khi tôi thực hiện các quy trình đó.

Đây là các lớp nút mà tôi đã tạo cho đến thời điểm này. Xin hãy tha thứ cho những gì tôi chắc chắn là sự thiếu kinh nghiệm của tôi.

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

Điều này hoàn thành mọi thứ tôi cần ra khỏi các nút, nhưng tôi đang gặp khó khăn khi tìm cách biến chúng thành một cây lớn hơn. Tôi nhận ra rằng tôi cần phải sử dụng một loại bộ sưu tập của một số loại, nhưng dường như không thể tìm thấy một trong thư viện có vẻ thích hợp cho những gì tôi đang cố gắng làm.

Ngay cả khi di chuyển đúng hướng sẽ được đánh giá cao.

+0

Không thực sự là câu trả lời cho câu hỏi của bạn, nhưng bạn đã xem xét jgap chưa? http://jgap.sourceforge.net/ –

+0

Tôi muốn chạy qua nó, nhưng chúng tôi nhận được thêm tín dụng để xây dựng nó từ đầu, và thực sự, đây là một cái gì đó tôi chỉ muốn hiểu cho lợi ích cá nhân của tôi. – sitrick2

Trả lời

2

Vì vậy, bạn muốn tạo một cây ngẫu nhiên là OperatorNode s, OperandNode s và XNode s? Và bạn nói rằng bạn muốn làm cho người sử dụng chiều sâu cây được xác định?

Xác định hàm đệ quy được gọi là buildRandomTree hoặc tương tự. Cần lấy một tham số int cho độ sâu cây. Nếu tham số chiều sâu là 1, trả về một nút lá ngẫu nhiên (OperandNode hoặc XNode). Nếu tham số chiều sâu lớn hơn 1, tạo một OperatorNode ngẫu nhiên và thực hiện các cuộc gọi đệ quy để tạo các subtrees trái và phải (với độ sâu 1 nhỏ hơn mức hiện tại).

Tùy thuộc vào những gì bạn muốn làm với các nút, bạn sẽ phải xác định các hàm đệ quy khác. Ví dụ, bạn có thể muốn tạo ra các biểu diễn văn bản của các cây biểu thức của bạn. Đối với điều đó, bạn có thể xác định toString() trên mỗi lớp nút. (OperatorNode.toString() sẽ phải gọi toString() ở bên trái và bên phải.)

Bạn cũng có thể muốn đánh giá các cây biểu thức (với các giá trị đã cho cho các biến). Để làm được điều đó, bạn có thể định nghĩa một hàm đệ quy khác, có lẽ được gọi là evaluate(). Nó sẽ phải lấy một tham số, có lẽ là Map, sẽ cung cấp cho các giá trị biến (hoặc "ràng buộc") mà bạn muốn đánh giá biểu thức. (Ngay bây giờ cây biểu thức của bạn chỉ có thể chứa một biến "x", nhưng tôi tưởng tượng bạn có thể muốn thêm nhiều hơn. Nếu bạn chắc chắn bạn sẽ chỉ sử dụng một biến duy nhất, thì evaluate có thể lấy một đối số dạng số cho giá trị của "x".)

Việc triển khai evaluate cho 3 lớp nút của bạn sẽ rất đơn giản. OperandNodeVariableNode sẽ chỉ trả lại giá trị trực tiếp; OperatorNode sẽ phải gọi evaluate trên các subtrees trái và phải, kết hợp các giá trị bằng cách sử dụng thao tác thích hợp, sau đó trả lại kết quả.

+0

Điều này về cơ bản là hướng tôi đã đi vào, nhưng điều khiến tôi bối rối là làm thế nào để tìm kiếm các giá trị Node sau khi tạo chúng. Nếu không có một bộ sưu tập hoặc định danh duy nhất, tôi không chỉ tạo ra các đối tượng Nút bị hỏng mà tôi không thể truy xuất? – sitrick2

+0

Xem câu trả lời đã chỉnh sửa của tôi. –

2

Có thể xem this sẽ giúp bạn.

+0

Đi qua nó và cố gắng quấn quanh đầu tôi. Cảm ơn các liên kết. – sitrick2