2012-11-29 66 views
3

我有一个健身功能作为实验室的一部分,并希望将其应用于一组“权重”(ArrayList权重)。我创建了该数组并在其中存储了一些值。我创建了随机二进制字符串(最后为了生成随机值而在结尾处有一个'x'),我也希望将这些字符串应用于适应度函数;然而,我遇到的问题是健身功能始终返回值0.我在这里错过了什么?Java健身功能 - 缩放

适应度函数如下:

import java.util.*; 
public class ScalesSolution{ 
private static String scasol; 
//Creates a new scales solution based on a string parameter 
//The string parameter is checked to see if it contains all zeros and ones 
//Otherwise the random binary string generator is used (n = length of parameter) 

public ScalesSolution(String s) 
{ 
    boolean ok = true; 
    int n = s.length(); 
    for(int i=0;i<n;++i) 
    { 
     char si = s.charAt(i); 
     if (si != '0' && si != '1') ok = false; 
    } 
    if (ok) 
    { 
     scasol = s; 
    } 
    else 
    { 
     scasol = RandomBinaryString(n); 
    } 
} 

private static String RandomBinaryString(int n) 
{ 
    String s = new String(); 
    //Code goes here 
    //Create a random binary string of just ones and zeros of length n 
    for(int i = 0; i < n; i++){ 
     int x = CS2004.UI(0,1); 
      if(x == 0){ 
       System.out.print(s + '0'); 
      } 
      else if(x == 1){ 
       System.out.print(s + '1'); 
      } 
    } 
    return(s); 
} 

public ScalesSolution(int n) 
{ 
    scasol = RandomBinaryString(n); 
} 

//This is the fitness function for the Scales problem 
//This function returns -1 if the number of weights is less than 
//the size of the current solution 
//EXERCISE 3 
public static double ScalesFitness(ArrayList<Double> weights) 
{ 
    int n = scasol.length(); 
    double lhs = 0.0, rhs = 0.0; 
    if (n > weights.size()) return(-1); 

    for(int i = 0; i < n; i++){ 
     if(scasol.charAt(i) == 0){ 
      lhs += weights.get(i); 
     } 
     else{ 
      rhs += weights.get(i); 
     } 
    }  
    //Code goes here 
    //Check each element of scasol for a 0 (lhs) and 1 (rhs) add the weight wi 
    //to variables lhs and rhs as appropriate 
    return(Math.abs(lhs-rhs)); 
} 

//Display the string without a new line 
public void print() 
{ 
    System.out.print(scasol); 
} 
//Display the string with a new line 
public void println() 
{ 
    print(); 
    System.out.println(); 
}} 

主要方法(在​​单独的类):

import java.util.ArrayList; 
public class Lab8 { 

public static void main(String args[]) 
{ 
    for(int i = 0; i < 10; i++){ 
     ScalesSolution s = new ScalesSolution("10101x"); 
     s.println(); 
    } 


    ArrayList<Double> weights = new ArrayList<Double>(); 
    weights.add(1.0); 
    weights.add(2.0); 
    weights.add(3.0); 
    weights.add(4.0); 
    weights.add(10.0); 
    System.out.println(); 
    System.out.println(weights); 
    System.out.print("Fitness: "); 

    double fitness = ScalesSolution.ScalesFitness(weights); 
    System.out.println(fitness); 

}} 

CS2004类:

import java.util.*; 
import java.io.*; 

//Some useful code that we will probably reuse in later laboratories... 
public class CS2004 
{ 
//Shared random object 
static private Random rand; 
//Create a uniformly distributed random integer between aa and bb inclusive 
static public int UI(int aa,int bb) 
{ 
    int a = Math.min(aa,bb); 
    int b = Math.max(aa,bb); 
    if (rand == null) 
    { 
     rand = new Random(); 
     rand.setSeed(System.nanoTime()); 
    } 
    int d = b - a + 1; 
    int x = rand.nextInt(d) + a; 
    return(x); 
} 
//Create a uniformly distributed random double between a and b inclusive 
static public double UR(double a,double b) 
{ 
    if (rand == null) 
    { 
     rand = new Random(); 
     rand.setSeed(System.nanoTime()); 
    } 
    return((b-a)*rand.nextDouble()+a); 
} 
//This method reads in a text file and parses all of the numbers in it 
//This code is not very good and can be improved! 
//But it should work!!! 
//It takes in as input a string filename and returns an array list of Doubles 
static public ArrayList<Double> ReadNumberFile(String filename) 
{ 
    ArrayList<Double> res = new ArrayList<Double>(); 
    Reader r; 
    try 
    { 
     r = new BufferedReader(new FileReader(filename)); 
     StreamTokenizer stok = new StreamTokenizer(r); 
     stok.parseNumbers(); 
     stok.nextToken(); 
     while (stok.ttype != StreamTokenizer.TT_EOF) 
     { 
      if (stok.ttype == StreamTokenizer.TT_NUMBER) 
      { 
       res.add(stok.nval); 
      } 
      stok.nextToken(); 
     } 
    } 
    catch(Exception E) 
    { 
     System.out.println("+++ReadFile: "+E.getMessage()); 
    } 
    return(res); 
}} 

一旦运行,则随机二进制串工作得很好,但适应度函数无法从0改变。下面是一个示例输出:

011100 
111010 
001110 
111011 
001000 
010101 
001010 
100011 
110100 
011001 

[1.0, 2.0, 3.0, 4.0, 10.0] 
Fitness: 0.0 

非常感谢你的时间。 Stefanos。

+0

您确定您的意思是'scasol.charAt(i)== 0'而不是'scasol.charAt(i)=='0''? – Ivan

+0

是的,你是对的,但它仍然没有任何区别。我真的堆积了!谢谢!! – Stefanos

回答

1

scasol当调用ScalesFitness时显示为空。在RandomBinaryString方法中,您绝对不会构造s,而只是将其打印出来。而不是System.out.print(s+'0')和其他行,你应该有s += '0';。由于这似乎是一个练习,我将其余的给你,但下面是一个提示:没有一个函数的功能比它应该做的更多(例如打印出其结果)否则,它可能看起来像一组函数实际上正在工作,但实际上它并不是。

在这种情况下,它看起来像一切工作正常,因为它出现像s.println()功能究竟打印出scasol,但在现实中,scasol是空的,RandomBinaryString方法实际上是做印刷。

+0

非常感谢!我认为现在它工作!再次感谢! – Stefanos