为什么需要那么多for (int i = 0; i < 200; i++) {....}
真的有必要吗?而且你给出的代码中缺少:nervenet.java

解决方案 »

  1.   

    package flare;
    import java.util.*;
    import java.io.*;
    import java.text.*;
    /*
    神经网络
    */
    public class nervenet 
    {
    Vector vH = new Vector();
    Vector veSplus = new Vector();
    public double net(double x,double y)
    {
    sigmod si = new sigmod();
    StringBuffer sb = new StringBuffer();
    DecimalFormat df = new DecimalFormat("#0.0000");//为了以防越界,所以定义了小数点后有几位
    FieldPosition fp = new FieldPosition(0); randomSolution ran = new randomSolution();
    ran.addin();
    Enumeration e = ran.vin.elements();
    for (int k=0;k<45;k++)//把解个体45个权重放入Vector
    veSplus.addElement(ran.vin.elementAt(k));
    //求和函数和sigmod函数部分
    for (int i=0;i<15;i++)
    {
    int sp=0;sp++;
    double su = x*(Double.parseDouble((String)e.nextElement()))+y*(Double.parseDouble((String)e.nextElement()));
    double formatSu = Double.parseDouble(df.format(su,new StringBuffer(),new FieldPosition(0)).toString());
    double H = si.s(formatSu);
    vH.addElement(Double.toString(H));
    }
    double s,k=0;
    Enumeration eH = vH.elements();
    //A=H1*W31+H2*W32……+H15*W45
    for (int i=0;i<15;i++)
    {
    s = Double.parseDouble((String)eH.nextElement())*Double.parseDouble((String)e.nextElement());
    k+=s;
    }
    ran.vin.removeAllElements();
    return k;
    }
    /*
    public static void main(String args[])
    {
    try{
    System.out.println("请输入X坐标");
    BufferedReader bu1 = new BufferedReader(new InputStreamReader(System.in));
    double x = Double.parseDouble(bu1.readLine());
    System.out.println("请输入Y坐标");
    BufferedReader bu2 = new BufferedReader(new InputStreamReader(System.in));
    double y = Double.parseDouble(bu2.readLine());
    nervenet ne = new nervenet();
    System.out.println("通过15个隐神经元,得到的结果是:");
    System.out.println(ne.net(x,y));
    }catch(Exception ex){System.err.println(ex);}
    }
    //*/
    }如果不用循环,我不知道该用什么方法了。。
    200次是有必要的。因为原来算法中的要求就是这样的。。除了这样循环,我别无选择,请高手赐教。
      

  2.   

    现在程序有所改动了,所用的Vector 用完后就清空removeAllElements()
      

  3.   

    package flare;
    import java.lang.*;
    import java.util.*;
    import java.text.*;
    /*
    sigmod函数
    */
    public class  sigmod
    {
    private Random r = new Random();
    private double s=0.000000;
    private int w;
    public double s(double sum)
    {
    w = r.nextInt(1000);
    s = (1-Math.exp(-sum))/(1+Math.exp(-sum));
    return s;
    }
    }
      

  4.   

    用线程是很简单的,但问题是你的DB能同时支持这么多的查询请求吗?用同一个连接似乎是不行的.Vector result;for(int i = 0; i < 200; i++) {
       new Request("select ....").start();
    }
    synchronized(result) {
      while(result.size() != 200) {
         try{
            result.wait();
         }catch(Exception e){}
      }
    }
    // result is readyclass Request extends Thread() {
       String request;
       public Request(String request) {
          this.request = request;
       }
       public void run(){
          // get connection;
          // send request to connection
          // add to result
          synchronized(result) {
             result.add(...);
             result.notifyAll();
          }
          // free connection
       }
    }
      

  5.   

    不好意思.看到你的select就想当然是数据库了.如果你的运行环境是多CPU的,则做多线程可能有意义,但如果只是单CPU,多线程可能反而浪费时间,不如一个一个老老实实计算,你想,这么多的计算量都得由这一个CPU来完成,全部算完,时间应该是一样的,而多线程反而要多花线程管理的时间.但如果你是因为等结果不耐烦,则可以把计算放到一个线程A中,另一个线程B监视结果,每一个结果出来A就通知B,由B显示或...不好意思,没有时间仔细看你的程序,只是说说我的想法供你参考.
      

  6.   

    一个算法密集型的代码要提高性能的基本思路:
    1、定位瓶颈,找出你的代码中最消耗资源(cpu,内存,io等)的地方
    2、想办法优化它,比如将两个不是很相不关计算分成两个线程来完成,但是如果两者密不可分,建议不要使用线程
    3、如果没有达到要求,goto 1既然你的代码贴全了,我有空会测试测试的。
      

  7.   

    我改写成了多线程,速度确实提高了,但是遇到的问题是,得到的结果没办法加入到Vector中,很郁闷,不知道该如何解决
    这是关于这个问题的最后一篇贴,改写成多线程的http://expert.csdn.net/Expert/topic/1800/1800106.xml?temp=.5467646如果得到的结果不能加入到Vector中,那这个改如何是好?帮帮忙啊,我头都快大了。谢谢了!
      

  8.   

    正在拜读中,说实在的你的代码看起来有点累。主要是对你每个Vector的用途很疑惑。
      

  9.   

    select.java中的
    Vector ve = new Vector();
    Vector veSplus = new Vector();
    看起来像所有select对象共享的,但是你的代码里看起来好像怪怪的。
    我将你的代码改了一下,能运行,但如果200词循环的话会java.lang.OutOfMemoryError。package flare;import java.lang.*;
    import java.util.*;
    import java.text.*;
    import java.applet.*;public class  select extends Thread
    {
    Vector ve = new Vector();
    Vector veSplus = new Vector();
    public void run()//&acute;ú&Egrave;&euml;&Ouml;&Ouml;&Egrave;&ordm;&acute;ó&ETH;&iexcl;
    {

    //Thread thread = new Thread();
    int i;
    Random r = new Random();
    double pick=Math.random();//[0,1)&Euml;&aelig;&raquo;ú&Ecirc;&yacute;
    double sum=0;
    oldfitness old=new oldfitness();
    for (i=0;(sum<pick)&&(i<200);i++)
    {
    //System.out.println("in for");
    old.solutionFitness(200,20);
    double tmp1=Double.parseDouble((String)old.veS.elementAt(2));
    //if (tmp1!=0)
    sum+=tmp1/Double.parseDouble((String)old.veS.elementAt(3));
    //else
    // popsize+=1;
    //System.out.println("----------------"+sum+"    "+pick+"     "+i);
    }
    int tmp_i=i-1;
    ve.addElement(Integer.toString(tmp_i));
    for (int k=0;k<45;k++) {
    veSplus.addElement(old.veSplus.elementAt(k));
    System.out.println(veSplus.elementAt(k)+"----------"+k);
    }
    System.out.println("±&raquo;&Ntilde;&iexcl;&Ouml;&ETH;&micro;&Auml;&frac12;&acirc;&cedil;&ouml;&Igrave;&aring;±à&ordm;&Aring;&Icirc;&ordf;&pound;&ordm;"+ve.elementAt(0));
    }

    public static void main(String args[])
    {
    for (int i=0;i<2;i++)//&Ecirc;&auml;&sup3;&ouml;200&cedil;&ouml;±&raquo;&Ntilde;&iexcl;&Ocirc;&ntilde;&micro;&Atilde;&frac12;&acirc;&cedil;&ouml;&Igrave;&aring;&pound;&not;&sup2;&cent;&Ecirc;&auml;&sup3;&ouml;45&cedil;&ouml;&Egrave;¨&Ouml;&Oslash;
    {
    select se=new select();
    se.start();
    /*
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    */
    /*
    for (int k=0;k<45;k++)
    {
    System.out.println(se.veSplus.elementAt(k)+"----------"+k);
    }
    */
    //System.out.println("±&raquo;&Ntilde;&iexcl;&Ouml;&ETH;&micro;&Auml;&frac12;&acirc;&cedil;&ouml;&Igrave;&aring;±à&ordm;&Aring;&Icirc;&ordf;&pound;&ordm;"+se.ve.elementAt(i));
    }
    }
    //*/
    }
      

  10.   

    public class oldfitness 
    {
       Vector veS = new Vector();
       ...
    }
    中这个Vector必要吗?是不是可以用
    String plusTest;
    double fitnessTest;
    double testFitnessEnding;
    doulbe sumfitness;
    四个成员来代替?如果用这是个成员的话会比用Vector效率高点。我个人觉得你有点abuse using vector。一个是太多,另一个是:
    for (int i=0;i<s_plus_size ;i++ )
                   ^^^^^^^^^^^
    {
    double etmp = Double.parseDouble((String)e.nextElement());
                                                        ^^^^^^^^^^^^^^
    double ehtmp = Double.parseDouble((String)eh.nextElement());
                                                         ^^^^^^^^^^^^^^
    double n = nerve.net(etmp,ehtmp);
    if (n>0) {
    plusTest+=1;
    fitnessTest+=1;
    }else{
    plusTest+=0;
    }
    }
    s_plus_size是个参数从调用者传入的,而你居然用来做循环的条件,也不管是不是真的有nextElement()。
    建议你改成:
    for (int i=0;i<s_plus_size && i < xTest.vin.size() && i < yTest.vin.size() ;i++ ){
    .....
    }