コード例 #1
0
    /* Assignment problem - HUNGARIAN ALGORITHM */
    public void assignClustersToDrones(Cluster[] clusters)
    {
        /* compute matrix dimensions with dummy rows and columns */
        int N = UAVs.Length;

        int[,] costs = new int[N, N];        //{{20,22,14,24},{20,19,12,20},{13,10,18,16},{22,23,9,28}};

        /*compute matrix costs*/
        for (int m = 0; m < N; m++)
        {
            for (int n = 0; n < N; n++)
            {
                if (m < UAVs.Length && n < clusters.Length)
                {
                    costs[m, n] = (int)Mathf.Floor(Vector3.Magnitude(UAVs[m].transform.position - (clusters[n]).Centroid));
                }
                else
                {
                    costs[m, n] = int.MaxValue;
                }
            }
        }

        /*Munkres - Hungarian Algorithm*/
        int [] res = HungarianAlgorithm.FindAssignments(costs);

        /*Assign clusters to UAVs*/
        for (int i = 0; i < UAVs.Length; i++)
        {
            if (res[i] < clusters.Length)
            {
                UAVs[i].assignCluster(clusters[res[i]]);
            }
        }
    }
コード例 #2
0
        public void SecondIdIsFive()
        {
            var matrix = preferenceCalculationClass.CreateEntryMatrix(slots, players, entries);
            var test   = HungarianAlgorithm.FindAssignments(matrix);

            Assert.Equal(5, test[1]);
        }
コード例 #3
0
        static string[] products;  //= { "aaaaaaaaaaaaaaaaa","PlayStationsdfsdf", "Xboxreiyujfcfh", "Iphonegdsgsdtetr", "Pravecgdupoijh" , "Carsfdsdbaaaaaaaaaaaaaafds", "Captivafsdfoiteraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggndsfkgvdsfk" };

        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                ReadFile(args[0]);
            }
            else
            {
                Console.WriteLine("No input file!"); return;
            }

            //1. Generate assignment matrix
            double[,] AssignmentMatrix = new double[customers.Length, products.Length];

            //rows are customers
            //columns are products
            double maxSS = 0;

            for (int i = 0; i < customers.Length; i++)
            {
                for (int j = 0; j < products.Length; j++)
                {
                    double SS = CalculateSS(products[j], customers[i]);
                    if (SS > maxSS)
                    {
                        maxSS = SS;
                    }
                    AssignmentMatrix[i, j] = SS;
                }
            }

            //2. Invert because we are searching for max not min
            for (int i = 0; i < AssignmentMatrix.GetLength(0); i++)
            {
                for (int j = 0; j < AssignmentMatrix.GetLength(1); j++)
                {
                    AssignmentMatrix[i, j] = maxSS - AssignmentMatrix[i, j];
                }
            }

            //3. Apply Hungarian algorithm
            int[] result = HungarianAlgorithm.FindAssignments(AssignmentMatrix);

            //4. Save result
            double TotalSS = 0;

            for (int i = 0; i < result.Length; i++)
            {
                //Console.WriteLine("Customer=" + customers[i] + ",product=" + products[result[i]]);
                TotalSS += AssignmentMatrix[i, result[i]] + maxSS;
            }
            //Console.WriteLine("TotalSS="+TotalSS);
            //Console.ReadKey();
            WriteFile("output.txt", result, TotalSS);
        }
コード例 #4
0
    void mapDataPointsToBars()
    {
        var costMatrix = buildCostMatrix(_dataPoints);

        _barsAssignments = HungarianAlgorithm.FindAssignments(costMatrix);

        for (int i = 0; i < _dataPoints.Count; i++)
        {
            var point      = _dataPoints[i];
            var bar        = bars[_barsAssignments[i] * 2];
            var traperzoid = bar.GetComponent <TrapezoidBarBehavior>();
            traperzoid.mapDataPoint = point;
            traperzoid._level       = 1 / _maxDataPointValue * point.Value;
            traperzoid.ReCalculateScale();

            drawProjectionLine(point, bar);
        }
    }
コード例 #5
0
        public void Reshape(Mesh mesh)
        {
            float[,] costs = new float[vertexCount(), mesh.vertexCount()];
            for (int i = 0; i < vertexCount(); i++)
            {
                for (int j = 0; j < mesh.vertexCount(); j++)
                {
                    costs[i, j] = (float)Vector.Distance(vertices[i].v, mesh.vertices[j].v);
                }
            }

            int[] mapping = HungarianAlgorithm.FindAssignments(costs);

            for (int i = 0; i < mapping.Length; i++)
            {
                vertices[i].v = mesh.vertices[mapping[i]].v;
            }

            //Console.WriteLine(mapping.Length);
        }
コード例 #6
0
        public void Track(List <Detection> detections, Esp esp, double dt)
        {
            // Purge dropped objects that have exceeded the time limit.
            for (int i = droppedObjects.Count - 1; i >= 0; --i)
            {
                var dropped = droppedObjects[i];
                if (dropped.Time + dt > MaximumInactiveTime)
                {
                    droppedObjects.RemoveFast(i);
                }
                else
                {
                    droppedObjects[i] = new TrackedObject(dropped.Detection, dropped.Id, dropped.Time + dt);
                }
            }

            // Build the cost matrix.
            var rows       = trackedObjects.Count + droppedObjects.Count;
            var cols       = detections.Count;
            var dimensions = Math.Max(rows, cols);
            var costs      = new double[dimensions, dimensions];

            // Populate the cost matrix.
            // Detections are the rows of the matrix.
            // Tracked and droped objects are the columns.
            // Entries are the costs for matching each.
            // Note that if the number of detections is not equal to the number of tracked/dropped
            // objects then we will have a bunch of (dummy) zero entries. These correspond to
            // creating new tracked objects or dropping more tracked objects.
            for (int r = 0; r < detections.Count; ++r)
            {
                var detection = detections[r];

                for (int c = 0; c < trackedObjects.Count; ++c)
                {
                    costs[r, c] = GIOU(detection.BoundingBox, trackedObjects[c].Detection.BoundingBox);
                }

                for (int c = 0; c < droppedObjects.Count; ++c)
                {
                    costs[r, trackedObjects.Count + c] = GIOU(detection.BoundingBox, droppedObjects[c].Detection.BoundingBox);
                }
            }

            // Find matches using the Hungarian Algorithm.
            var assignments = HungarianAlgorithm.FindAssignments(costs);

            // Update or create the tracked/dropped objects.
            var persistedCount    = trackedObjects.Count;
            var maximumDistanceSq = MaximumTrackingDistance * MaximumTrackingDistance;

            for (int r = 0; r < detections.Count; ++r)
            {
                var detection       = detections[r];
                var detectionCenter = detection.BoundingBox.Center();
                var c = assignments[r];
                if (c < trackedObjects.Count)
                {
                    // We have a match with a tracked object.
                    // Check that the distance doesn't exceed the maximum allowed.
                    var tracked    = trackedObjects[c];
                    var distanceSq = detectionCenter.DistanceSq(tracked.Detection.BoundingBox.Center());
                    if (distanceSq <= maximumDistanceSq)
                    {
                        // Okay, we can update the tracked object.
                        trackedObjects[c] = new TrackedObject(detection, trackedObjects[c].Id, trackedObjects[c].Time + dt);
                    }
                    else
                    {
                        // Distance limit exceeded.
                        // We need to create a new tracking object and drop the old one.
                        trackedObjects.RemoveFast(c);
                        trackedObjects.Add(new TrackedObject(detection, nextId++, 0.0));
                        droppedObjects.Add(new TrackedObject(tracked.Detection, tracked.Id, 0.0));
                        persistedCount -= 1;
                    }
                }
                else if (c < rows)
                {
                    // We have a match with a dropped object.
                    // Check the distance doesn't exceed the maximum allowed.
                    var idx        = rows - trackedObjects.Count - 1;
                    var dropped    = droppedObjects[idx];
                    var distanceSq = detectionCenter.DistanceSq(dropped.Detection.BoundingBox.Center());
                    if (distanceSq <= maximumDistanceSq)
                    {
                        // Okay, we can bring back the dropped object.
                        trackedObjects.Add(new TrackedObject(detection, dropped.Id, 0.0));
                        droppedObjects.RemoveFast(idx);
                    }
                    else
                    {
                        // Distance limit exceeded.
                        // We need to add a new tracking object.
                        trackedObjects.Add(new TrackedObject(detection, nextId++, 0.0));
                    }
                }
                else
                {
                    // Completely new object.
                    trackedObjects.Add(new TrackedObject(detection, nextId++, 0.0));
                }
            }

            // Collect the list of tracked object IDs to be removed from the tracked object list and
            // drop the trapped objects.
            dropIds.Clear();
            for (int r = detections.Count; r < assignments.Length; ++r)
            {
                var c = assignments[r];
                if (c < persistedCount) // We could have added/removed tracked objects above.
                {
                    var tracked = trackedObjects[c];
                    dropIds.Add(tracked.Id);
                    droppedObjects.Add(new TrackedObject(tracked.Detection, tracked.Id, 0.0));
                }
            }

            // Now remove the dropped tracked objects.
            foreach (var id in dropIds)
            {
                for (int i = 0; i < persistedCount; ++i)
                {
                    if (trackedObjects[i].Id == id)
                    {
                        trackedObjects.RemoveFast(i);
                        persistedCount -= 1;
                        break;
                    }
                }
            }

            // Render tracked objects.
            if (esp != null)
            {
                foreach (var tracked in trackedObjects)
                {
                    esp.Add(new TextShape(tracked.Detection.BoundingBox.TopLeft(), tracked.Id.ToString(), Color.Red, 12));
                }
            }
        }
コード例 #7
0
        public IActionResult Asignacion([Bind("CheckedDependientes, CheckedTurnos, FechaInicio, FechaFinal")] SeleccionarAsignacionVM seleccionarAsignacionVM)
        {
            var Dependientes = _context.Dependientes.Where(d => seleccionarAsignacionVM.CheckedDependientes.Any(c => c.DependienteId == d.Id && c.Checked == true)).OrderBy(d => d.Id).ToList();

            var Bares = _context.Bares.Where(b => seleccionarAsignacionVM.CheckedTurnos.Any(c => c.BarId == b.Id && c.Checked == true)).OrderBy(b => b.Id).ToList();

            var ventasDependientesPorBar = BuscarVentas(seleccionarAsignacionVM.CheckedDependientes.Where(d => d.Checked).Select(d => d.DependienteId).ToList(), seleccionarAsignacionVM.CheckedTurnos.Where(d => d.Checked).Select(d => d.BarId).ToList(), seleccionarAsignacionVM.FechaInicio, seleccionarAsignacionVM.FechaFinal);

            if (ventasDependientesPorBar.Any())
            {
                //Convertinedo en un array de 2 dimensiones
                double[,] Tabla = new double[Dependientes.Count, Bares.Count];

                for (int f = 0; f < Dependientes.Count; f++)
                {
                    var dependienteId = Dependientes[f].Id;
                    var ventas        = ventasDependientesPorBar
                                        .Any(v => v.DependienteId == dependienteId) ?
                                        ventasDependientesPorBar.SingleOrDefault(v => v.DependienteId == dependienteId).VentasPorBares : new List <VentasPorBar>();
                    for (int c = 0; c < Bares.Count; c++)
                    {
                        var barId = Bares[c].Id;
                        Tabla[f, c] = ventas.Any(v => v.BarId == barId) ? ventas.SingleOrDefault(v => v.BarId == barId).PromedioVentasPorTurno : 0;
                    }
                }
                //Balancenado el Problema
                if (Tabla.GetLength(0) > Tabla.GetLength(1))
                {
                    int Diferencia = Tabla.GetLength(0) - Tabla.GetLength(1);
                    double[,] NuevaTabla = new double[Tabla.GetLength(0), Tabla.GetLength(0)];

                    for (int f = 0; f < Tabla.GetLength(0); f++)
                    {
                        for (int c = 0; c < Tabla.GetLength(1); c++)
                        {
                            NuevaTabla[f, c] = Tabla[f, c];
                        }
                    }
                    Tabla = NuevaTabla;
                    //Agregando Bares ficticios
                    for (int x = 0; x < Diferencia; x++)
                    {
                        Bares.Add(new Bar()
                        {
                            Nombre = "Ficticio010101"
                        });
                    }
                }

                int[]         AsginacionOptima = HungarianAlgorithm.FindAssignments(Tabla, true);
                List <string> Asignaciones     = new List <string>();
                for (int x = 0; x < AsginacionOptima.Count(); x++)
                {
                    if (!(Bares[AsginacionOptima[x]].Nombre == "Ficticio010101"))
                    {
                        Asignaciones.Add(Dependientes[x].NombreCompleto + " --> " + Bares[AsginacionOptima[x]].Nombre);
                    }
                }
                ViewData["AsignacionOptima"] = Asignaciones;
            }
            else
            {
                ViewData["AsignacionOptima"] = new List <string>()
                {
                    "No existe Turnos para esta fecha"
                }
            };

            ViewData["CrearTablaRazon"] = ventasDependientesPorBar;

            ViewData["Dependientes"] = _context.Dependientes.OrderBy(c => c.Id).ToList();
            var checkedDependientes = _context.Dependientes.ToList().Select(d => new CheckedDependientes()
            {
                Checked = true, Dependiente = d, DependienteId = d.Id
            }).ToList();

            ViewData["CheckedDependiente"] = checkedDependientes;
            var checkedTurnos = _context.Bares.ToList().Select(b => new CheckedTurno()
            {
                Checked = true, Bar = b, BarId = b.Id
            }).ToList();

            ViewData["CheckedBares"] = checkedTurnos;
            ViewData["Bares"]        = _context.Bares.OrderBy(c => c.Id).ToList();
            return(View("Asignacion", ventasDependientesPorBar));
        }
 public int[] FindAssignments() => HungarianAlgorithm.FindAssignments(_costs);