static void DecodeTest(Person p1) { PP.Refresh(); for (int j = 0; j < DataStorage.N; j++) { DataStorage.cm[j].Refresh(); } for (int j = 0; j < DataStorage.N; j++) { switch (p1.Chromosome.Genes[j]) //декодирование гена и размещение по эвристикам { case 1: { int index = IndexOfMaxKM(p1); //Самый большой из неразмещенных элементов if (DataStorage.cm[index].Height > DataStorage.cm[index].Width) //горизонтально { Rotate(index); } FindPlace(index); //разместить элемент break; } case 2: { int index = IndexOfMaxKM(p1); if (DataStorage.cm[index].Height < DataStorage.cm[index].Width) { Rotate(index); } FindPlace(index); break; } case 3: { int index = IndexOfMinKM(p1); if (DataStorage.cm[index].Height > DataStorage.cm[index].Width) { Rotate(index); } FindPlace(index); break; } case 4: { int index = IndexOfMinKM(p1); if (DataStorage.cm[index].Height < DataStorage.cm[index].Width) { Rotate(index); } FindPlace(index); break; } } } FMin(); }
public static void Decode(Person p1) { int plateHeight = 0; PP.Refresh(); for (int j = 0; j < DataStorage.N; j++) { DataStorage.cm[j].Refresh(); } int index = -1; for (int j = 0; j < DataStorage.N; j++) { switch (p1.Chromosome.Genes[j]) //декодирование гена и размещение по эвристикам { case 1: { index = IndexOfMaxKM(p1); //Самый большой из неразмещенных элементов if (DataStorage.cm[index].Height > DataStorage.cm[index].Width) //горизонтально { Rotate(index); } FindPlace(index); //разместить элемент break; } case 2: { index = IndexOfMaxKM(p1); if (DataStorage.cm[index].Height < DataStorage.cm[index].Width) { Rotate(index); } FindPlace(index); break; } case 3: { index = IndexOfMinKM(p1); if (DataStorage.cm[index].Height > DataStorage.cm[index].Width) { Rotate(index); } FindPlace(index); break; } case 4: { index = IndexOfMinKM(p1); if (DataStorage.cm[index].Height < DataStorage.cm[index].Width) { Rotate(index); } FindPlace(index); break; } } if (DataStorage.cm[index].isVertical) { if (plateHeight < DataStorage.cm[index].y + DataStorage.cm[index].Height) { plateHeight = DataStorage.cm[index].y + DataStorage.cm[index].Height; } } else { if (plateHeight < DataStorage.cm[index].y + DataStorage.cm[index].Width) { plateHeight = DataStorage.cm[index].y + DataStorage.cm[index].Width; } } } PP.Height = plateHeight; p1.F = F(); SumFitness += 1 / p1.F; if (p1.F < DataStorage.Best) { DataStorage.Best = p1.F; DataStorage.BestPerson = p1; } }