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)); }
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()); }
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()); }