Exemple #1
0
        public static void Main()
        {
            const double epsilon      = 0.5;
            const int    minNeighbors = 2;
            var          points       = new List <Point>();

            points.AddRange(MakeGaussianCircle(1, 100));
            points.AddRange(MakeGaussianCircle(2, 100));
            points.AddRange(MakeGaussianCircle(3, 100));

            double EuclideanDistance(Point p1, Point p2)
            {
                var(x1, y1) = p1;
                var(x2, y2) = p2;
                return(Math.Sqrt(Math.Pow(x1 - x2, 2) + Math.Pow(y1 - y2, 2)));
            }

            var clustered = new Dbscan <Point, double>(EuclideanDistance, epsilon, minNeighbors);
            var clusters  = clustered.Cluster(points);

            foreach (var cluster in clusters)
            {
                Console.WriteLine($"Cluster no. {cluster.Key} has {cluster.Value.Count} points");
            }
        }
        private void Calculations()
        {
            List <Point>   leftPoints;
            List <Cluster> clusters;

            Dbscan dbscan = new Dbscan(double.Parse(minPointsTextBox.Text), double.Parse(epsilonTextBox.Text), Points);

            dbscan.Calculate(out leftPoints, out clusters);

            UpdateGraphData(clusters, leftPoints);

            MessageBox.Show(@"Done");
        }
        public void ClusterTest()
        {
            var vehicles = new List <Vehicle>
            {
                CreateVehicle(1, 1, 1),
                CreateVehicle(2, 2, 1),
                CreateVehicle(3, 1, 2),
                CreateVehicle(4, 15, 1),

                CreateVehicle(5, 100, 100),
                CreateVehicle(6, 101, 110),
                CreateVehicle(7, 105, 110),
                CreateVehicle(8, 101, 110),

                CreateVehicle(9, 401, 410),
                CreateVehicle(10, 401, 410),
                CreateVehicle(11, 401, 410),

                CreateVehicle(12, 501, 510),
                CreateVehicle(13, 501, 510),
            };
            var clusters = Dbscan.Cluster(vehicles, 15, 3);

            Assert.AreEqual(3, clusters.Count);

            var firstCluster = clusters.ElementAt(0).Select(v => v.Id).ToList();

            Assert.AreEqual(4, firstCluster.Count);
            Assert.True(firstCluster.Contains(1));
            Assert.True(firstCluster.Contains(2));
            Assert.True(firstCluster.Contains(3));
            Assert.True(firstCluster.Contains(4));

            var secondCluster = clusters.ElementAt(1).Select(v => v.Id).ToList();

            Assert.AreEqual(4, secondCluster.Count);
            Assert.True(secondCluster.Contains(5));
            Assert.True(secondCluster.Contains(6));
            Assert.True(secondCluster.Contains(7));
            Assert.True(secondCluster.Contains(8));

            var thirdCluster = clusters.ElementAt(2).Select(v => v.Id).ToList();

            Assert.AreEqual(3, thirdCluster.Count);
            Assert.True(thirdCluster.Contains(9));
            Assert.True(thirdCluster.Contains(10));
            Assert.True(thirdCluster.Contains(11));
        }
        public void BenchmarkTest(int unitsCount, double radius, int minimumClusterSize, int runsCount, double threshold)
        {
            var stopwatch = new Stopwatch();

            for (var i = 0; i < runsCount; i++)
            {
                var vehicles = GenerateVehicles(unitsCount);
                stopwatch.Start();
                var clusters = Dbscan.Cluster(vehicles, radius, minimumClusterSize);
                stopwatch.Stop();
                Console.WriteLine($"Clusters found: {clusters.Count}, current time spent: {stopwatch.Elapsed}");
            }
            var average = TimeSpan.FromMilliseconds((double)stopwatch.ElapsedMilliseconds / runsCount);

            Console.WriteLine($"Avarage: {average}");
            Assert.Less(average, TimeSpan.FromMilliseconds(threshold));
        }
Exemple #5
0
        private static void TryIntroduceNewFormations()
        {
            var newVehicleIds = VehicleRegistry
                                .GetNewCreatedVehicleIds()
                                .ToList();

            if (!newVehicleIds.Any())
            {
                return;
            }
            var newVehicles = VehicleRegistry.GetVehiclesByIds(newVehicleIds);
            var clusters    = Dbscan.Cluster(newVehicles, 80, 33);

            if (!clusters.Any())
            {
                return;
            }
            foreach (var cluster in clusters)
            {
                var ids = cluster.Select(v => v.Id).ToList();
                formations.Add(new NewVehiclesFormation(MagicConstants.NextFormationId++, ids, CommandManager, VehicleRegistry));
                VehicleRegistry.RemoveFromNewVehicles(ids);
            }
        }
        public override VehicleFormationResult PerformAction(World world, Player me, Game game)
        {
            var army = new VehiclesGroup(Id, VehicleIds, VehicleRegistry, CommandManager);

            if (!binded)
            {
                Bind(army);
                return(new VehicleFormationResult(this));
            }

            commands.RemoveAll(c => c.IsStarted() && c.IsFinished(world.TickIndex, VehicleRegistry));


            if (FormationHelper.IsNukeAlert(world.GetOpponentPlayer()) && world.TickIndex - nukePreventionTick > game.BaseTacticalNuclearStrikeCooldown / 2)
            {
                commands.Clear();
                CommandManager.ClearCommandsQueue(Id);
                this.PreventNuke(army, world, game, commands);
                nukePreventionTick = world.TickIndex;
                return(new VehicleFormationResult(this));
            }

            if (commands.Any())
            {
                return(new VehicleFormationResult(this));
            }

            var closestUncapturedFacility = VehicleRegistry.GetUncapturedFacilities(world, me, Id)
                                            .Where(f => f.Type == FacilityType.VehicleFactory)
                                            .OrderBy(f => army.Center.GetDistanceTo(f.ToPoint(game)))
                                            .FirstOrDefault();
            var myGroudForcesCenter = VehicleRegistry.GetVehiclesByIds(
                VehicleRegistry.GetVehicleIdsByFormationId(MagicConstants.GroundFormationGroupId))
                                      .ToList()
                                      .GetCenterPoint();
            var enemyVehicles = VehicleRegistry.EnemyVehicles(me);

            var enemies      = Dbscan.GetEnemiesClusters(enemyVehicles, DbscanRadius, DbscanMinimumClusterSize, world.TickIndex);
            var nearestEnemy = enemies.OrderBy(c => c.GetCenterPoint().GetDistanceTo(army.Center)).FirstOrDefault();

            if (nearestEnemy != null &&
                this.TryNuke(army, VehicleRegistry.GetVehiclesByIds(army.VehicleIds), nearestEnemy, me, game, world, commands))
            {
                return(new VehicleFormationResult(new ShrinkAirVehicleFormation(Id, VehicleIds, CommandManager, VehicleRegistry)));
            }

            if (nearestEnemy != null &&
                army.Center.GetDistanceTo(nearestEnemy.GetCenterPoint()) < game.TankVisionRange * 0.8 &&
                nearestEnemy.Count > 1.2 * VehicleIds.Count)
            {
                army
                .Select(Id)
                .MoveByVector(nearestEnemy.GetCenterPoint().To(army.Center), game.TankSpeed);
                commands.Add(CommandManager.PeekLastCommand(Id));
                return(new VehicleFormationResult(this));
            }
            var nextTarget = closestUncapturedFacility?.ToPoint(game) ?? myGroudForcesCenter;

            if (army.Center.GetDistanceTo(myGroudForcesCenter) < MagicConstants.NewVehiclesJoinRadius)
            {
                army
                .Select(Id)
                .Assign(MagicConstants.GroundFormationGroupId);
                return(new VehicleFormationResult());
            }
            var direction = army.Center.To(nextTarget);

            army
            .Select(Id)
            .MoveByVector(direction.Length() > 20
                                                ? direction.Mul(0.1)
                                                : direction,
                          game.TankSpeed);
#if DEBUG
            RewindClient.Instance.Line(army.Center.X, army.Center.Y, nextTarget.X, nextTarget.Y, Color.Fuchsia);
#endif
            commands.Add(CommandManager.PeekLastCommand(Id));
            return(new VehicleFormationResult(this));
        }
        private static IEnumerable <Vehicle> NextEnemyGroup(Point2D myArmyCenter, List <Vehicle> enemyVehicles, int tick)
        {
            var clusters = Dbscan.GetEnemiesClusters(enemyVehicles, DbscanRadius, DbscanMinimumClusterSize, tick);

            return(clusters.OrderBy(c => c.GetCenterPoint().GetDistanceTo(myArmyCenter)).FirstOrDefault());
        }
Exemple #8
0
        public string CreateGraph(Stud dataA, Stud dataB, bool kmeans, bool dbscan, bool linearregression,
                                  bool polynomialregression, bool pearsoncorrelation, bool spearmancorrelation, bool knearest, bool naivebayes)
        {
            var gradedStudents   = Students.StudentsGraded;
            var classifyungraded = knearest || naivebayes;

            if (classifyungraded)
            {
                var grades   = new Dictionary <int, double>();
                var clusters = new Dbscan(210, 3,
                                          Students.StudentsGraded.Select(x => x.ToGenericVector(Stud.Attempts, Stud.Class, Stud.FailRatio,
                                                                                                Stud.Fails, Stud.Succeeds, Stud.SuccessRatio, Stud.Grade)));

                foreach (var cluster in clusters.DataClusters)
                {
                    grades[cluster.Key] = cluster.Value.Sum(x => x[6]) / cluster.Value.Count();
                }
                Classification classification = new NaiveBayesClassification(clusters.DataClusters, 50000);
                if (knearest)
                {
                    classification = new KnearestClassification(clusters.DataClusters, 5);
                }


                foreach (var student in Students.StudentsUngraded)
                {
                    var cluster = classification.ClassifyPoint(student.ToGenericVector(Stud.Attempts, Stud.Class,
                                                                                       Stud.FailRatio, Stud.Fails, Stud.Succeeds, Stud.SuccessRatio, Stud.Grade));

                    student.Grade = (int)grades[cluster];
                    gradedStudents.Add(student);
                }
            }

            var list = new List <int>();
            var a    = list
                       .GroupBy(x => x)
                       .Select(x => x.OrderBy(y => y))
                       .Select(x => x.First());


            foreach (var student in gradedStudents)
            {
                student.Filter();
            }

            var data = new Dataset(gradedStudents.Select(x => x.ToGenericVector(dataA, dataB)));

            var highChart = new HighchartsAdapter(Highchart.Scatterplot);



            //Dbscan removes outliers, so we have to change are dataset afterwards
            if (dbscan)
            {
                var newData = new List <GenericVector>();
                var dBscan  = new Dbscan(50, 3, data);
                foreach (var cluster in dBscan.DataClusters)
                {
                    newData.AddRange(cluster.Value);
                }
                data = new Dataset(newData);
                highChart.AddClusters(dBscan);
            }

            if (kmeans)
            {
                highChart.AddClusters(new Kmeans(4, 100, data));
            }


            if (linearregression)
            {
                highChart.AddRegression(new LinearRegression(data.Select(x => x.ToVector2())));
            }

            if (polynomialregression)
            {
                highChart.AddRegression(new PolynomialRegression(data.Select(x => x.ToVector2()), 3));
            }

            if (pearsoncorrelation)
            {
                highChart.AddCorrelation(new PearsonCorrelation(data.Select(x => x.ToVector2())));
            }

            if (spearmancorrelation)
            {
                highChart.AddCorrelation(new SpearmanCorrelation(data.Select(x => x.ToVector2())));
            }


            highChart.SetDivId("plotkmeans");
            highChart.SetTitle($"{dataA} vs {dataB}");
            highChart.SetXlabel(dataA.ToString());
            highChart.SetYlabel(dataB.ToString());

            return(highChart.CreateTemplate());
        }