2016-08-23 9 views
0

ある条件でリストから別のリストにアイテムをコピーしようとしています。 私は3つのリストを持っています。最初のリストには例えば10点のリストが含まれ、2番目のリストには各リストの合計距離(コストまたは適合度)が含まれます(10リスト - > 10合計距離)。ここある条件のリストからアイテムをコピーする

画像: 最初のリスト10本のリスト(各リストに点を含む)を含む - 空であり、一つの条件の項目で充填されるべき第二のリスト「トレーニング」 enter image description here第3のリストを。最初に、2番目のリストにすべての値を追加しました。上記番号付き 例:第3のリストに最初のリストのうちポイントのリストを追加する+ 5324 = 4847 + 5153 + 5577 totalFitness ...

条件は、例えば ------ ---->(フィットネス[0]/totalFitness)< =比率。

それが動作していない。しかし、ここであなたは、私が試したコードを参照することができます

class RunGA 
{ 
    public static List<List<Point3d>> createGenerations(List<List<Point3d>> firstGeneration, List<int> firstFitness, int generationSize) 
    { 
    List<List<Point3d>> currentGeneration = new List<List<Point3d>>(); 

    int totalFitness; 
    int actualFitness; 
    totalFitness = firstFitness[0] + firstFitness[1]; 
    double ratio = 1/10; 

    for(int k = 2; k < firstFitness.Count; k++) 
    { 
    actualFitness = firstFitness[k]; 
    totalFitness += actualFitness; 
    } 

    for(int i = 0; i < firstFitness.Count; i++) 
    { 
    double selected = firstFitness[i]/totalFitness; 
    if(selected < ratio) 
    { 
    currentGeneration.Add(firstGeneration[i]); 
    } 
    } 
    return currentGeneration; 
    } 
} 

3番目のリストは空のままです。条件をif(selected <= ratio) に変更すると、最初のリストのポイントのリスト全体が3番目のリストにコピーされます。しかし、私がコピーしたいのは、「最良の」フィットネスを持つポイントのリストです。

私は間違っているとは何ですか?私は全くの手がかりがなく、いくつかの変更を試みましたが、それでも動作していません。私が初心者だと考えることができれば嬉しいです。

+1

デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。さらに読む:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** –

+2

LINQ Union、Where、Sum、Aggregateの各メソッド確かにこれを達成するのに役立ちます。 – Aybe

答えて

0

この問題の別の解決方法が見つかりました。

私はまだ、これらのデータがあります。

のList1:

  1. ListOfPoints = = B
  2. ListOfPoints = C
  3. ListOfPoints = D

LIST2

  • ListOfPointsを:

    Bの
  • フィットネスのの
    1. フィットネス
    2. 私が達成したかった何C
    3. D

    のフィットネスのフィットネスました:、それらのListOfPointsを取る最高のフィットネスを持っていると置きますそれらをList3に変換します。残りのすべてのListOfPointsを別のList4に配置します。

    これは私が考えた解決策です。 List1をキ​​ーとして、List2を値として辞書に入れ、LINQで並べ替えます。 Sorted KeysをList3に転送します。 forループを使用すると、ソートされたListの前半をList4に、後半をList5に配置します。これは、同じ問題に直面している人を助け

    List<List<Point3d>> currentGeneration = handoverPopulation.ToList(); 
    List<double> currentFitness = handoverFitness.ToList(); 
    Dictionary<List<Point3d>, double> dict = new Dictionary<List<Point3d>, double>(); 
    foreach(List<Point3d> key in currentGeneration) 
    { 
        foreach(double valuee in currentFitness) 
        { 
        if(!dict.ContainsKey(key)) 
        { 
         if(!dict.ContainsValue(valuee)) 
         {dict.Add(key, valuee);} 
        } 
        } 
    } 
    var item = from pair in dict orderby pair.Value ascending select pair; 
    List<List<Point3d>> currentGenerationSorted = new List<List<Point3d>>(); 
    currentGenerationSorted = item.Select(kvp => kvp.Key).ToList(); 
    
    List<List<Point3d>> newGeneration = new List<List<Point3d>>(); 
    List<List<Point3d>> newGenerationExtra = new List<List<Point3d>>(); 
    
    int p = currentGenerationSorted.Count/2; 
    for(int i = 0; i < p; i++) 
    {newGeneration.Add(currentGenerationSorted[i]);} 
    
    for(int j = p; j < currentGenerationSorted.Count; j++) 
    {newGenerationExtra.Add(currentGenerationSorted[j]);} 
    

    希望:

    は、ここに私のコードです。

  • 関連する問題