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次是有必要的。因为原来算法中的要求就是这样的。。除了这样循环,我别无选择,请高手赐教。
现在程序有所改动了,所用的Vector 用完后就清空removeAllElements()
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; } }
用线程是很简单的,但问题是你的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 } }
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()//´úÈëÖÖȺ´óС {
//Thread thread = new Thread(); int i; Random r = new Random(); double pick=Math.random();//[0,1)Ëæ»úÊý 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("±»Ñ¡ÖеĽâ¸öÌå±àºÅΪ£º"+ve.elementAt(0)); }
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次是有必要的。因为原来算法中的要求就是这样的。。除了这样循环,我别无选择,请高手赐教。
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;
}
}
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
}
}
1、定位瓶颈,找出你的代码中最消耗资源(cpu,内存,io等)的地方
2、想办法优化它,比如将两个不是很相不关计算分成两个线程来完成,但是如果两者密不可分,建议不要使用线程
3、如果没有达到要求,goto 1既然你的代码贴全了,我有空会测试测试的。
这是关于这个问题的最后一篇贴,改写成多线程的http://expert.csdn.net/Expert/topic/1800/1800106.xml?temp=.5467646如果得到的结果不能加入到Vector中,那这个改如何是好?帮帮忙啊,我头都快大了。谢谢了!
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()//´úÈëÖÖȺ´óС
{
//Thread thread = new Thread();
int i;
Random r = new Random();
double pick=Math.random();//[0,1)Ëæ»úÊý
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("±»Ñ¡ÖеĽâ¸öÌå±àºÅΪ£º"+ve.elementAt(0));
}
public static void main(String args[])
{
for (int i=0;i<2;i++)//Êä³ö200¸ö±»Ñ¡ÔñµÃ½â¸öÌ壬²¢Êä³ö45¸öȨÖØ
{
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("±»Ñ¡ÖеĽâ¸öÌå±àºÅΪ£º"+se.ve.elementAt(i));
}
}
//*/
}
{
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++ ){
.....
}