2

このコードは、2つの適合度を比較し、最良のものを使用して解を見つけ、次の反復で最良のものを使用する必要があります。しかし、私が得る問題は、それが大きいか小さいかに関係なく、最新のフィットネスを使用しているだけであるということです。私のコードに間違いがある場合、誰かが私を見つけるのを手伝ってくれますか、ありがとう!

これを説明するのは少し難しいので、誰かがさらに説明が必要な場合は、質問してください。プロジェクト全体を投稿しますが、エラーはこの小さなコードセクションに関係していると思います。

public static ScalesSolution RMHC(ArrayList<Double> weights, int n, int iter) {
    ScalesSolution sol = new ScalesSolution(n);
    ScalesSolution oldSol = new ScalesSolution(sol.GetSol());
    for (int i = 0; i < iter; i++) {
        System.out.println("Iteration number: " + i);
        System.out.println("Old Solution : ");
        oldSol.println();
        double f = oldSol.ScalesFitness(weights);
        System.out.println("Old Fitness: ");
        System.out.println(f);
        // the new solution after copying the string from scalesolution
        sol.SmallChange();
        System.out.println("New Solution : ");
        sol.println();
        double f1 = sol.ScalesFitness(weights);
        System.out.println("New Fitness: ");
        System.out.println(f1);
        if (oldSol.ScalesFitness(weights) > sol.ScalesFitness(weights)) {               
            oldSol = new ScalesSolution(sol.GetSol());
        }
    }
    return (oldSol);
}

SmallChangeは次のとおりです。

public void SmallChange() {
    int n = scasol.length();
    Random rand = new Random();
    int p = (rand.nextInt(n));
    String x;

    x = scasol.substring(0, p);
    if (scasol.charAt(p) == '0') {
        x += '1';
    } else {
        x += '0';
    }
    x += scasol.substring(p + 1, n);
    scasol = x;
}

ScalesFitnessとScalesSolutionは次のとおりです。

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();                // Assigns the length of scasol to n
    double lhs = 0.0;                       //  Initialises lhs to 0.0, type double
    double rhs = 0.0;                       //  Initialises rhs to 0.0, type double
    if (n > weights.size())                 // If statement, compares n and weight size
        return (-1);                        // Returns -1 when the if statement is true

    // Code goes here
    for (int i = 0; i < n; i++) {           // For loop which goes from i=0 to n
        if (scasol.charAt(i) == '0') {      // If statement which checks if the character at position i is equal to a 0
            lhs += weights.get(i);          // Adds weight at position i to lhs
        } else {                            // If the character in position i is not a 0 do the following
            rhs += weights.get(i);          // Adds the weight at position i to rhs
        }
    }
    return (Math.abs(lhs - rhs));           // Calculates the absolute value of lhs-rhs and returns the value
}
4

0 に答える 0