我无法理解这个错误背后的逻辑,所以我有一个比较方法:
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。
答案 0 :(得分:0)
域<0,100>
的适应度函数范围包括您的特殊情况值-1。这可能不是你的直接问题,但肯定是 问题。如果您想支持“没有健身”的情况,请使用-Double.MAX_VALUE
或Double.NEGATIVE_INFINITY
。然后你不需要比较函数中的特殊情况。复杂的比较逻辑通常最终打破了反身性,对称性和传递性的基本属性之一,当这些属性被打破时,排序算法会突破你所看到的例外。
根据上述特殊情况,将compareTo
简单地实现为
return Double.compare(this.fitness, obj.fitness);
(假设fitness
是double
)。
此外,您选择的健身功能是可疑的,因为它:
x = 1
附近有一个奇点,左右极限相反; 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;
}