/// <summary> /// Perform DE crossover. /// </summary> /// <param name="crossover">Crossover variant to be performed.</param> /// <param name="CR">Crossover probability.</param> /// <param name="n">Dimensionality for problem.</param> /// <param name="w">Differential weight (vector).</param> /// <param name="x">Current agent position.</param> /// <param name="y">Potentially new agent position.</param> /// <param name="g">Population's best known position.</param> /// <param name="agents">Entire population.</param> /// <param name="randomSet">Random-set used for drawing distinct agents.</param> public static void DoCrossover(Variant crossover, double CR, int n, double[] w, double[] x, ref double[] y, double[] g, double[][] agents, RandomOps.Set randomSet) { // Agents used in crossover. double[] a, b, c; switch (crossover) { case Variant.Best1Bin: { // The first agent used in crossover is g. a = g; // Pick random and distinct agent-indices. // Also distinct from agent x. int R1 = randomSet.Draw(); int R2 = randomSet.Draw(); b = agents[R1]; c = agents[R2]; } break; case Variant.Rand1Bin: default: { // Pick random and distinct agent-indices. // Also distinct from agent x. int R1 = randomSet.Draw(); int R2 = randomSet.Draw(); int R3 = randomSet.Draw(); // Refer to the randomly picked agents as a and b. a = agents[R1]; b = agents[R2]; c = agents[R3]; } break; } // Pick a random dimension. int R = Globals.Random.Index(n); // Compute potentially new position. for (int k = 0; k < n; k++) { if (k == R || Globals.Random.Bool(CR)) { y[k] = a[k] + w[k] * (b[k] - c[k]); } else { y[k] = x[k]; } } }
static void DoTest(RandomOps.Random Rand) { int i; Console.WriteLine("RNG name: {0}", Rand.Name); Console.WriteLine(); if (TestByte) { Console.WriteLine("Byte()"); int[] ByteCounts = new int[Byte.MaxValue + 1]; ZeroCounts(ByteCounts); for (i = 0; i < ByteIterations; i++) { ByteCounts[Rand.Byte()] += 1; } PrintCounts(ByteCounts); Console.WriteLine(); } Console.WriteLine("Bytes({0})", NumBytes); byte[] byteArr = Rand.Bytes(NumBytes); for (i = 0; i < NumBytes; i++) { Console.WriteLine(byteArr[i]); } Console.WriteLine(); Console.WriteLine("Uniform()"); for (i = 0; i < NumIterations; i++) { Console.WriteLine(Rand.Uniform()); } Console.WriteLine(); Console.WriteLine("Uniform(-3, -1)"); for (i = 0; i < NumIterations; i++) { Console.WriteLine(Rand.Uniform(-3, -1)); } Console.WriteLine(); Console.WriteLine("Uniform(-2, 2)"); for (i = 0; i < NumIterations; i++) { Console.WriteLine(Rand.Uniform(-2, 2)); } Console.WriteLine(); Console.WriteLine("Uniform(3, 5)"); for (i = 0; i < NumIterations; i++) { Console.WriteLine(Rand.Uniform(3, 5)); } Console.WriteLine(); Console.WriteLine("Gauss({0}, {1})", GaussMean, GaussDeviation); for (i = 0; i < NumIterations; i++) { Console.WriteLine(Rand.Gauss(GaussMean, GaussDeviation)); } Console.WriteLine(); double sum = 0; for (i = 0; i < MeanIterations; i++) { sum += Rand.Uniform(); } Console.WriteLine("Mean of {0} x Uniform(): {1:0.0000}", MeanIterations, sum / MeanIterations); Console.WriteLine(); sum = 0; for (i = 0; i < MeanIterations; i++) { sum += Rand.Gauss(0, 1); } Console.WriteLine("Mean of {0} x Gauss(0, 1): {1:0.0000}", MeanIterations, sum / MeanIterations); Console.WriteLine(); Console.WriteLine("Disk()"); PrintPoint(Rand.Disk()); Console.WriteLine(); Console.WriteLine("Circle()"); PrintPoint(Rand.Circle()); Console.WriteLine(); Console.WriteLine("Sphere3()"); PrintPoint(Rand.Sphere3()); Console.WriteLine(); Console.WriteLine("Sphere4()"); PrintPoint(Rand.Sphere4()); Console.WriteLine(); Console.WriteLine("Sphere({0}, {1})", SphereDim, SphereRadius); PrintPoint(Rand.Sphere(SphereDim, SphereRadius)); Console.WriteLine(); if (TestBool) { Console.WriteLine("Bool()"); int countTrue = 0; int countFalse = 0; for (i = 0; i < BoolIterations; i++) { if (Rand.Bool()) { countTrue++; } else { countFalse++; } } Console.WriteLine("True: {0}", countTrue); Console.WriteLine("False: {0}", countFalse); Console.WriteLine(); } Console.WriteLine("Index({0})", MaxIndex); ZeroCounts(IndexCounts); for (i = 0; i < IndexIterations; i++) { int idx = Rand.Index(MaxIndex); IndexCounts[idx] += 1; } PrintCounts(IndexCounts); Console.WriteLine(); Console.WriteLine("Index2({0}, ...)", MaxIndex); ZeroCounts(IndexCounts); for (i = 0; i < IndexIterations; i++) { int idx1, idx2; Rand.Index2(MaxIndex, out idx1, out idx2); Debug.Assert(idx1 != idx2); IndexCounts[idx1] += 1; IndexCounts[idx2] += 1; } PrintCounts(IndexCounts); Console.WriteLine(); RandomOps.Set RandSet = new RandomOps.Set(Rand, RandSetSize); Console.WriteLine("RandSet.Reset()"); RandSet.Reset(); Console.WriteLine(); Console.WriteLine("RandSet.Draw() with set of size {0} and {1} iterations", RandSetSize, SetIterations / 2); for (i = 0; i < SetIterations / 2; i++) { Console.WriteLine(RandSet.Draw()); } Console.WriteLine(); Console.WriteLine("RandSet.Reset()"); Console.WriteLine("RandSet.Draw() with set of size {0}", RandSetSize); RandSet.Reset(); for (i = 0; i < SetIterations; i++) { Console.WriteLine(RandSet.Draw()); } Console.WriteLine(); //RandSet.Draw(); // Assertion fails. Console.WriteLine("RandSet.ResetExclude({0})", RandSetExclude); Console.WriteLine("RandSet.Draw() with set of size {0}", RandSetSize); RandSet.ResetExclude(RandSetExclude); for (i = 0; i < SetIterations - 1; i++) { Console.WriteLine(RandSet.Draw()); } Console.WriteLine(); //RandSet.Draw(); // Assertion fails. ZeroCounts(SetCounts); Console.WriteLine("RandSet.Draw() with set of size {0}", RandSetSize); for (i = 0; i < SetIterations2; i++) { RandSet.Reset(); while (RandSet.Size > 0) { int idx = RandSet.Draw(); SetCounts[idx] += 1; } } PrintCounts(SetCounts); Console.WriteLine(); InitSetProbabilities(Rand); ZeroCounts(IndexDistributionCounts); Console.WriteLine("Rand.Index() with probability distribution"); for (i = 0; i < IndexDistributionIterations; i++) { int idx = Rand.Index(IndexProbabilities); IndexDistributionCounts[idx] += 1; } PrintDistributionCounts(); Console.WriteLine(); RandomOps.IndexDistribution IndexDistribution = new RandomOps.IndexDistribution(Rand, IndexProbabilities); ZeroCounts(IndexDistributionCounts); Console.WriteLine("IndexDistribution.DrawLinearSearch()"); for (i = 0; i < IndexDistributionIterations; i++) { int idx = IndexDistribution.DrawLinearSearch(); IndexDistributionCounts[idx] += 1; } PrintDistributionCounts(); Console.WriteLine(); ZeroCounts(IndexDistributionCounts); Console.WriteLine("IndexDistribution.DrawBinarySearch()"); for (i = 0; i < IndexDistributionIterations; i++) { int idx = IndexDistribution.DrawBinarySearch(); IndexDistributionCounts[idx] += 1; } PrintDistributionCounts(); Console.WriteLine(); }
static void Test(RandomOps.Random rand) { DateTime t1 = DateTime.Now; DoTest(rand); DateTime t2 = DateTime.Now; Console.WriteLine("Time usage: {0}", t2.Subtract(t1)); }
static void TestArraySeed(RandomOps.RanUInt32Array rand) { RandomOps.Ran2 ran2 = new RandomOps.Ran2(); RandomOps.RandomDotOrg randInternet = new RandomOps.RandomDotOrg(rand.SeedLength, ran2, rand.SeedLength); rand.Seed(randInternet); Test(rand); }
static void InitSetProbabilities(RandomOps.Random Rand) { int i; double sum = 0; // Initialize probabilities to random values. for (i = 0; i < IndexProbabilities.Length; i++) { double r = Rand.Uniform(); IndexProbabilities[i] = r; sum += r; } // Normalize so sum of probabilities is one. for (i = 0; i < IndexProbabilities.Length; i++) { IndexProbabilities[i] /= sum; } }