为什么需要那么多for (int i = 0; i < 200; i++) {....}
真的有必要吗?而且你给出的代码中缺少:nervenet.java
真的有必要吗?而且你给出的代码中缺少:nervenet.java
解决方案 »
- Corba问题
- 只有10分了不知道有没有人愿意回答啊!一个正则问题!实在不会写了
- 为什么“载入java小应用程序失败”?
- 菜鸟请教实例方法的调用
- 通过一个具体的年份和月份,想得到这个月份具体有几天。
- 怎么理解接口?
- 老问题!
- 我现在想绑定资源,可是用ResourceBundle.getBundle(),又不知道路径位置
- 我是一个Java的初学者,遇到一点问题,请各位帮忙
- 我用jbuilder,建了个project,然后再建了个class,我想在此class里引用我com.ora.sql.*;里的类如何做?
- BasicCodeGenerator 基本类代码生成器JBuilder插件
- jdk菜鸟问题
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++ ){
.....
}