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