Beispiel #1
0
        public override int[] GetSolution()
        {
            var size = this.Data.Size;

            QapSolution solution = new QapSolution
            {
                Size     = Data.Distances.Length,
                Solution = this.GetList(this.GetRandomInitSolution())
            };

            FirstSolution = solution.Solution.ToArray();
            DeltaSolutionBenchmark benchmark = new DeltaSolutionBenchmark(Data, solution);
            QapSolutionBenchmark   solBen    = new QapSolutionBenchmark();
            var solutions     = new SortedList <int, Tuple <int, int> >(new DuplicateKeyComparer <int>());
            var currSolution  = solution.Solution.ToArray();
            var bestScore     = benchmark.ActualBestSolution.Score;
            var bestSolution  = new List <int>();
            int changeCounter = 0;

            Steps = 0;

            while (changeCounter < 20)
            {
                Steps++;
                changeCounter++;
                solutions.Clear();
                for (int i = 0; i < benchmark.ActualBestSolution.Size - 1; i++)
                {
                    for (int j = i + 1; j < benchmark.ActualBestSolution.Size; j++)
                    {
                        int neighborScore = benchmark.RateSolutionChange(i, j);
                        solutions.Add(neighborScore, Tuple.Create(i, j));
                        CheckedElems++;
                    }
                }

                bool changed = false;
                foreach (var entry in solutions)
                {
                    //if legal
                    var x             = entry.Value.Item1;
                    var y             = entry.Value.Item2;
                    var proposedScore = entry.Key;
                    if (Memory[x][y] == 0 || proposedScore < bestScore)
                    {
                        if (Memory[x][y] == 0 && proposedScore < bestScore)
                        {
                            changeCounter = 0;
                        }
                        Memory[x][y] = LengthOfMemory;
                        Memory[y][x] = LengthOfMemory;

                        benchmark.ChangeSolution(x, y);
                        //swap
                        int temp = currSolution[x];
                        currSolution[x] = currSolution[y];
                        currSolution[y] = temp;
                        changed         = true;
                        if (benchmark.ActualBestSolution.Score < bestScore)
                        {
                            bestSolution = benchmark.ActualBestSolution.Solution;
                            bestScore    = benchmark.ActualBestSolution.Score;
                        }

                        break;
                    }
                }
                if (!changed)
                {
                    //taki co najmniej psuje
                    var x = solutions.Values[0].Item1;
                    var y = solutions.Values[0].Item2;

                    Memory[x][y] = LengthOfMemory;
                    Memory[y][x] = LengthOfMemory;

                    benchmark.ChangeSolution(x, y);
                    //swap
                    int temp = currSolution[x];
                    currSolution[x] = currSolution[y];
                    currSolution[y] = temp;
                }
                TickMemoryDown();
            }
            return(bestSolution.ToArray());
        }
Beispiel #2
0
        public void RunTest(int reps = 5, string outputName = "output", IList <string> fileNames = null)
        {
            fileNames = fileNames ?? FileNames;
            var outputNameTime       = outputName + "_time.csv";
            var outputNameScore      = outputName + "_score.csv";
            var outputNameMin        = outputName + "_score_min.csv";
            var outputNameMax        = outputName + "_score_max.csv";
            var outputNameMedian     = outputName + "_score_median.csv";
            var outputNameStd        = outputName + "_score_std.csv";
            var outputNameSimilarity = outputName + "_score_similarity.csv";

            var outputNameSteps        = outputName + "_steps_gs.csv";
            var outputNameCheckedElems = outputName + "_checked_elems_gs.csv";

            var bench       = new QapSolutionBenchmark();
            var outputScore = new ulong [fileNames.Count, 6];
            var outputTime  = new double [fileNames.Count, 6];

            var outputMin        = new ulong[fileNames.Count, 6];
            var outputMax        = new ulong[fileNames.Count, 6];
            var outputMedian     = new ulong[fileNames.Count, 6];
            var outputStd        = new int[fileNames.Count, 6];
            var outputSimilarity = new double[fileNames.Count, 6];

            var outputSteps        = new int[fileNames.Count, 4];
            var outputCheckedElems = new int[fileNames.Count, 4];


            for (int i = 0; i < fileNames.Count; ++i)
            {
                for (int j = 0; j < 6; j++)
                {
                    outputMin[i, j] = UInt64.MaxValue;
                    outputMax[i, j] = 0;
                }
            }

            for (int i = 0; i < fileNames.Count; ++i)
            {
                string s             = fileNames[i];
                var    qapDataReader = new QapDataFileReader();
                var    data          = qapDataReader.ReadData(@"../AlgBattle/Data/BaseData/" + s + ".dat");
                var    solution      = qapDataReader.ReadSolution(@"../AlgBattle/Data/BaseData/" + s + ".sln");

                Stopwatch sw = new Stopwatch();

                ulong  mediumRate = 0;
                double mediumSim  = 0;

                for (int a = 0; a < 6; ++a)
                {
                    var algorithm = GetAlgorithm(a, data);
                    Console.WriteLine("File: " + s + "Alg num: " + a);
                    var tempList = new List <ulong>();
                    for (int j = 0; j < reps; j++)
                    {
                        sw.Start();
                        var sol = algorithm.GetSolution();
                        sw.Stop();
                        ulong rate = bench.RateSolution(sol, data);
                        var   sim  = bench.RateSimilarity(sol, solution.Solution.ToArray());
                        mediumRate += Convert.ToUInt64(rate);
                        mediumSim  += sim;
                        if (rate > outputMax[i, a])
                        {
                            outputMax[i, a] = rate;
                        }
                        if (rate < outputMin[i, a])
                        {
                            outputMin[i, a] = rate;
                        }
                        tempList.Add(rate);

                        if (a >= 2) //GS
                        {
                            outputCheckedElems[i, a - 2] += algorithm.CheckedElems;
                            outputSteps[i, a - 2]        += algorithm.Steps;
                        }
                    }
                    if (a >= 2)
                    {
                        outputCheckedElems[i, a - 2] = (int)(outputCheckedElems[i, a - 2] / reps);
                        outputSteps[i, a - 2]        = (int)(outputSteps[i, a - 2] / reps);
                    }
                    outputMedian[i, a] = this.GetMedian(tempList);
                    outputStd[i, a]    = Convert.ToInt32(tempList.Select(x => Convert.ToInt32(x)).ToList().StandardDeviation());
                    mediumRate        /= Convert.ToUInt64(reps);
                    mediumSim         /= reps;
                    var mediumTime = sw.Elapsed.TotalMilliseconds / reps;
                    sw.Reset();

                    //save
                    outputScore[i, a]      = mediumRate;
                    outputTime[i, a]       = mediumTime;
                    outputSimilarity[i, a] = mediumSim;
                }
            }

            using (StreamWriter file = File.AppendText(outputNameTime))
            {
                for (int i = 0; i < 6; ++i)
                {
                    for (int j = 0; j < fileNames.Count; ++j)
                    {
                        file.Write(outputTime[j, i] + ";");
                    }
                    file.Write("\n");
                }
            }

            using (StreamWriter file = File.AppendText(outputNameScore))
            {
                for (int i = 0; i < 6; ++i)
                {
                    for (int j = 0; j < fileNames.Count; ++j)
                    {
                        file.Write(outputScore[j, i] + ";");
                    }
                    file.Write("\n");
                }
            }

            using (StreamWriter file = File.AppendText(outputNameMin))
            {
                for (int i = 0; i < 6; ++i)
                {
                    for (int j = 0; j < fileNames.Count; ++j)
                    {
                        file.Write(outputMin[j, i] + ";");
                    }
                    file.Write("\n");
                }
            }

            using (StreamWriter file = File.AppendText(outputNameMax))
            {
                for (int i = 0; i < 6; ++i)
                {
                    for (int j = 0; j < fileNames.Count; ++j)
                    {
                        file.Write(outputMax[j, i] + ";");
                    }
                    file.Write("\n");
                }
            }

            using (StreamWriter file = File.AppendText(outputNameMedian))
            {
                for (int i = 0; i < 6; ++i)
                {
                    for (int j = 0; j < fileNames.Count; ++j)
                    {
                        file.Write(outputMedian[j, i] + ";");
                    }
                    file.Write("\n");
                }
            }

            using (StreamWriter file = File.AppendText(outputNameStd))
            {
                for (int i = 0; i < 6; ++i)
                {
                    for (int j = 0; j < fileNames.Count; ++j)
                    {
                        file.Write(outputStd[j, i] + ";");
                    }
                    file.Write("\n");
                }
            }

            using (StreamWriter file = File.AppendText(outputNameSimilarity))
            {
                for (int i = 0; i < 6; ++i)
                {
                    for (int j = 0; j < fileNames.Count; ++j)
                    {
                        file.Write(outputSimilarity[j, i] + ";");
                    }
                    file.Write("\n");
                }
            }


            using (StreamWriter file = File.AppendText(outputNameCheckedElems))
            {
                for (int i = 0; i < 4; ++i)
                {
                    for (int j = 0; j < fileNames.Count; ++j)
                    {
                        file.Write(outputCheckedElems[j, i] + ";");
                    }
                    file.Write("\n");
                }
            }

            using (StreamWriter file = File.AppendText(outputNameSteps))
            {
                for (int i = 0; i < 4; ++i)
                {
                    for (int j = 0; j < fileNames.Count; ++j)
                    {
                        file.Write(outputSteps[j, i] + ";");
                    }
                    file.Write("\n");
                }
            }
        }