graph2.java

来自「这是用遗传编程算法来拟合曲线的一个经典程序」· Java 代码 · 共 115 行

JAVA
115
字号
/*作者:徐朝*/
/*keystonexu@yahoo.com.cn*/
package regression.gui;
import kernel.*;
import regression.function.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Observer;
import java.util.Observable;
import java.applet.*;
public class Graph2  extends Frame implements ActionListener,Observer
{
	Graphs g;
	Kernel kernel;
	Evaluation e;
	TextArea t;
	Label mess;
	Button start;
	Thread thread;
	MessageGp message;
	double yold[] = new double[10];
	double ynew[] = new double[10];
	Graph2()
	{
		init();
	}
	 public void init() 
	 {
	 	double[] y;
	 	setBackground(Color.lightGray);
		this.kernel = new Kernel(new Parameter(),new Sets(), new Evaluation());
		kernel.addObserver(this);
		e = (Evaluation)(kernel.evaluate);
		setLayout(null);
		t = new TextArea(40,20);
		t.setText("");				
		y = e.getData();
		System.out.println("被拟合数据");
        for(int i = 0; i < y.length; i++)
        {
        	yold[i] = Math.round(y[i] * 1000.0) / 1000.0;
        	System.out.print(" " + yold[i]);
        }
        System.out.println();		
		g = new Graphs(y,null,Graphs.SCATTER);
		g.setBounds(220,20,500,300);
		t.setBounds(20,20,200,500);
		start = new Button("开始曲线拟合");
		start.setBounds(250,350,100,30);
		start.addActionListener(this);
		Label pro = new Label("每代最优程序的语法树");
		pro.setBounds(50,0,150,20);
		add(g);
		add(t);
		add(start);
		add(pro);
		 	
	 	
	 }
	public void update(Observable ob, Object arg)
    {
        message = (MessageGp)arg;
        double[] y = e.getData(message.individual);
        //Evaluation e = new Evaluation();
        System.out.println("第"+message.currentGeneration + "代");
        for(int i = 0; i < y.length; i++)
        {
        	ynew[i] = Math.round(y[i] * 1000.0) / 1000.0;
        	System.out.print(" " + ynew[i]);
        }        
        System.out.println();
        double raw_fitness = 0;
		for (int i = 0; i < y.length; i++)
		{		
			double difference = Math.sqrt((yold[i] - ynew[i]) * (yold[i] - ynew[i]));
			raw_fitness = raw_fitness + difference;	
			System.out.print(" " + Math.round(difference * 1000.0) / 1000.0);	
		}
		System.out.println();
        System.out.println("raw_fitness=" +  raw_fitness);
        System.out.println("standardfitness=" +  message.individual.standardizedFitness );
        //e.Evaluate1(message.individual);
        System.out.println("after: standardfitness=" +  message.individual.standardizedFitness );
		g.setData(y,message.individual.adjustedFitness,
		message.currentGeneration);
		t.setText("");
		t.setFont(new Font("宋体",Font.PLAIN,10));
		t.setText(message.individual.program.toString(false)); 
	    
    }
	
	public void actionPerformed(ActionEvent e) 
    {
    	if(e.getActionCommand().equals("开始曲线拟合"))
    	{
    		start.setLabel("停止曲线拟合");
    		thread = new Thread(kernel);
    		thread.start();

    	}
    	if(e.getActionCommand().equals("停止曲线拟合"))
    	{
    		start.setLabel("开始曲线拟合");
    		thread.stop();
    	}

    }
    public static void main(String args[])
    {
    	Graph2 g2 = new Graph2();
    	g2.setSize(800,800);
    	g2.show();
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?