public void AddNeighbor(HungarianNode Node, double Weight, bool Bidirectional = true) { _Neighbors[((HungarianNode)Node).ID] = Weight; if (Bidirectional) { Node.AddNeighbor(this, Weight, false); } }
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(); }