public override void Execute(Instance instance) { if (instance is TSPInstance) { this.result = new Result("Result: " + instance.Name + " Alg " + this.Name); } else { this.result = new Result("Type mismatch"); } }
public override void Execute(Instance instance) { if ( !(instance is SMInstance)) { this.result = new SMResult("Type mismatch"); return; } SMInstance smi = (SMInstance)instance; int n = smi.Size; int[] mMatch = new int[n]; int[] mProposals = new int[n]; int[] wMatch = new int[n]; Stack<int> unmatched = new Stack<int>(n); for (int i = 0; i < n; i++) { mMatch[i] = -1; unmatched.Push(i); mProposals[i] = 0; wMatch[i] = -1; } while (unmatched.Count > 0) { int m = unmatched.Pop(); int w = smi.MPrefMatrix[m][mProposals[m]]; mProposals[m]++; if (wMatch[w] == -1) { mMatch[m] = w; wMatch[w] = m; } else { int m1 = wMatch[w]; if (smi.WRankMatrix[w][m] < smi.WRankMatrix[w][m1]) { mMatch[m] = w; wMatch[w] = m; mMatch[m1] = -1; unmatched.Push(m1); } else { unmatched.Push(m); } } } this.result = new SMResult(mMatch, wMatch, smi); }
public override void Execute(Instance instance) { if (!(instance is SMInstance)) { this.result = new SMResult("Type mismatch"); return; } SMInstance smi = (SMInstance)instance; StableMarriageAlgorithm smAlg = new ManFirstAlgorithm(); smAlg.Execute(smi.SwapRoles()); SMResult mAlgResult = (SMResult) smAlg.Result; this.result = new SMResult(mAlgResult.wMatch, mAlgResult.mMatch, smi); }
// Since this algorithm can cycle, we build in a cut off on the number of iterations // Arbitrarily, this is chosen to be N^ - I suspect there could be longer runs without cycling. public override void Execute(Instance instance) { if (!(instance is SMInstance)) { this.result = new SMResult("Type mismatch"); return; } SMInstance smi = (SMInstance)instance; int[] mMatch = new int[smi.Size]; int[] wMatch = new int[smi.Size]; FindInitialMatching(mMatch, wMatch, smi); int cutoff = mMatch.Length * mMatch.Length; int count = 0; int m; int w; while (FindUnhappyPair(mMatch, wMatch, smi, out m, out w)){ // Swap pairs int w1 = mMatch[m]; int m1 = wMatch[w]; mMatch[m] = w; wMatch[w] = m; mMatch[m1] = w1; wMatch[w1] = m1; if (count > cutoff) // Should at least break from an infinite loop break; count++; // System.Console.WriteLine("Elope " + m + ", " + w + "Dump " + m1 + ", " + w1); } this.result = new SMResult(mMatch, wMatch, smi); }
public abstract void Execute(Instance instance);