2016-07-21 4 views
0

NSGA-IIアルゴリズムで非ソートソートサブルーチンを実装しています。以下のコードの最初の部分である:2-D arraylistがwhileループ外の0にリセットされる

public ArrayList<ArrayList<AttStrategy>> nondominatedSorting  
    (ArrayList<AttStrategy> StrategyPopulation, double max_rho_mal, double p_max) { 

    int i = 0, p, q; 
    int [] domination_count = new int[StrategyPopulation.size()]; 

    ArrayList<AttStrategy> dominated_strategies = new ArrayList<>(); 
    ArrayList<AttStrategy> dominating_strategies = new ArrayList<>(); 
    ArrayList<ArrayList<AttStrategy>> dominated_strategies_list = new ArrayList<>(); 
    ArrayList<ArrayList<AttStrategy>> pareto_strategies = new ArrayList<>(); 

    while(i < StrategyPopulation.size()) { 
     int j = 0; 
     domination_count[StrategyPopulation.get(i).getId()] = 0; 
     dominated_strategies.clear(); 
     for (j = i+1; j < StrategyPopulation.size(); j++){ 
      if (constraintDominated(StrategyPopulation.get(i), StrategyPopulation.get(j), max_rho_mal, p_max)) 
       dominated_strategies.add(StrategyPopulation.get(j)); 
      else if (constraintDominated(StrategyPopulation.get(j), StrategyPopulation.get(i), max_rho_mal, p_max)) 
       domination_count[StrategyPopulation.get(i).getId()] += 1; 
     } 
     if (domination_count[StrategyPopulation.get(i).getId()] == 0) { 
      dominating_strategies.add(StrategyPopulation.get(i)); 
     } 
     dominated_strategies_list.add(StrategyPopulation.get(i).getId(), dominated_strategies); 

     //values getting stored in the arraylist 
     System.out.println("Size of " + StrategyPopulation.get(i).getId() + ": " + dominated_strategies_list.get(i).size()); 
     i = i + 1; 
    } //while-loop ends 
    //values getting reset to 0. 
    System.out.println("********Outside the loop*********");  
    for(i = 0; i < dominated_strategies_list.size(); i++){ 
     System.out.println("Size of " + i + ": " + dominated_strategies_list.get(i).size()); 
    } 
    //............................................. 
} 

私が午前問題は、2-DのArrayListのでdominated_strategies_listです。このarraylistはwhileループ内に取り込まれていますが、ループ外で使用されるとすべての値は0にリセットされます。ただし、ループ内で更新されている他のarraylistsおよび配列はループ外に値を保持します。したがって、私はこのarraylist(dominated_strategies_list)をサブルーチンの後半部分で使用することはできません。私はどこでミスをしていますか?可能な解決策を提案する。

+1

非常に厄介な、あなたの選択およびすべてはあなたが助けたり、必要がないかどうかに依存...あなたのコードをフォーマットし、いくつかのコメント – Javant

+1

を追加...やコメントを無視してください。 –

答えて

0

dominated_strategies.clear(); 

を交換する代わりに、それは新しいのArrayListを作成してみてくださいのことです。

ここでは、間違いと解決方法を示すコードの簡単な例を示します。

public static void main(String[] args){   
    //Initialize stuff 
    ArrayList<Integer> dom_strat = new ArrayList<>(); 
    ArrayList<ArrayList<Integer>> dom_list = new ArrayList<>(); 
    dom_strat.add(5); 
    dom_strat.add(3); 

    //Add arrayList 
    dom_list.add(dom_strat); 

    //Print 
    System.out.println("Before clear"); 
    for(ArrayList<Integer> aList:dom_list){ 
     for(Integer i: aList){ 
      System.out.println(i); 
     } 
    } 
    //Clear referenced arrayList dom_list 
    dom_strat.clear(); 
    //Print 
    System.out.println("After clear"); 
    for(ArrayList<Integer> aList:dom_list){ 
     for(Integer i: aList){ 
      System.out.println(i); 
     } 
    } 


    //Initialize again and apply the fix 
    dom_strat = new ArrayList<>(); 
    dom_list = new ArrayList<>(); 
    dom_strat.add(5); 
    dom_strat.add(3); 

    //Add arrayList 
    dom_list.add(dom_strat); 

    //Instead of clear, create a new arrayList 
    dom_strat = new ArrayList<>(); 

    //Print 
    System.out.println("After applying the fix"); 
    for(ArrayList<Integer> aList:dom_list){ 
     for(Integer i: aList){ 
      System.out.println(i); 
     } 
    } 
} 
+0

ありがとう!!私はエラーを見つけ出し、それに取り組んだ。 –

0

あなたの問題は、繰り返し記入しクリアするリストが1つしかないことです。ループを通る次のラウンドのよう

ライン

dominated_strategies_list.add(StrategyPopulation.get(i).getId(), dominated_strategies); 

だけdominated_strategies_listに、この単一のリストへの参照を追加し、それはあなたがあなたの前の結果捨てdominated_strategies.clear();で、dominated_strategiesリストをコピーしません。

ソリューションは、あなたが参照のArrayListをクリアしているすべての反復では

dominated_strategies = new ArrayList<>(); 
+0

ありがとうございます!私は間違いを理解した。 –

関連する問題