Hola Luis,
Muy bien code! Yo cambio el code un poco; por el legibilidad, y para hacer el code conciso. La tarea se compone dos partes: el algoritmo Gale-Shapley (incluido en la función StableMarriage) y perturbar los pares y prueba la estabilidad.
Parte uno:
Quiet[Needs["Combinatorica`"]];
mals = {"abe", "bob", "col", "dan", "ed", "fred", "gav", "hal", "ian", "jon"};
fems = {"abi", "bea", "cath", "dee", "eve", "fay", "gay", "hope", "ivy", "jan"};
menstrg = {{"abi", "eve", "cath", "ivy", "jan", "dee", "fay", "bea", "hope", "gay"}, {"cath", "hope", "abi", "dee", "eve", "fay", "bea", "jan", "ivy", "gay"}, {"hope", "eve", "abi", "dee", "bea", "fay", "ivy", "gay", "cath", "jan"}, {"ivy", "fay", "dee", "gay", "hope", "eve", "jan", "bea", "cath", "abi"}, {"jan", "dee", "bea","cath", "fay", "eve", "abi", "ivy", "hope", "gay"}, {"bea", "abi", "dee", "gay", "eve", "ivy", "cath", "jan", "hope", "fay"}, {"gay", "eve", "ivy", "bea", "cath", "abi", "dee", "hope","jan", "fay"}, {"abi", "eve", "hope", "fay", "ivy", "cath", "jan", "bea", "gay", "dee"}, {"hope", "cath", "dee", "gay", "bea","abi", "fay", "ivy", "jan", "eve"}, {"abi", "fay", "jan", "gay", "eve", "bea", "dee", "cath", "ivy", "hope"}};
womstrg = {{"bob", "fred", "jon", "gav", "ian", "abe", "dan", "ed", "col", "hal"}, {"bob", "abe", "col", "fred", "gav", "dan", "ian", "ed", "jon", "hal"}, {"fred", "bob", "ed", "gav", "hal", "col", "ian", "abe", "dan", "jon"}, {"fred", "jon", "col", "abe", "ian", "hal", "gav", "dan", "bob", "ed"}, {"jon", "hal", "fred", "dan",  "abe", "gav", "col", "ed", "ian", "bob"}, {"bob", "abe", "ed", "ian", "jon", "dan", "fred", "gav", "col", "hal"}, {"jon", "gav", "hal", "fred", "bob", "abe", "col", "ed", "dan", "ian"}, {"gav", "jon", "bob", "abe", "ian", "dan", "hal", "ed", "col", "fred"}, {"ian", "col", "hal", "gav", "fred", "bob", "abe", "ed",  "jon", "dan"}, {"ed", "hal", "gav", "abe", "bob", "jon", "col", "ian", "fred", "dan"}};
male = menstrg /. Thread[fems -> Range[10]];
female = womstrg /. Thread[mals -> Range[10]];
lks = StableMarriage[male, female] /. Thread[ Range[10] -> fems];
MapThread[{#1, " fiance ", #2} &, {mals, lks}] // Grid
Output:
abe   fiance   ivy
bob   fiance   cath
col   fiance   dee
dan   fiance   fay
ed   fiance   jan
fred   fiance   bea
gav   fiance   gay
hal   fiance   eve
ian   fiance   hope
jon   fiance   abi
Replace ( /. ) funciona en todos los niveles (Levels en Mathematica). Table no es necesario. 
Perdona que mi Español sea malo, aún estoy aprendiendo.
For the english-only speaking:
The code above does part one of the task. Part two of the task is to perturb the 'best matches' and test stability. Anyone?