private void doMutate(Properties individual) { PropertyDescriptorCollection pdc = meta.Parameters; int count = pdc.Count(x => x.Range != null && x.Range != ""); int crossPoint = 1; if (count == 1) { crossPoint = 0; } else { crossPoint = new Random().Next(0, count); } int crossIndex = 0; for (int i = 0; i < pdc.Count; i++) { if (pdc[i].Range == null || pdc[i].Range == "") { continue; } if (crossIndex == crossPoint) { crossIndex = i; break; } crossIndex += 1; } double value = individual.Get <double>(pdc[crossIndex].Name); double min, max; pdc[crossIndex].GetRange <double>(out min, out max); if (min == max) { return; } double r = new Random().NextDouble() * (max - min) + min; while (value == r) { r = new Random().NextDouble() * (max - min) + min; } if (pdc[crossIndex].Type == typeof(int)) { individual[pdc[crossIndex].Name] = (int)r; } else { individual[pdc[crossIndex].Name] = r; } }
private void doCross(Properties individual1, Properties individual2) { PropertyDescriptorCollection pdc = meta.Parameters; int count = pdc.Count(x => x.Range != null && x.Range != ""); int crossPoint = 1; if (count == 1) { crossPoint = 0; } else { crossPoint = new Random().Next(0, count); } int crossIndex = 0; for (int i = 0; i < pdc.Count; i++) { if (pdc[i].Range == null || pdc[i].Range == "") { continue; } if (crossIndex == crossPoint) { crossIndex = i; break; } crossIndex += 1; } for (int i = crossIndex; i < pdc.Count; i++) { if (pdc[i].Range == null || pdc[i].Range == "") { continue; } String name = pdc[i].Name; Object temp = individual1[name]; individual1[name] = individual2[name]; individual2[name] = temp; } }