2012-11-29 92 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