⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 curveshow.java

📁 人工股市(Artificial Stock Market
💻 JAVA
字号:
package asm;import java.awt.event.*;import java.util.Vector;import java.awt.*;/** * Title:        Artificial Stock Market * Description:  人工模拟股市(来源:SFI的Swarm版本)的Java版本 * Copyright:    Copyright (c) 2003 * Company:      http://agents.yeah.net * @author jake * @version 1.0 */public class CurveShow extends Frame implements Runnable{  Panel view = new Panel();  Thread runner1;//定义独立线程  Graphics gra;//在一个面板view上画图  int cycles=100;//图中显示的横坐标数目  int cyclemax;//主程序中定义的历史数据最大长度  int originx=40;//画图区域原点的坐标  int originy=20;  int type;  public int nAgentIndex=0;  AsmModel local;//主程序的本地拷贝  Choice choicelen = new Choice();  Label label1 = new Label();  Label label2 = new Label();  Choice choiceItem1 = new Choice();  Label label3 = new Label();  Choice choiceItem2 = new Choice();  Label lblAgent = new Label();  Choice choiceAgent = new Choice();  Label label5 = new Label();  Label label6 = new Label();  public CurveShow(AsmModel pd,int type1) {    super("数据走向...");    local=pd;    type=type1;    try {      jbInit();    }    catch(Exception e) {      e.printStackTrace();    }  }  private void jbInit() throws Exception {    this.setLayout(null);    view.setBackground(Color.white);    view.setBounds(new Rectangle(6, 26, 537, 316));    this.setBackground(Color.gray);    this.addWindowListener(new java.awt.event.WindowAdapter() {      public void windowOpened(WindowEvent e) {        this_windowOpened(e);      }      public void windowClosing(WindowEvent e) {        this_windowClosing(e);      }    });    choicelen.setBounds(new Rectangle(69, 355, 94, 21));    choicelen.addItemListener(new java.awt.event.ItemListener() {      public void itemStateChanged(ItemEvent e) {        choicelen_itemStateChanged(e);      }    });    for(int i=0;i<40;i++){       choicelen.addItem(Integer.toString((i+1)*100));    }    if(type==0){      choiceItem1.addItem("股票价格");      choiceItem2.addItem("股票价格");      choiceItem1.addItem("股息");      choiceItem2.addItem("股息");      choiceItem1.addItem("风险中性价格");      choiceItem2.addItem("风险中性价格");      choiceItem2.addItem("无");      choiceItem1.select(0);      choiceItem2.select(2);    }else if(type==1){      for(int i=0;i<local.asmModelParams.numBFagents;i++){        choiceAgent.addItem(Integer.toString(i));      }      choiceItem1.addItem("股票需求量");      choiceItem1.addItem("总财富");      choiceItem1.addItem("股票份额");      choiceItem1.addItem("现金量");      choiceItem1.addItem("规则平均特定度");      choiceItem1.addItem("预测量");      choiceItem1.addItem("预测偏差");      choiceItem1.addItem("预测系数a");      choiceItem1.addItem("预测系数b");      choiceItem2.addItem("股票需求量");      choiceItem2.addItem("总财富");      choiceItem2.addItem("股票份额");      choiceItem2.addItem("现金量");      choiceItem2.addItem("规则平均特定度");      choiceItem2.addItem("预测量");      choiceItem2.addItem("预测偏差");      choiceItem2.addItem("预测系数a");      choiceItem2.addItem("预测系数b");      choiceItem2.addItem("无");      choiceItem1.select(0);      choiceItem2.select(choiceItem2.getItemCount()-1);    }    label1.setText("显示长度:");    label1.setBounds(new Rectangle(4, 360, 60, 12));    label2.setText("观察项目1:");    label2.setBounds(new Rectangle(171, 342, 70, 21));    choiceItem1.setBounds(new Rectangle(239, 345, 122, 18));    label3.setText("观察项目2:");    label3.setBounds(new Rectangle(170, 369, 72, 15));    choiceItem2.setBounds(new Rectangle(239, 367, 122, 18));    lblAgent.setText("选择智能体编号:");    lblAgent.setBounds(new Rectangle(435, 344, 107, 18));    choiceAgent.setBounds(new Rectangle(436, 363, 94, 17));    label5.setText("蓝色线");    label5.setBounds(new Rectangle(364, 345, 47, 17));    label6.setText("红色线");    label6.setBounds(new Rectangle(364, 365, 40, 18));    this.add(view, null);    this.add(label2, null);    this.add(choiceItem1, null);    this.add(label3, null);    this.add(choiceItem2, null);    this.add(choicelen, null);    this.add(label1, null);    if(type==1){        this.add(lblAgent, null);        this.add(choiceAgent, null);    }    this.add(label5, null);    this.add(label6, null);    this.pack();    this.addWindowListener(new java.awt.event.WindowAdapter() {      public void windowClosing(WindowEvent e) {        this_windowClosing(e);      }    });  }  void this_windowClosing(WindowEvent e) {    this.hide();    this.dispose();  }  void btnClose_actionPerformed(ActionEvent e) {    this.hide();    this.dispose();  }   void this_windowOpened(WindowEvent e) {    gra=view.getGraphics();    cyclemax=WorldVariants.cycleMax;    repaint();    if(runner1==null){      runner1=new Thread(this);      runner1.start();    }  }  public void paint(Graphics g) {    /**@todo: Override this java.awt.Component method*/    //画图函数    Vector history=new Vector();    double value1max=100;    double value1min=-100;    double value2max=100;    double value2min=-100;    double valuemax=100;    double valuemin=-100;    boolean noneItem,isDrawn;    String sName="";    if(type==0){        history=local.world.Histories;    }else if(type==1){        nAgentIndex=choiceAgent.getSelectedIndex();        Agent ag=(Agent)local.agentList.elementAt(nAgentIndex);        history=ag.History;    }    int width=517-originx-25;    int height=316-originy;    //int step=localpd.steps;    int step=local.modelTime;    int nStart=0;    int nEnd=cycles;    int size=history.size();    if(step-cycles>0){        //计算需要绘制的历史数据数组中的启示索引        nStart=step-cycles;    }    //清空画图区域    gra.clearRect(0,0,517,316);    //设定原点坐标    int x=0,y=0,y0=height-originy;    //对设定的要画的横坐标点数循环    noneItem=false;   for(int i=0;i<cycles;i++){      //当前点坐标      isDrawn=true;      int x1=(int)((i*width)/cycles);      double value1=0;      double value2=0;      if((i+nStart)%cyclemax<size){        if(type==0){          WorldVariants wv=(WorldVariants)history.elementAt((i+nStart)%cyclemax);          switch(choiceItem1.getSelectedIndex()){          case 0:            value1=wv.price;            if(i==0)sName="价格";            value1max=local.asmModelParams.maxprice;            value1min=local.asmModelParams.minprice;            break;          case 1:            value1=wv.dividend;            if(i==0)sName="股息";            value1max=local.asmModelParams.maxdividend;            value1min=local.asmModelParams.mindividend;            break;          case 2:            if(i==0)sName="股息/利息";            value1=wv.risk_neutral;            value1max=local.asmModelParams.maxprice;            value1min=local.asmModelParams.minprice;            break;          }          switch(choiceItem2.getSelectedIndex()){          case 0:            value2=wv.price;            value2max=local.asmModelParams.maxprice;            value2min=local.asmModelParams.minprice;            break;          case 1:            value2=wv.dividend;            if(i==0)sName+="-股息";            value2max=local.asmModelParams.maxdividend;            value2min=local.asmModelParams.mindividend;            break;          case 2:            if(i==0)sName+="-股息/利息";            value2=wv.risk_neutral;            value2max=local.asmModelParams.maxprice;            value2min=local.asmModelParams.minprice;            break;          case 3:            noneItem=true;            value2=value1min;            value2max=value1max;            value2min=value1min;          }        }else if(type==1){          AgentVariants agv=(AgentVariants)history.elementAt((i+nStart)%cyclemax);          if(i==0)sName=choiceItem1.getSelectedItem();          switch (choiceItem1.getSelectedIndex()){          case 0:            value1=agv.demand;            value1max=local.bfParams.maxbid;            value1min=-value1max;            break;          case 1:            value1=agv.wealth;            value1max=local.asmModelParams.initialcash*10 + local.asmModelParams.maxprice*local.asmModelParams.initholding;            value1min=0;            break;          case 2:            value1=agv.position;            value1max=local.asmModelParams.initholding;            value1min=0;            break;          case 3:            value1=agv.cash;            value1max=local.asmModelParams.initialcash*10;            value1min=0;            break;          case 4:            value1=agv.avspecificity;            value1max=local.bfParams.condbits;            value1min=0;            break;          case 5:            value1=agv.forecast;            value1max=local.asmModelParams.maxprice;            value1min=local.asmModelParams.minprice;            break;          case 6:            value1=agv.realDeviation;            value1max=local.asmModelParams.maxprice-local.asmModelParams.minprice;            value1min=-value1max;            break;          case 7:            value1=agv.pdcoeff;            value1max=local.bfParams.a_max;            value1min=0;            break;          case 8:            value1=agv.offset;            value1max=local.bfParams.b_max;            value1min=local.bfParams.b_min;            break;          }          switch (choiceItem2.getSelectedIndex()){          case 0:            value2=agv.demand;            value2max=local.bfParams.maxbid;            value2min=-value2max;            break;          case 1:            value2=agv.wealth;            value2max=local.asmModelParams.initialcash*10 + local.asmModelParams.maxprice*local.asmModelParams.initholding;;            value2min=0;            break;          case 2:            value2=agv.position;            value2max=local.asmModelParams.initholding;            value2min=0;            break;          case 3:            value2=agv.cash;            value2max=local.asmModelParams.initialcash*10;            value2min=0;            break;          case 4:            value2=agv.avspecificity;            value2max=local.bfParams.condbits;            value2min=0;            break;          case 5:            value2=agv.forecast;            value2max=local.asmModelParams.maxprice;            value2min=local.asmModelParams.minprice;            break;          case 6:            value2=agv.realDeviation;            value2max=local.asmModelParams.maxprice-local.asmModelParams.minprice;            value2min=-value1max;            break;          case 7:            value2=agv.pdcoeff;            value2max=local.bfParams.a_max;            value2min=0;            break;          case 8:            value2=agv.offset;            value2max=local.bfParams.b_max;            value2min=local.bfParams.b_min;            break;          case 9:            noneItem=true;            value2=value1min;            value2max=value1max;            value2min=value1min;          }         if(i==0&&!noneItem)sName+="-"+choiceItem2.getSelectedItem();        }      }else{        isDrawn=false;        value1=valuemin;        value2=valuemin;      }      valuemax=value1max;      valuemin=value1min;      if(!noneItem){        if(valuemax<value2max)valuemax=value2max;        if(valuemin>value2min)valuemin=value2min;      }      if(valuemax==valuemin)valuemin=valuemax-100;      int y1=(int)(height*(value1-valuemin)/(valuemax-valuemin));      //绘制合作者比例      if(y1<=0){        y1=1;      }else if(y1>=height){        y1=height;      }      if(isDrawn){        gra.setColor(Color.blue);        gra.drawLine(x+originx,height-y,x1+originx,height-y1);      }      //绘制不合作者比例      int y2=(int)(height*(value2-valuemin)/(valuemax-valuemin));      if(y2<=0){        y2=1;      }else if(y2>=height){        y2=height;      }      if(isDrawn&&!noneItem){        gra.setColor(Color.red);        gra.drawLine(x+originx,height-y0,x1+originx,height-y2);      }      //前一点的坐标      x=x1;      y=y1;      y0=y2;    }    //画坐标轴及其说明文字    gra.setColor(Color.black);    gra.drawLine(originx,height,width+originx,height);    gra.drawLine(originx,height,originx,0);    gra.drawString("时间",width+originx,height);    gra.drawString(sName,originx-35,originy/2);    this.setTitle(sName+"(曲线图)");    for(int i=0;i<10;i++){        int x3=(int)(i*width/10)+originx;        int y3=height;        gra.drawLine(x3,y3,x3,y3-2);        String txt;        if(step>cycles){          txt=Integer.toString((int)(step-cycles+i*cycles/10));        }else{          txt=Integer.toString((int)(i*cycles/10));        }        gra.drawString(txt,x3,y3+12);    }    for(int i=0;i<=9;i++){        int x3=originx;        int y3=(int)((10-i)*height/10);        gra.drawLine(x3,y3,x3+2,y3);        float num=(float)((double)(i*(valuemax-valuemin))/(double)10+valuemin);        String txt=Float.toString(num);        if(txt.length()>=5)txt=txt.substring(0,5);        gra.drawString(txt,x3-30,y3+5);    }    super.paint(g);  }   void choicelen_itemStateChanged(ItemEvent e) {    cycles=(choicelen.getSelectedIndex()+1)*100;    repaint();  }  void btnRefresh_actionPerformed(ActionEvent e) {    repaint();  }  public void stop() {    if (runner1!=null)    {      // running = false;        runner1.stop();       runner1=null;    }  }  public void run()   {    while(true){        repaint();        try{Thread.sleep(1000);}catch(InterruptedException e){};    }  }}

⌨️ 快捷键说明

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