Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
103
Task/Stable-marriage-problem/Python/stable-marriage-problem.py
Normal file
103
Task/Stable-marriage-problem/Python/stable-marriage-problem.py
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
import copy
|
||||
|
||||
guyprefers = {
|
||||
'abe': ['abi', 'eve', 'cath', 'ivy', 'jan', 'dee', 'fay', 'bea', 'hope', 'gay'],
|
||||
'bob': ['cath', 'hope', 'abi', 'dee', 'eve', 'fay', 'bea', 'jan', 'ivy', 'gay'],
|
||||
'col': ['hope', 'eve', 'abi', 'dee', 'bea', 'fay', 'ivy', 'gay', 'cath', 'jan'],
|
||||
'dan': ['ivy', 'fay', 'dee', 'gay', 'hope', 'eve', 'jan', 'bea', 'cath', 'abi'],
|
||||
'ed': ['jan', 'dee', 'bea', 'cath', 'fay', 'eve', 'abi', 'ivy', 'hope', 'gay'],
|
||||
'fred': ['bea', 'abi', 'dee', 'gay', 'eve', 'ivy', 'cath', 'jan', 'hope', 'fay'],
|
||||
'gav': ['gay', 'eve', 'ivy', 'bea', 'cath', 'abi', 'dee', 'hope', 'jan', 'fay'],
|
||||
'hal': ['abi', 'eve', 'hope', 'fay', 'ivy', 'cath', 'jan', 'bea', 'gay', 'dee'],
|
||||
'ian': ['hope', 'cath', 'dee', 'gay', 'bea', 'abi', 'fay', 'ivy', 'jan', 'eve'],
|
||||
'jon': ['abi', 'fay', 'jan', 'gay', 'eve', 'bea', 'dee', 'cath', 'ivy', 'hope']}
|
||||
galprefers = {
|
||||
'abi': ['bob', 'fred', 'jon', 'gav', 'ian', 'abe', 'dan', 'ed', 'col', 'hal'],
|
||||
'bea': ['bob', 'abe', 'col', 'fred', 'gav', 'dan', 'ian', 'ed', 'jon', 'hal'],
|
||||
'cath': ['fred', 'bob', 'ed', 'gav', 'hal', 'col', 'ian', 'abe', 'dan', 'jon'],
|
||||
'dee': ['fred', 'jon', 'col', 'abe', 'ian', 'hal', 'gav', 'dan', 'bob', 'ed'],
|
||||
'eve': ['jon', 'hal', 'fred', 'dan', 'abe', 'gav', 'col', 'ed', 'ian', 'bob'],
|
||||
'fay': ['bob', 'abe', 'ed', 'ian', 'jon', 'dan', 'fred', 'gav', 'col', 'hal'],
|
||||
'gay': ['jon', 'gav', 'hal', 'fred', 'bob', 'abe', 'col', 'ed', 'dan', 'ian'],
|
||||
'hope': ['gav', 'jon', 'bob', 'abe', 'ian', 'dan', 'hal', 'ed', 'col', 'fred'],
|
||||
'ivy': ['ian', 'col', 'hal', 'gav', 'fred', 'bob', 'abe', 'ed', 'jon', 'dan'],
|
||||
'jan': ['ed', 'hal', 'gav', 'abe', 'bob', 'jon', 'col', 'ian', 'fred', 'dan']}
|
||||
|
||||
guys = sorted(guyprefers.keys())
|
||||
gals = sorted(galprefers.keys())
|
||||
|
||||
|
||||
def check(engaged):
|
||||
inverseengaged = dict((v,k) for k,v in engaged.items())
|
||||
for she, he in engaged.items():
|
||||
shelikes = galprefers[she]
|
||||
shelikesbetter = shelikes[:shelikes.index(he)]
|
||||
helikes = guyprefers[he]
|
||||
helikesbetter = helikes[:helikes.index(she)]
|
||||
for guy in shelikesbetter:
|
||||
guysgirl = inverseengaged[guy]
|
||||
guylikes = guyprefers[guy]
|
||||
if guylikes.index(guysgirl) > guylikes.index(she):
|
||||
print("%s and %s like each other better than "
|
||||
"their present partners: %s and %s, respectively"
|
||||
% (she, guy, he, guysgirl))
|
||||
return False
|
||||
for gal in helikesbetter:
|
||||
girlsguy = engaged[gal]
|
||||
gallikes = galprefers[gal]
|
||||
if gallikes.index(girlsguy) > gallikes.index(he):
|
||||
print("%s and %s like each other better than "
|
||||
"their present partners: %s and %s, respectively"
|
||||
% (he, gal, she, girlsguy))
|
||||
return False
|
||||
return True
|
||||
|
||||
def matchmaker():
|
||||
guysfree = guys[:]
|
||||
engaged = {}
|
||||
guyprefers2 = copy.deepcopy(guyprefers)
|
||||
galprefers2 = copy.deepcopy(galprefers)
|
||||
while guysfree:
|
||||
guy = guysfree.pop(0)
|
||||
guyslist = guyprefers2[guy]
|
||||
gal = guyslist.pop(0)
|
||||
fiance = engaged.get(gal)
|
||||
if not fiance:
|
||||
# She's free
|
||||
engaged[gal] = guy
|
||||
print(" %s and %s" % (guy, gal))
|
||||
else:
|
||||
# The bounder proposes to an engaged lass!
|
||||
galslist = galprefers2[gal]
|
||||
if galslist.index(fiance) > galslist.index(guy):
|
||||
# She prefers new guy
|
||||
engaged[gal] = guy
|
||||
print(" %s dumped %s for %s" % (gal, fiance, guy))
|
||||
if guyprefers2[fiance]:
|
||||
# Ex has more girls to try
|
||||
guysfree.append(fiance)
|
||||
else:
|
||||
# She is faithful to old fiance
|
||||
if guyslist:
|
||||
# Look again
|
||||
guysfree.append(guy)
|
||||
return engaged
|
||||
|
||||
|
||||
print('\nEngagements:')
|
||||
engaged = matchmaker()
|
||||
|
||||
print('\nCouples:')
|
||||
print(' ' + ',\n '.join('%s is engaged to %s' % couple
|
||||
for couple in sorted(engaged.items())))
|
||||
print()
|
||||
print('Engagement stability check PASSED'
|
||||
if check(engaged) else 'Engagement stability check FAILED')
|
||||
|
||||
print('\n\nSwapping two fiances to introduce an error')
|
||||
engaged[gals[0]], engaged[gals[1]] = engaged[gals[1]], engaged[gals[0]]
|
||||
for gal in gals[:2]:
|
||||
print(' %s is now engaged to %s' % (gal, engaged[gal]))
|
||||
print()
|
||||
print('Engagement stability check PASSED'
|
||||
if check(engaged) else 'Engagement stability check FAILED')
|
||||
Loading…
Add table
Add a link
Reference in a new issue