熄火保护的英文护翻译护英语怎么说-热门专业排名
2023年3月31日发(作者:免费赠送qq号码)
[python3]稳定匹配算法实现和优化
问题的描述
在这⾥就不赘述了,你能搜到这篇⽂章,那肯定知道只算法的背双双金鹧鸪 景是啥
解决思路
1.男⽣向还未拒绝其的⼥⽣中选出优先级最⾼的,并向其求婚
2.⼥⽣如果没有已经被优先级更⾼的男⽣求婚,则答应(⼥⽣以后可以反悔)。如果反之,则拒绝
3.对此步骤进⾏loop,直到没有求婚发⽣
这篇⽂章,讲⼀个⾃⼰实现的GS算法的版本
⽂章使⽤的代码
上⾯那篇⽂章使⽤的代码是这样的,很清晰。
deffind_stable_matching(man_preferences,woman_preferences):
\"\"\"
Gale-ShapelyAlgorithm
:paramman_preferences:
:paramwoman_preferences:
:return:
\"\"\"
length=len(man_preferences)
is_man_free=[True]*length
is_woman_free=[True]*length
isManProposed=[[Falseforiinrange(length)]forjinrange(length)]
match=[(-1,-1)]*length
whileTrueinis_man_free:
indexM=is_man_(True)
ifFalseinisManProposed[indexM]:
indexW=-1
foriinrange(length):
w=man_preferences[indexM][i]
ifisManProposed[indexM][w]isFalse:
indexW=w
break
isManProposed[indexM][indexW]=True
ifis_woman_free[indexW]isTrue:
is_woman_free[indexW]=False
is_man_free[indexM]=False
match[indexM]=(indexM,indexW)
else:
indexM1=-1
forjinrange(length):
ifmatch[j][1]==indexW:
indexM1=j
break
ifwoman_preferences[indexW].index(indexM)
is_man_free[一日看尽长安花春风得意马蹄疾 indexM1]=True
is_man_free[indexM]=False
match[indexM]=(ind智者乐水仁者乐山怎么读 exM,indexW)
print(match)
returnmatch
这个算法没问题,结果也是对的。但是我认为有点拖沓,还可以进⾏精简。
我们输⼊这样两个⼆维矩阵
MP=[[1,4,3,6,2,5,8,7,9,0],
[2,卖油翁恐怖真相 1,0,3,4,8,5,9,7,6],
[4,3弄花香满衣 ,8,9,0,2,1,7,6,5],
[2,7,6,1,4,3,8,0,9,5],
[5,3,8,4,2,0,7,6,1,9],
[5,0,1,7,2,8,9,4,6,3],
[6,2,9,8,0,7,5,1,4,3],
[9,7,1,8,0,2,5,6,3,4],
[8,0,5,9,6,7,1,2,4,3],
[7,9,1,6,2,0,5,8,4,3]]
WP=[[3,5,0,6,9,4,8,7,2,1],
[0,1,3,2,7,8,5,9,4,6],
[1,0,7,9,3,2,5,8,6,4],
[2,0,6,3,4,1,5,7,9,8],
[5,6,8,3,2,0,9,4,1,7],
[3,0,1,7,9,8,2,4,6,5],
[6,2,7,8,0,9,4,1,5,3],
[9,3,1,2,0,7,5,6,8,4],
[4,1,5,9,6,7,0,2,8,3],
[6,0,1,7,2,9,5,8,4,3]]
上⾯的算法的结果是这样
[(0,1),(1,2),(2,3),(3,4),(4,5),(5,0),(6,6),(7,9),(8,8),(9,7)]
#也就是0号男⽣配1号⼥⽣,以此类推。说实话我觉得结果甚⾄都有些重复。
我的版本
#把⾃⼰带⼊⾮成勿扰录制现场
defgs_matching(man_preferences,woman_preferences):
length=len(man_preferences)
is_man_dated=[False]*length#10位男嘉宾是否已经撩到妹妹了
is_woman_dated=[False]*length#10位美⼈是否已经名花赞美秋天的诗 有主
result=[-1]*length
whileFalseinis_man_dated:
new_man=is_man_(False)
girls_he_likes=愿君笑看千秋尽 man_preferences[new_man]#康康这个男⽣最喜欢谁
forgirlingirls_he_likes:
#查看⼥⽣是否已经被约
if江城梅花引词牌格律 is_woman_dated[girl]isFalse:#发现没有,那就当场拿下
result[new_man]=girl
is_woman_dated[girl]=True
is_man_dated[new_man]=True
break#换下⼀个男嘉宾登场,进⾏选择
else:
#⼥嘉宾已经⼼有所属,现在进⼊权利反转环节,⼥⽣对两位男嘉宾进⾏挑选
current_boyfriend=(girl)
ifwoman_prefere亲近的近义词 nces[girl].index(current_boyfriend)>woman_preferences[girl].index(new_man):
#看看是不是更喜欢新来的这个⼩鲜⾁,如果是,果断甩掉之前的蓝朋友
is_man_dated[current_boyfriend]=False
result[current_boyfriend]=-1
is_man_dated[new_man]=True
result[new_man]=girl
break#换下⼀个男嘉宾登场,进⾏选择
print(result)
我的这个算法的结果是这样的
[1,2,3,4,5,0,6,9,8,7]
#结果数据的index虽然没显⽰出来,但是也代表意义。
#结果数组的第0号位置,就代表0号男⽣配对1号⼥⽣,以此类推。
区别
⾸先说,两个代码都可以正确的运⾏,获得稳定匹配的结果。
但是我的代码使⽤更⼩,更少的变量。
更少的数据交换。
也更符合“延迟接受”算法的含义。
更多推荐
mandated是什么意思dated在线翻译读音例
发布评论