3

染色体包含许多以不同方式产生的分数。compareTo 方法实际上测试方法的一致性并相应地返回结果。

返回 1:comp = -5..-1

返回 0:comp = 0(可能发生在不同的情况下,其中一种情况是所有分数都相等。

返回 -1:comp = 1..5

public int compareTo(Chromosome o) {
    if(o == null)
        return(1);
    int comp = 0;
    comp += Double.compare(getScore(1),o.getScore(1));
    comp += Double.compare(getScore(2),o.getScore(2));
    comp += Double.compare(getScore(3),o.getScore(3));
    comp += Double.compare(getScore(5),o.getScore(5));
    comp += Double.compare(getScore(7),o.getScore(7));
    if(comp == 0)
        return(0);
    if(comp > 0)
        return(1);
    else
        return(-1);
}

我的问题是,如何使这种情况遵守合同为比较器规定的规则。显然它没有,我不断得到:java.lang.IllegalArgumentException:比较方法违反了它的一般合同!

4

3 回答 3

2

如果您正在实现 Comparator 接口,那么您需要使用此方法(假设您的类与 Chromosome tpye 是通用的):

int compare(Chromosome o1, Chromosome o2)

但是,在您的情况下实现的更合适的接口似乎是 Comparable。http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

int compareTo(Chromosome o)

Comparable 通常用于为您的类的实例提供自然排序。Comparator 通常是一个与您要比较的类分开的类,可用于为您提供几种不同类型的排序。

无论您要实现什么,还需要键入该类:

class Chromosome implements Comparable<Chromosome> 

否则参数应该是对象,而不是染色体。

于 2013-05-29T09:00:23.443 回答
1

详细说明 RotN 爵士的回答:

compareTo方法应遵循两个属性:

  • 比较是对称的,即 if A=BthenB=A和 if A<BthenB>A
  • 比较是传递的,即 if A<Band B<CthenA<C和 if A=Band B=CthenA=C

第一个属性满足您的比较,但第二个不是。考虑投票理论中的以下示例:我们有 3 个人,他们为 3 个备选方案投票。排名最高的替代方案获胜。众所周知,这可能导致没有替代方案获胜的模棱两可的情况。


在您的情况下,分数是人,染色体是替代品。我只使用 3 而不是 5 分,因为这足以说明问题。我有 3 条染色体 , A,BC, 分数如下:

A: 1, 2, 3
B: 2, 3, 1
C: 3, 1, 2

不难看出A<B,B<C,所以你的比较是不及物的。 C<A


您可以通过按字典顺序对染色体进行排序来解决此问题:

public int compareTo(Chromosome o) {
    if(o == null)
        return(1);
    int[] indices = {1, 2, 3, 5, 7};
    for (int i : indices) {
        int c = Double.compare(getScore(i),o.getScore(i));
        if (c != 0)
            return c;
    }
    return 0;
}
于 2013-05-29T09:57:36.540 回答
0

您尝试实施的Wat似乎是一个染色体大于另一个,如果它具有比另一个更大的分数。不幸的是,这并没有提供明确的优先级。即你不能保证每个 o1 = o2 和 o2 = o3 o1 = o3 都是真的。这可能会导致排序中的无限循环,或者使用更高级的算法来解决您面临的异常。因此,您需要找到另一种提供稳定排序的算法。

方法是:

  1. 比较总分
  2. 定义分数优先级(仅在 score1 相等时比较 score2,依此类推)
于 2013-05-29T09:26:00.377 回答