"比较方法违反了其总合同"当我改变计算方法时

时间:2014-04-17 09:45:53

标签: java artificial-intelligence genetic-algorithm

我无法理解这个错误背后的逻辑,所以我有一个比较方法:

public int compareTo(osobnik obj) {
    if (this.fitness == -1 && obj.fitness==-1)
        return 0;
    if (this.fitness == -1)
        return 1;
    if (obj.fitness == -1)
        return -1;
    if (this.fitness > obj.fitness)
        return 1;
    if (this.fitness < obj.fitness)
        return -1;

    return 0;
}

并且直到fittnes被计算为绝对值1 /(x ^ 5 + x ^ 4 + 3x ^ 2 + x-5)一切都很好(有捕获,如果分母的值是0,那么fittnes是-1)。但是,如果我将函数更改为1 /(x ^ 5 + x ^ 4-3x ^ 2 + x-5)(作为3x ^ 2旁边的符号更改),我得到&#34;比较方法违反了其一般合同& #34 ;.为什么?为什么它适用于一组数字并且它不适用于第二组?


[解决]
事实证明,比较功能是可以的。犯罪分子以1 / x转向NaN。

2 个答案:

答案 0 :(得分:0)

<0,100>的适应度函数范围包括您的特殊情况值-1。这可能不是你的直接问题,但肯定是 问题。如果您想支持“没有健身”的情况,请使用-Double.MAX_VALUEDouble.NEGATIVE_INFINITY。然后你不需要比较函数中的特殊情况。复杂的比较逻辑通常最终打破了反身性,对称性和传递性的基本属性之一,当这些属性被打破时,排序算法会突破你所看到的例外。

根据上述特殊情况,将compareTo简单地实现为

return Double.compare(this.fitness, obj.fitness);

(假设fitnessdouble)。

此外,您选择的健身功能是可疑的,因为它:

  1. 在最差的x = 1附近有一个奇点,左右极限相反;
  2. x > 2很快接近零,所以不是该范围的良好判别器。

答案 1 :(得分:0)

假设适应度的最小值为-1(因为它意味着没有值):

public int compareTo(osobnik obj) {
    if (this.fitness == -1 && obj.fitness==-1) //both are equals
        return 0;
    if (this.fitness == -1) // this is the lowest one, so it should return -1
        return 1;
    if (obj.fitness == -1) // obj has the lowest value, so it should return 1
        return -1;
    if (this.fitness > obj.fitness)
        return 1;
    if (this.fitness < obj.fitness)
        return -1;

    return 0;
}