100 개의 다중 속성 개체 목록을 깊이 복제하려고합니다. 아래 코드를 사용하여 딥 복제를 수행하고 있습니다. 목록 작성 및 목록 복제는 루프에서 발생하므로 목록 주위에서 목록이 내용을 변경하지만 100 개의 개체가 고정되어 있습니다.C#의 딥 복제로 각 호출에서 실행 시간이 오래 걸림
문제는 루프를 돌 때마다 목록을 복제 할 때 마지막으로 실행 한 것보다 기하 급수적으로 길어지는 것으로 나타납니다.
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 분 등까지 다음 결국 처음 몇 초 notablely 이상 위의 루프 주위 때마다 소요입니다
모든 신체 이유에 어떤 아이디어가 이 일이 일어 났나요?
편집 나는 그것이 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;
}
'Gene' 개체는 어떻게 생겼을까요? 새끼는'runEpoch'에서 어떻게 생성됩니까? '유전자'는 부모'유전자'에 대한 참조를 보유합니까? 그렇다면 목록에는 100 개의 항목 만 있지만 총 그래프는 반복 될 때마다 커집니다 ... –
디버거가 있습니까? 아마도 단위 테스트를 작성합니까? –
당신은 프로파일 러 (+1) – sehe