www.pudn.com > asm_java.zip > asm.java


package asm;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

/**
 * Title:        Artificial Stock Market
 * Description:  人工模拟股市(来源:SFI的Swarm版本)的Java版本
 * Copyright:    Copyright (c) 2003
 * Company:      http://agents.yeah.net
 * @author jake
 * @version 1.0
 */

public class asm extends Applet implements Runnable  {
  boolean isStandalone = false;//标志该程序是否独立运行
  boolean bFirst=true;//标志主线称是否第一次运行
  Button btnStart = new Button();
  Button btnStop = new Button();
  Label label1 = new Label();
  TextField txtAgentNum = new TextField();
  Button btnWorld = new Button();
  Label label2 = new Label();
  TextField txtStatus = new TextField();
  Button btnAgentView = new Button();
  Button btnPolar = new Button();
  Label label3 = new Label();
  TextField txtGAP = new TextField();
  Label label4 = new Label();
  TextField txtRuleNum = new TextField();
  Label label5 = new Label();
  Label label6 = new Label();
  Label label7 = new Label();
  TextField txtMutation = new TextField();
  Label label8 = new Label();
  TextField txtCross = new TextField();
  Button btnContinue = new Button();

  Thread runner;//创建一个线程,让动画平滑的运行
  boolean running;//是否让动画运行

  //下面的参数都是股市的参数
  public ASMParam ASMParams;//ASMParam类的实例,股市的参数设置都在该类中
  public AgentParam AgentParams;//AgentParam类的实例,Agent的参数设置在该类中
  public AsmModel model;
  Button btnRulesView = new Button();
  Button btnStep = new Button();//股市模型的一个实例。


  //下面的代码都是jbuilder自己生成的
  /**Get a parameter value*/
  public String getParameter(String key, String def) {
    return isStandalone ? System.getProperty(key, def) :
      (getParameter(key) != null ? getParameter(key) : def);
  }

  /**Construct the applet*/
  public asm() {
    ASMParams=new ASMParam();
    AgentParams=new AgentParam();
  }
  /**Initialize the applet*/
  public void init() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  /**Component initialization*/
  private void jbInit() throws Exception {
    //初始化各个控件。
    btnStart.setLabel("开始");
    btnStart.setBounds(new Rectangle(5, 270, 65, 22));
    this.setLayout(null);
    btnStop.setLabel("停止");
    btnStop.setBounds(new Rectangle(68, 270, 70, 22));
    label1.setText("Agent的数目:");
    label1.setBounds(new Rectangle(11, 12, 83, 26));
    txtAgentNum.setText("30");
    txtAgentNum.setBounds(new Rectangle(122, 11, 47, 21));
    btnWorld.setEnabled(false);
    btnWorld.setLabel("曲线图");
    btnWorld.setBounds(new Rectangle(93, 123, 112, 24));
    label2.setText("世界状态:");
    label2.setBounds(new Rectangle(4, 240, 62, 22));
    txtStatus.setEditable(false);
    txtStatus.setText("就绪");
    txtStatus.setBounds(new Rectangle(69, 242, 226, 19));
    btnAgentView.setEnabled(false);
    btnAgentView.setLabel("曲线图");
    btnAgentView.setBounds(new Rectangle(95, 167, 91, 22));
    btnPolar.setEnabled(false);
    btnPolar.setLabel("柱状图");
    btnPolar.setBounds(new Rectangle(186, 167, 90, 22));
    label3.setText("执行遗传算法频率:");
    label3.setBounds(new Rectangle(10, 43, 113, 20));
    txtGAP.setText("250");
    txtGAP.setBounds(new Rectangle(122, 43, 46, 20));
    label4.setText("规则数目:");
    label4.setBounds(new Rectangle(176, 13, 60, 17));
    txtRuleNum.setText("100");
    txtRuleNum.setBounds(new Rectangle(238, 11, 45, 20));
    label5.setText("查看世界:");
    label5.setBounds(new Rectangle(10, 123, 66, 21));
    label6.setText("查看Agent:");
    label6.setBounds(new Rectangle(10, 162, 73, 22));
    label7.setText("变异概率:");
    label7.setBounds(new Rectangle(175, 43, 60, 15));
    txtMutation.setText("0.01");
    txtMutation.setBounds(new Rectangle(237, 41, 47, 17));
    label8.setText("交叉概率:");
    label8.setBounds(new Rectangle(10, 66, 68, 17));
    txtCross.setText("0.3");
    txtCross.setBounds(new Rectangle(80, 66, 52, 17));
    btnContinue.setEnabled(false);
    btnContinue.setLabel("暂停");
    btnContinue.setBounds(new Rectangle(137, 270, 70, 22));
    btnRulesView.setEnabled(false);
    btnRulesView.setLabel("查看规则");
    btnRulesView.setBounds(new Rectangle(94, 196, 91, 25));
    btnStep.setEnabled(false);
    btnStep.setLabel("单步运行");
    btnStep.setBounds(new Rectangle(206, 270, 87, 22));
    this.add(btnStart, null);
    this.add(txtStatus, null);
    this.add(label1, null);
    this.add(label3, null);
    this.add(txtGAP, null);
    this.add(txtAgentNum, null);
    this.add(label5, null);
    this.add(label4, null);
    this.add(txtRuleNum, null);
    this.add(label2, null);
    this.add(label7, null);
    this.add(txtMutation, null);
    this.add(label8, null);
    this.add(txtCross, null);
    this.add(label6, null);
    this.add(btnPolar, null);
    this.add(btnStop, null);
    this.add(btnContinue, null);
    this.add(btnStep, null);
    this.add(btnAgentView, null);
    this.add(btnRulesView, null);
    this.add(btnWorld, null);
  }

  //系统自己生成的代码
  /**Get Applet information*/
  public String getAppletInfo() {
    return "Applet Information";
  }
  /**Get parameter info*/
  public String[][] getParameterInfo() {
    return null;
  }
  /**Main method*/
  public static void main(String[] args) {
    asm applet = new asm();
    applet.isStandalone = true;
    Frame frame;
    frame = new Frame() {
      protected void processWindowEvent(WindowEvent e) {
        super.processWindowEvent(e);
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
          System.exit(0);
        }
      }
      public synchronized void setTitle(String title) {
        super.setTitle(title);
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
      }
    };
    frame.setTitle("Applet Frame");
    frame.add(applet, BorderLayout.CENTER);
    applet.init();
    applet.start();
    frame.setSize(400,320);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2);
    frame.setVisible(true);
  }

  //在一个文本框中显示世界的运行状况。
  public void setStatus(String txt){
    txtStatus.setText(txt);
  }

  //相应按钮单击事件
      public boolean action(Event evt, Object o) {
    		if (evt.target == btnStart) {
                  //当按下开始按钮的时候
 			running=true;//首先让线程运行起来

                        //设置各个按钮的可按状态
                        btnStart.setEnabled(false);
                        btnContinue.setEnabled(true);
                        txtAgentNum.setEnabled(false);
                        txtGAP.setEnabled(false);
                        txtMutation.setEnabled(false);
                        txtCross.setEnabled(false);
                        txtRuleNum.setEnabled(false);

                        //从各个文本设置框中读取参数的数值
                        ASMParams.numBFagents=Integer.parseInt(txtAgentNum.getText());
                        if(ASMParams.numBFagents<=0){
                          ASMParams.numBFagents=1;
                          txtAgentNum.setText(String.valueOf(ASMParams.numBFagents));
                        }
                        AgentParams.gafrequency=Integer.parseInt(txtGAP.getText());
                        if(AgentParams.gafrequency<10){
                          AgentParams.gafrequency=10;
                          txtGAP.setText("10");
                        }
                        AgentParams.numfcasts=Integer.parseInt(txtRuleNum.getText());
                        if(AgentParams.numfcasts<1){
                          AgentParams.numfcasts=1;
                          txtRuleNum.setText("1");
                        }
                        AgentParams.pmutation=Double.valueOf(txtMutation.getText()).doubleValue();
                        if(AgentParams.pmutation<=0||AgentParams.pmutation>=1){
                            AgentParams.pmutation=0.5;
                            txtMutation.setText("0.5");
                        }
                        AgentParams.pcrossover=Double.valueOf(txtCross.getText()).doubleValue();
                        if(AgentParams.pcrossover<=0||AgentParams.pcrossover>=1){
                            AgentParams.pcrossover=0.5;
                            txtMutation.setText("0.5");
                        }
                        AgentParams.reinit();
                        return true;
		}else if(evt.target == btnStop){
                    //档案下结束按钮的时候,设置各个按钮的可按下状态
                    btnStart.setEnabled(true);
                    btnPolar.setEnabled(false);
                    btnWorld.setEnabled(false);
                    btnRulesView.setEnabled(false);
                    btnAgentView.setEnabled(false);
                    btnContinue.setEnabled(false);
                    txtAgentNum.setEnabled(true);
                    txtGAP.setEnabled(true);
                    txtMutation.setEnabled(true);
                    txtCross.setEnabled(true);
                    txtRuleNum.setEnabled(true);

                    //停止线程的运行
                    running=false;
                    setStatus("就绪...");

                    //标志下次运行为第一次运行
                    bFirst=true;
                    return true;
                }else if(evt.target==btnWorld){
                  //以下为各个按钮弹出相应的窗口界面
                  //model为当前世界的实例,作为参数传入,1表示显示的是Agent的状态,0表示显示世界的状态。
                  CurveShow ctl=new CurveShow(model,0);
                  ctl.setSize(550,400);
                  ctl.show();
                  return true;
                }else if(evt.target==btnAgentView){
                  //model为当前世界的实例,作为参数传入,1表示显示的是Agent的状态,0表示显示世界的状态。
                  CurveShow ctl1=new CurveShow(model,1);
                  ctl1.setSize(550,400);
                  ctl1.show();
                  return true;
                }else if(evt.target==btnPolar){
                  PolarShow ctl=new PolarShow(model,0);
                  ctl.setSize(550,400);
                  ctl.show();
                  return true;
                }else if(evt.target==btnContinue){
                  //暂停/继续按钮,在两种状态之间切换。
                  if(btnContinue.getLabel()=="暂停"){
                     btnContinue.setLabel("继续");
                     btnStep.setEnabled(true);
                     running=false;
                  }else{
                     btnContinue.setLabel("暂停");
                     btnStep.setEnabled(false);
                     running=true;
                  }
                  return true;
                }else if(evt.target==btnRulesView){
                  RuleView ctl=new RuleView(model);
                  ctl.setSize(800,480);
                  ctl.show();
                }else if(evt.target==btnStep){
                  model.OneStep();
                  return true;
                }
                return false;

        }
        public void start()
        //下面三个函数是控制线程的
	{
        //线程启动
		if (runner == null)
		{
			runner= new Thread(this);
			runner.start();
			//running = true;
		}
	}

	public void stop()
	{
        //线程终止
		if (runner!=null)
		{
			runner.stop();
			runner=null;
			running = false;
		}
	}

	public void run() {
          //线程运行
		int i;
                //线程一直运行下去
		while (true) {
		        if(running){
                          //如果running=true,则运行模拟股市
 		 	  if(bFirst){
                            //如果是第一次运行,则新建实例
                            model=new AsmModel(this);

                            //创建股市中的对象
                            model.buildObjects();
                            setStatus("股市预运行(没有Agent参与)");
                            //股市的热身运行
                            for (int j = 0; j < 502; j++)
                                model.doWarmupStep();

                            //当热身结束,则设置几个按钮的可按下状态。
                            btnPolar.setEnabled(true);
                            btnWorld.setEnabled(true);
                            btnAgentView.setEnabled(true);
                            btnRulesView.setEnabled(true);
                            //标志第一次运行bFirst=false
                            bFirst=false;
                          }

                          //运行股市的一个仿真周期
                          model.OneStep();
                        }
		 	try { Thread.sleep(100);}
		 	catch (InterruptedException e) {
			}
		}

	}
        public void terminate(){
          //结束运行(该函数会引起applet的错误)
            model.terminate();
        }

}