private void timer1_Tick(object sender, EventArgs e) { if (MoveNo < Moves.Count) { var move = Moves[MoveNo]; if (FrameNo < FrameCount) { if (FrameNo == 0) { RubikCube.Select(move); RubikCube.Group(); } double angle = (move.Angle + 1) * 90; if (angle > 180) { angle -= 360; } var ratio = (double)FrameNo / (FrameCount - 1); angle *= ratio; RubikCube.Wall.LoadIdentity(); if (move.Axis == 0) { RubikCube.Wall.RotateX(angle); } else if (move.Axis == 1) { RubikCube.Wall.RotateY(angle); } else { RubikCube.Wall.RotateZ(angle); } FrameNo++; tglView1.Invalidate(); } else { FrameNo = 0; MoveNo++; RubikCube.Ungroup(); RubikCube.MakeMove(move); } } else { MoveTimer.Stop(); Moves.Clear(); MoveNo = 0; if (HighScore > 0) { Solve(); } } }
public double OnEvaluate(TChromosome specimen) { var cube = new RubikCube(RubikCube); var bestFitness = double.MaxValue; for (int len = 0; len < specimen.Genes.Length; len++) { var move = new TMove(); move.Decode((int)specimen.Genes[len]); cube.MakeMove(move); var fitness = cube.Evaluate(); if (fitness < bestFitness) { bestFitness = fitness; (specimen as RubikGenome).MovesCount = len + 1; } } specimen.Fitness = bestFitness; return(bestFitness); }
void Solve() { var best = new RubikGenome(); best.Fitness = HighScore; foreach (var solution in Solutions) { var genome = new RubikGenome(); var cube = new RubikCube(RubikCube); for (int i = 0; i < solution.Value.Count; i++) { var move = solution.Value[i]; cube.MakeMove(move); genome.Genes[i] = move.Encode(); } genome.Fitness = cube.Evaluate(); if (genome.Fitness < best.Fitness) { best = genome; } } if (best.Fitness >= HighScore) { TChromosome.GenesLength = 30; TChromosome.MinGenes = new double[TChromosome.GenesLength]; TChromosome.MaxGenes = new double[TChromosome.GenesLength]; for (int i = 0; i < TChromosome.MaxGenes.Length; i++) { TChromosome.MaxGenes[i] = 9 * RubikCube.N; } TGA <RubikGenome> .GenerationsCount = 50; TGA <RubikGenome> .MutationRatio = 0.2; TGA <RubikGenome> .WinnerRatio = 0.1; var ga = new TGA <RubikGenome>(); ga.Evaluate = OnEvaluate; ga.Progress = OnProgress; ga.Execute(); best = ga.Best; if (best.Fitness == 0) { SaveSolution(best); } } if (best.Fitness < HighScore) { Moves.Clear(); for (int i = 0; i < best.MovesCount; i++) { var move = new TMove(); move.Decode((int)best.Genes[i]); Moves.Add(move); } HighScore = best.Fitness; } MoveTimer.Start(); }