Пример #1
0
        public WavePropagator(
            PatternModel model,
            ITopology topology,
            WavePropagatorOptions options)
        {
            this.patternCount = model.PatternCount;
            this.frequencies  = model.Frequencies;

            this.indexCount        = topology.IndexCount;
            this.backtrack         = options.BacktrackPolicy != null;
            this.backtrackPolicy   = options.BacktrackPolicy;
            this.maxBacktrackDepth = options.MaxBacktrackDepth;
            this.constraints       = options.Constraints ?? new IWaveConstraint[0];
            this.topology          = topology;
            this.randomDouble      = options.RandomDouble ?? new Random().NextDouble;
            directionsCount        = topology.DirectionsCount;
            this.indexPicker       = options.IndexPicker ?? new EntropyTracker();
            this.patternPicker     = options.PatternPicker ?? new WeightedRandomPatternPicker();

            switch (options.ModelConstraintAlgorithm)
            {
            case ModelConstraintAlgorithm.OneStep:
                patternModelConstraint = new OneStepPatternModelConstraint(this, model);
                break;

            case ModelConstraintAlgorithm.Default:
            case ModelConstraintAlgorithm.Ac4:
                patternModelConstraint = new Ac4PatternModelConstraint(this, model);
                break;

            case ModelConstraintAlgorithm.Ac3:
                patternModelConstraint = new Ac3PatternModelConstraint(this, model);
                break;

            default:
                throw new Exception();
            }

            if (options.Clear)
            {
                Clear();
            }
        }
Пример #2
0
        internal void TestBacktracking(int size, ModelConstraintAlgorithm algorithm, IBacktrackPolicy backtrackPolicy)
        {
            // Reproduces the wang tiles found at
            // https://en.wikipedia.org/wiki/Wang_tile
            // They only have aperiodic tiling, so they are a hard set to put down.
            // Clockwise from top
            var tileBorders = new[]
            {
                "rrrg",
                "brbg",
                "rggg",
                "wbrb",
                "bbwb",
                "wwrw",
                "rgbw",
                "bwbr",
                "brwr",
                "ggbr",
                "rwrg",
            };
            var propagator = tileBorders.Select(tile1 =>

                                                tile1.Select((c, i) =>
            {
                var d = new[] { 3, 0, 2, 1 }[i];
                var o = (i + 2) % 4;
                return(Tuple.Create(d, tileBorders
                                    .Select((tile2, i2) => Tuple.Create(tile2, i2))
                                    .Where(t => t.Item1[o] == c)
                                    .Select(t => t.Item2)
                                    .ToArray()));
            })
                                                .OrderBy(x => x.Item1)
                                                .Select(x => x.Item2)
                                                .ToArray()
                                                ).ToArray();

            var model = new PatternModel
            {
                Frequencies = tileBorders.Select(x => 1.0).ToArray(),
                Propagator  = propagator,
            };
            var topology = new GridTopology(size, size, false);

            var seed = Environment.TickCount;
            var r    = new Random(seed);

            System.Console.WriteLine("Seed {0}", seed);

            var options = new WavePropagatorOptions
            {
                BacktrackPolicy          = backtrackPolicy,
                RandomDouble             = r.NextDouble,
                ModelConstraintAlgorithm = algorithm,
            };
            var wavePropagator = new WavePropagator(model, topology, options);

            var status = wavePropagator.Run();

            Assert.AreEqual(Resolution.Decided, status);

            System.Console.WriteLine($"Backtrack Count {wavePropagator.BacktrackCount}");
            System.Console.WriteLine($"Backjump Count {wavePropagator.BackjumpCount}");
        }