public Gene( ShapeTemplate shapeTemplate, Point origin, ClockwiseRotation absoluteRotation ) { Template = shapeTemplate; Origin = origin; Rotation = absoluteRotation; }
public static Gene ConstructRandom(ShapeTemplate shapeTemplate, int stockLength) { var rotation = shapeTemplate.Rotations.ToList()[CmnRandom.Random.Next(shapeTemplate.Rotations.Count())]; var template = shapeTemplate.TemplateAt(rotation); int absXVal = CmnRandom.Random.Next(0 - template.MinX, stockLength - template.MaxX - 1); int absYVal = CmnRandom.Random.Next(0 - template.MinY, template.StockWidth - template.MaxY - 1); var absPoint = new Point(absXVal, absYVal); return(new Gene(shapeTemplate, absPoint, rotation)); }
public static Tuple <Stock, List <ShapeTemplate> > Parse(string problemFile) { var file = new StreamReader(problemFile); int width = Convert.ToInt32(file.ReadLine().Split()[0]); var shapes = new List <ShapeTemplate>(); string line; while ((line = file.ReadLine()) != null) { var shape = ShapeTemplate.ConstructFromProblemDef(line.Split(), width); shapes.Add(shape); } int length = shapes.Sum(s => s.MaxLength); var stock = new Stock(width, length); return(Tuple.Create(stock, shapes)); }
GetParentBreeder(Stock stock) { return((parent1, parent2) => { var childGenes = new List <Gene>(); var parent2TemplateToGenes = parent2.Genes .ToDictionary(g => g.Template, g => g); var genePairs = parent1.Genes.Select(g => Tuple.Create(g, parent2TemplateToGenes[g.Template])); if (CmnRandom.Random.NextDouble() < parent1.RateAdjacencyCrossover) { var refPoint = new Point(0, 0); var parent1Shifts = parent1.Genes.Select(g => { var shift = g.Origin - refPoint; refPoint = g.Origin; return Tuple.Create(g.Template, shift); }) .ToDictionary(gs => gs.Item1, gs => gs.Item2); refPoint = new Point(0, 0); var parent2Shifts = parent2.Genes.Select(g => { var shift = g.Origin - refPoint; refPoint = g.Origin; return Tuple.Create(g.Template, shift); }) .ToDictionary(gs => gs.Item1, gs => gs.Item2); var adjacencies = new Dictionary <ShapeTemplate, List <ShapeTemplate> >(); ShapeTemplate lastParent1 = null; ShapeTemplate lastParent2 = null; foreach (var genePair in parent1.Genes.Zip(parent2.Genes, (g1, g2) => Tuple.Create(g1.Template, g2.Template))) { if (!adjacencies.ContainsKey(genePair.Item1)) { adjacencies[genePair.Item1] = new List <ShapeTemplate>(); } if (!adjacencies.ContainsKey(genePair.Item2)) { adjacencies[genePair.Item2] = new List <ShapeTemplate>(); } if (lastParent1 != null) { adjacencies[genePair.Item1].Add(lastParent1); adjacencies[lastParent1].Add(genePair.Item1); } if (lastParent2 != null) { adjacencies[genePair.Item2].Add(lastParent2); adjacencies[lastParent2].Add(genePair.Item2); } lastParent1 = genePair.Item1; lastParent2 = genePair.Item2; } var templateOrder = new Dictionary <ShapeTemplate, int>(); int orderCounter = 0; ShapeTemplate currTemplate = parent1.Genes.ChooseSingle().Template; templateOrder[currTemplate] = orderCounter; while (templateOrder.Count() < parent1.Genes.Count()) { orderCounter += 1; var adjs = adjacencies[currTemplate] .Where(t => !templateOrder.ContainsKey(t)) .Mode().ToList(); if (adjs.Count() > 0) { currTemplate = adjs.ChooseSingle(); } else { currTemplate = parent1.Genes.Where(g => !templateOrder.ContainsKey(g.Template)).ToList().ChooseSingle().Template; } templateOrder[currTemplate] = orderCounter; } refPoint = new Point(0, 0); foreach (var genePair in genePairs.OrderBy(gp => templateOrder[gp.Item1.Template])) { var geneShift = (new List <Tuple <Gene, Point> > { Tuple.Create(genePair.Item1, parent1Shifts[genePair.Item1.Template]), Tuple.Create(genePair.Item2, parent2Shifts[genePair.Item2.Template]) }) .ChooseSingle(i => stock.Length - i.Item2.X); refPoint = refPoint + geneShift.Item2; childGenes.Add(new Gene(genePair.Item1.Template, refPoint, geneShift.Item1.Rotation)); } } else { foreach (var genePair in genePairs) { var gene = (new List <Gene> { genePair.Item1, genePair.Item2 }).ChooseSingle(g => stock.Length - g.Origin.X); childGenes.Add(new Gene(gene.Template, gene.Origin, gene.Rotation)); } } Func <bool, IEnumerable <SolutionGenome>, Func <SolutionGenome, double>, double> MutateValue = (mutate, ps, getValue) => { var value = getValue(ps.ToList().ChooseSingle()); if (!mutate) { return value; } var randValue = value + 0.05 * (CmnRandom.Random.NextDouble() - 0.5); return Math.Min(Math.Max(randValue, 0), 1); }; var child = new SolutionGenome( childGenes, parent1.AdaptiveCrossover, MutateValue(parent1.AdaptiveCrossover, new SolutionGenome[] { parent1, parent2 }, (parent) => parent.RateAdjacencyCrossover), parent1.AdaptiveMutation, MutateValue(parent1.AdaptiveMutation, new SolutionGenome[] { parent1, parent2 }, (parent) => parent.RateCreepRandom), MutateValue(parent1.AdaptiveMutation, new SolutionGenome[] { parent1, parent2 }, (parent) => parent.RateRotateRandom), MutateValue(parent1.AdaptiveMutation, new SolutionGenome[] { parent1, parent2 }, (parent) => parent.RateSlideRandom) ); child.Repair(stock); return child; }); }
public ShapeCut(Point origin, ShapeTemplate template, ClockwiseRotation rotation) { Origin = origin; Rotation = rotation; Template = template; }