Ejemplo n.º 1
0
        public void SANgramsIC()
        {
            AlphabetVector keepTranspositionKey = new AlphabetVector(keyLength, false);
            AlphabetVector newTranspositionKey  = new AlphabetVector(keyLength, false);

            ADFGVX key = new ADFGVX("", keyLength);
            TranspositionTransformations transforms = new TranspositionTransformations(keyLength, true, true, true);

            for (int cycles = 1; cycles <= restarts; cycles++)
            {
                if (cycles % 10 == 0)
                {
                    analyzer.LogText += Environment.NewLine + "Task id: " + taskId + " starting with cycle: " + cycles;
                }
                key.randomTranspositionKey();
                double score = eval(key);

                double startTemp = 500.0;
                double endTemp   = 20.0;
                double delta     = 20.0;

                double temp = startTemp;
                for (int step = 0; temp >= endTemp; step++, temp -= delta)
                {
                    transforms.randomize();
                    int size = transforms.size();

                    for (int i = 0; i < size; i++)
                    {
                        keepTranspositionKey.copy(key.transpositionKey);
                        transforms.transform(keepTranspositionKey.TextInInt, newTranspositionKey.TextInInt, keyLength, i);
                        key.setTranspositionKey(newTranspositionKey);
                        double newScore = eval(key);
                        if (SimulatedAnnealing.accept(newScore, score, temp))
                        {
                            score = newScore;
                            if (score > threadingHelper.bestOverall)
                            {
                                printIfBest(key, cycles, step, score, temp, deviation);
                            }
                        }
                        else
                        {
                            key.setTranspositionKey(keepTranspositionKey);
                        }
                    }
                    // Update PresentationView
                    long alldecryptions = 0;
                    lock (threadingHelper.decryptionsLock)
                    {
                        foreach (long d in threadingHelper.decryptions)
                        {
                            alldecryptions += d;
                        }
                        threadingHelper.UpdateDisplayEnd(keyLength, alldecryptions, restarts * (long)(startTemp / delta) * size + restarts);
                    }
                }
            }

            //log.LogText("Task " + taskId + " Fertig", Logtype.Info);
        }