0

100 個のマルチプロパティ オブジェクトのリストをディープ クローンしようとしています。以下のコードを使用してディープ クローンを実行しています。リストの作成とリストの複製はループで発生するため、ループのたびにリストの内容が変更されますが、100 個のオブジェクトに固定されたままになります。

問題は、ループのたびに、リストのクローン作成に、最後に実行したときよりも指数関数的に長い時間がかかることです。

public static Main ()
{

List<Chromosome<Gene>> population = Population.randomHalfAndHalf(rand, data, 100, opset);

        for (int i = 0; i < numOfGenerations; i++)
        {
                   offSpring = epoch.runEpoch(rand, population, SelectionMethod.Tournament, opset);
                    clone = DeepClone<List<Chromosome<Gene>>>(population);
                    clone.AddRange(offSpring);
                    population = fixPopulation(rand, clone, SelectionMethod.Tournament, 100);
        }

//....REST OF CODE....

}


public static T DeepClone<T>(T obj)
    {
        object result = null;

        using (var ms = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(ms, obj);
            ms.Position = 0;

            result = (T)formatter.Deserialize(ms);
            ms.Close();
        }
        return (T)result;
    }

元の人口を上書きできるのに、なぜオブジェクトを複製する必要があるのか​​ 考えている人もいるかもしれません。これは有効なポイントであり、私が調査したものですが、これを行うと、最初に実行したときに約 8 回の反復でループが完全に実行され、その後アイドル状態になり何もしないので停止します。次回実行すると、ループのたびに9回の反復と停止、理想、何もしないなどになります。なぜこれが起こっているのかについて何か考えがある場合は、なぜそれが起こっているのか本当にわからないので、共有してください.

しかし、私の主な問題は、オブジェクトのクローンを作成する時間が、上記のループを最初に数秒、最終的には最大 5 分など、毎回著しく長くかかることです。

なぜこれが起こっているのかについて何か考えがある人はいますか?

編集90% を超える作業の大部分を実行している間にアプリケーションのプロファイルを作成しました。BinaryFormatter.Deserialize(memoryStream) によって行われています。ここでは、この問題の原因となるような過度に複雑なことを何も行っていない修正人口を示します。

private static List<Chromosome<Gene>> fixPopulation(Random rand, List<Chromosome<Gene>> oldPopulation, SelectionMethod selectionMethod, int populationSize)
    {
        if (selectionMethod == SelectionMethod.Tournament)
        {
            oldPopulation.Sort();
        }
        else
        {
            //NSGAII sorting method
        }

        oldPopulation.RemoveRange(populationSize, (oldPopulation.Count - populationSize));

        for (int i = 0, n = populationSize / 2; i < n; i++)
        {
            int c1 = rand.Next(populationSize);
            int c2 = rand.Next(populationSize);

            // swap two chromosomes
            Chromosome<Gene> temp = oldPopulation[c1];
            oldPopulation[c1] = oldPopulation[c2];
            oldPopulation[c2] = temp;
        }

        return oldPopulation;
    }
4

1 に答える 1

0

バイナリ シリアル化を使用して、オブジェクトの高速クローンを作成できます。

これを見てください:

public Entity Copy()
        {
            System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();

            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            bFormatter.Serialize(memoryStream, this);
            memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
            IEntityForm entity= (IEntityForm)bFormatter.Deserialize(memoryStream);
            return entity;
        }

本当に簡単で働きます!

于 2011-04-19T09:26:44.047 に答える