Example #1
0
 public void AddNeighbor(HungarianNode Node, double Weight, bool Bidirectional = true)
 {
     _Neighbors[((HungarianNode)Node).ID] = Weight;
     if (Bidirectional)
     {
         Node.AddNeighbor(this, Weight, false);
     }
 }
Example #2
0
        public MaxCostAssignment(IEnumerable <T> Left, IEnumerable <K> Right, Func <T, K, double> DistanceFunction, Func <T, IEnumerable <K> > LeftNeighbors, Func <K, IEnumerable <T> > RightNeighbors)
        {
            int NumLeft  = Left.Count();
            int NumRight = Right.Count();

            _Left  = new HungarianNode[NumLeft];
            _Right = new HungarianNode[NumRight];

            int LeftID = 0;

            foreach (T L in Left)
            {
                HungarianNode H = new HungarianNode(L, LeftID, NumRight);
                _Left[LeftID++] = H;
                _Nodes.Add(L, H);
            }
            int RightID = 0;

            foreach (K R in Right)
            {
                HungarianNode H = new HungarianNode(R, RightID, NumLeft);
                foreach (T N in RightNeighbors(R))
                {
                    H.AddNeighbor(_Nodes[N], DistanceFunction(N, R));
                }
                _Right[RightID++] = H;
                _Nodes.Add(R, H);
            }
            foreach (T L in Left)
            {
                foreach (K N in LeftNeighbors(L))
                {
                    _Nodes[L].AddNeighbor(_Nodes[N], DistanceFunction(L, N));
                }
            }

            Assign();
        }