0

私の関数の目標は、2 つの Vector 間の 1 ポイント クロスオーバー関数を使用して、最初の Vector の要素と 2 番目の Vector の要素を持つ新しいハイブリッド「Son」 Vector を取得することです。

public Vector crossover(int Sol1,int Sol2){  
  int size;
  Vector sol1 = new Vector();
  Vector sol2 = new Vector();
  sol1 = (Vector) allpop.get(Sol1);
  sol2 = (Vector) allpop.get(Sol2);
  int crosspoint = (int) sol1.size()/2 ;
  Vector son =  new Vector();
      son= (Vector) sol1.clone() ;
      if (sol1.size() < sol2.size())
            size = sol1.size();
      else size = sol2.size();

  for(int j=(crosspoint-1);j<size;j++)
    son.set(j,sol2.get(j));
         return son;
                                          }

うまく動作することもあれば、「java.lang.ArrayIndexOutOfBoundsException」エラーが発生することもあります..いくつかのアイデアはありますか?

4

3 に答える 3

0

たぶん試してみてくださいint crosspoint = (int)(sol1.size() / 2);

また:crosspoint - 1する必要があります>= 0

于 2013-09-17T09:43:16.703 に答える
0

デバッガーをアタッチし、失敗する値を確認します。が 1 以下のcrosspoint場合は 0 に等しいと賭けたいので、インデックスは -1 に等しくなり、明らかに例外がスローされます。sol1.size()j

于 2013-09-04T16:20:55.500 に答える
0

すでに修正されています:)そしてここで私はあなたと答えを共有します:)

    public Vector crossover(Vector sot1, Vector sot2) {
    Vector sol1;
    Vector sol2;
    sol1 = copi(sot1);
    sol2 = copi(sot2);
    sol1.removeAll(Collections.singleton(null));
    sol2.removeAll(Collections.singleton(null));
    // int crosspoint = (int) sol1.size()/2 ;
    Vector son = new Vector();
    boolean awal = true;
    int size;
    if (sol1.size() < sol2.size()) {
        size = sol1.size();
        son.setSize(sol1.size());
        Collections.copy(son, sol1);
    } else {
        size = sol2.size();
        son.setSize(sol2.size());
        Collections.copy(son, sol2);
        awal = false;
    }
    int crosspoint = (int) (Math.random() * ((size * 2) / 3)) + 1;
    System.out.println("cross point :" + crosspoint);
    int j = crosspoint;
    if (awal == true) {
        for (j = crosspoint; j < size; j++) {
            //son.removeElementAt(j);
            // son.add(j, sol2.get(j));
            son.set(j, (Capaciter_n_objet) sol2.get(j));
        }
    } else {
        for (j = crosspoint; j < size; j++) {
            // son.removeElementAt(j);
            //son.add(j, sol1.get(j));
            son.set(j, (Capaciter_n_objet) sol1.get(j));
        }
    }
    son.removeAll(Collections.singleton(null));
    correction(son);
    son.removeAll(Collections.singleton(null));
    /* for(int i=0;i<non_packed_objet.size();i++)
     * System.out.println("non packed object : "+non_packed_objet.get(i));*/
    return son;
}
于 2013-09-17T15:05:39.473 に答える