Я пишу простой алгоритм hillclimber в C# и пытаюсь следующий подход:Как скопировать объект по значению, а не по ссылке в C#
Получить начальное решение
решения копирования на новый объект
Применить алгоритм для копирования
Сравнить значение obj исходного решения с значением obj копии
если лучше - скопируйте обратно в исходное решение.
Мне известно о том, что эта тема была затронута в предыдущем посте и попыталась реализовать предложение там - Использование класса IClonable. Это то, что я пробовал:
мое решение Класс:
class Solution : ICloneable
{
public Dictionary<Room, List<Patient>> solution { get; set; }
public Solution()
{
solution = new Dictionary<Room, List<Patient>>();
}
public object Clone()
{
return this.MemberwiseClone();
}
}
Алгоритм:
public static void swap (Solution solution, Output input, Random rand)
{
Solution intSoln = new Solution();
intSoln = (Solution)solution.Clone();
//Moving things around in intSoln here
Console.WriteLine("new solution = " + objValue(intSoln, input));
Console.WriteLine("old solution = " + objValue(solution, input));
if (objValue(intSoln, input) < objValue(solution, input))
{
solution = (Solution)intSoln.Clone();
}
}
Глядя на отпечатках для старых и новых решений, они всегда одинаковы, что означает, что код явно копируется по ссылке. Я совершенно застрял и не уверен, что делать. Любая помощь приветствуется.
Рассматривали ли вы использование [неизменяемых коллекций] (https://msdn.microsoft.com/en-us/library/dn385366.aspx) вместо клонирования? – CodesInChaos