В этом случае массив bool не будет автоматически копироваться глубоко.Таким образом, вы не пользуетесь структурами, потому что когда вы назначаете хромосому новой, в обоих случаях ссылка будет на один и тот же bool []
Вместо использования bool [] вы можете простоиспользуйте число: скажем, int
.Хромосома с генами = 3 представляет ген: 0000 0000 0000 0000 0000 0011. Хромосома с генами = 42134 представляет ген: 0000 0000 1010 0100 1001 0110. int - 32 бита, что означает, что вы можете представлять хромосомы с 2 32 генов таким образом.Вам не нужно беспокоиться о глубоком копировании массива, и это также быстрее и эффективнее с точки зрения потребления памяти.Используйте Int64, если вам нужно больше генов.
Обновление: Ваш вопрос такой крутой, кстати.Если у вас есть ограничения на возможные комбинации генов в некоторых сегментах, вам нужно построить байты Int32 в соответствии с ограничениями.Чтобы проиллюстрировать это, я взял пример для некоторых ограничений на хромосому и случайно мутировал хромосому, но относительно ограничений.
//The following creates a random chromosome with restrictions
//to the genes as described in the following:
//Let's say that the following pattern must be adhered to:
//byte 1 = xxxx xxxx (anything)
//byte 2 = 1011 xxxx (restricted)
//byte 3 = [0000 or 1111] xxxx (restricted)
//byte 4 = 0000 1111 (fixed value)
Random rnd = new Random();
byte[] randomByte = new byte[1]; //xxxx xxxx xxxx xxxx
byte restrictedByte2 =
(byte)(Math.Pow(2,7) * 1 + Math.Pow(2,6) * 0 +
Math.Pow(2,5) * 1 + Math.Pow(2,4) * 1 +
rnd.Next(0, 16)); //1011 xxxx
//in byte 3, the first (most significant) for bits are restricted to either 0000 or 1111.
//That's either number 0 * 16 = 0 or number 15 * 16 = 240. I multiplied by 2^4 because it's shifted
//4 bytes to the left.
byte higherBits = (byte)(rnd.Next(0, 2/*upper bound exclusive*/) == 1?240:0);
//random lower bits (xxxx).
byte lowerBits = (byte)(Math.Pow(2,0) * rnd.Next(0, 2) + Math.Pow(2,1) * rnd.Next(0, 2) +
Math.Pow(2,2) * rnd.Next(0, 2) + Math.Pow(2,3) * rnd.Next(0, 2) +
rnd.Next(0, 16));
byte restrictedByte3 = (byte)(lowerBits + higherBits);
byte restrictedByte4 = 143; //constant
//Create an Int32 from the four bytes.
int randomMutation = BitConverter.ToInt32(
new byte[] { randomByte[1], restrictedByte2, restrictedByte3, restrictedByte4 }, 0);