算法设计学习记录(一):G-S算法实现稳定匹配

2023-10-29

最近这几周在复习微机原理,不可避免地重燃了对硬件的兴趣,一度想要拿下一张树莓派玩玩,好在这东西不便宜,思来想去还是决定暂时放放。

一直有在考虑自己未来的发展方向,自动驾驶还是交通运输,这对我来说是一个很难决定的事情。回过头来想,其实现在确实想不出一个答案,一是积累不够,二是眼界尚浅。于是决定静下心来去学习和沉淀,看着书架上好久没翻开的《算法设计》,就决定从这里开始了!

希望我能把这个系列做下去,能把这本书啃完。

因为是学习记录,内容上更多是代码展示和思考过程,不会对原文内容进行太监传话,如果有想一起学的可以考虑书(封面上的这本)和博客一起食用,也欢迎关注我的公众号:补考日记

稳定匹配

稳定匹配描述了这样一个问题:现有n位男性和n位女性,每位男性对n位女性都有一个好感度排名,当然每位女性对n位男性也有一个好感度排名。我们的目标是求解这样一个匹配集合,它满足一夫一妻制(完美匹配),且不存在这样两个元素(m1,w1)(m2,w2)其中m1更喜欢w2,w2也更喜欢m1(稳定匹配)。

算法

代码

<1>定义人物类与相关函数

人物类包含属性有名字,是否未进入订婚状态,好感度列表,已匹配过列表,伴侣;函数有检验好感度排名,更改人物状态。

# ------------------------class and function------------------------

class Person:
    def __init__(self, name, free, prefer_list, matched_list, mate):
        self.name = name
        self.free = free
        self.prefer_list = prefer_list
        self.matched_list = matched_list
        self.mate = None


def check_prefer(w, m1, m2):
    prefer_m1 = w.prefer_list.index(m1)
    prefer_m2 = w.prefer_list.index(m2)
    if prefer_m1 < prefer_m2:
        return 1
    else:
        return 0


def change_state(i, j):
    i.free = 0
    j.free = 0
    i.mate = j
    j.mate = i
    i.matched_list.append(j)

# ------------------------class and function------------------------

<2>初始化人物对象

我的面向对象学的很一般,在设计人物类的时候碰到了问题。person.mate这一属性的type是Person类,这使得我在初始化类对象的时候卡壳了,于是只能用下面的呆瓜方法初始化。(写了个生成字符串的脚本,还挺快?)做了张表方便大家看好感度排名。

w1 w2 w3 w4
m1 3 3 1 1 2 4 4 2
m2 1 1 3 3 4 2 2 4
m3 4 2 2 2 3 3 1 1
m4 2 4 4 4 1 1 3 3
# ------------------------initialize person------------------------

w1 = Person('w1', 1, [], [], None)
w1.mate = w1
w2 = Person('w2', 1, [], [], None)
w2.mate = w2
w3 = Person('w3', 1, [], [], None)
w1.mate = w3
w4 = Person('w4', 1, [], [], None)
w1.mate = w4
m1 = Person('m1', 1, [], [], None)
m1.mate = m1
m2 = Person('m2', 1, [], [], None)
m2.mate = m2
m3 = Person('m3', 1, [], [], None)
m3.mate = m3
m4 = Person('m4', 1, [], [], None)
m4.mate = m4

w1.prefer_list = [m2, m3, m1, m4]
w2.prefer_list = [m1, m4, m2, m3]
w3.prefer_list = [m4, m2, m3, m1]
w4.prefer_list = [m3, m1, m4, m2]
m1.prefer_list = [w2, w3, w1, w4]
m2.prefer_list = [w1, w4, w2, w3]
m3.prefer_list = [w4, w2, w3, w1]
m4.prefer_list = [w3, w1, w4, w2]

# ------------------------initialize person------------------------

<3>匹配

这一部分才是这篇推送的重点,实际上就是对上面图里算法的实现。实现过程中遇到的问题:1.算法结束标志,一开始我是构建了匹配结果列表,后来嫌麻烦,换成了下面的count,个人觉得挺好;2.break,刚写完的时候没写这俩break,导致算法一直结束不了,后来加了两条print用来debug才找到这个问题(真的很喜欢用print来调试,想要什么输出什么,软件自带的信息量太多了);3.循环列表,我用了4*[m1, m2, m3, m4],这是因为G-S算法的时间复杂度最大为O(n^2),但我这样写是会导致算法运行时间变长的。

# -----------------------------------begin match-----------------------------------

def match():
    count = 1
    while count != 0:
        for i in [m1, m2, m3, m4, m1, m2, m3, m4, m1, m2, m3, m4, m1, m2, m3, m4]:
            if i.free:
                for j in i.prefer_list:
                    if j in i.matched_list:
                        continue
                    else:
                        if j.free or j.mate is j:
                            change_state(i, j)
                            # print('match:{},{}'.format(i.name, j.name))
                            break
                        else:
                            if check_prefer(j, i, j.mate):
                                j.mate.free = 1
                                change_state(i, j)
                                # print('match:{},{}'.format(i.name, j.name))
                                break
                            else:
                                i.matched_list.append(j)
        count = m1.free + m2.free + m3.free + m4.free
        # print(count)

# -----------------------------------begin match-----------------------------------

<4>检验

# ---------------------main---------------------

match()
for i in [m1, m2, m3, m4]:
    print('[{},{}]'.format(i.name, i.mate.name))

# ---------------------main---------------------

<5>最终结果

[m1,w2],[m2,w1],[m3,w4],[m4,w3]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法设计学习记录(一):G-S算法实现稳定匹配 的相关文章

  • Python Pandas 滚动聚合一列列表

    我有一个简单的数据框 df 和一列列表lists 我想根据以下内容生成一个附加列lists The df好像 import pandas as pd lists 1 1 2 1 2 3 3 2 9 7 9 4 2 7 3 5 create
  • 为什么 Mypy 在 __init__ 中分配已在类主体中进行类型提示的属性时不给出键入错误?

    这是我的示例 python 文件 class Person name str age int def init self name age self name name self age age p Person 5 5 但当我跑步时myp
  • 如何同时运行多个功能[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有以下代码 my func1 my func2 my func3 my func4 my func5 是否可以同时计算函数的数据 而
  • 使用管理员权限打开cmd(Windows 10)

    我有自己的 python 脚本来管理我的计算机上的 IP 地址 它主要在命令行 Windows 10 中执行netsh命令 您必须具有管理员权限 这是我自己的计算机 我是管理员 运行脚本时我已经使用管理员类型的用户 Adrian 登录 我无
  • 如何通过 python 中的函数运行列表?

    我试图通过我创建的函数运行我的列表 但不断收到错误 我不知道出了什么问题 温度 F temp f 19 21 21 21 23 功能 def fahrToCelsius tempFahrenheit return tempFahrenhei
  • Python Requests 库重定向新 url

    我一直在浏览 Python 请求文档 但看不到我想要实现的任何功能 在我的脚本中我设置allow redirects True 我想知道该页面是否已重定向到其他内容 新的 URL 是什么 例如 如果起始 URL 为 www google c
  • 动态字段取决于 WTForms 的先前字段

    我正在使用 WTForms 制作表格 目前 我有这个 class UploadForm flask wtf Form fichier wtforms fields FileField u Fichier description wtform
  • 使用 Pandas 从 csv 文件读取标题信息

    我有一个包含 14 行标题的数据文件 在标头中 有经纬度坐标和时间的元数据 我目前正在使用 pandas read csv filename delimiter header 14 读取文件 但这只是获取数据 我似乎无法获取元数据 有人知道
  • 获取 Keras model.summary() 作为表

    我在 Keras 中创建了相当大的模型 我正在用 LaTeX 写一篇关于它的文章 为了很好地描述 LaTeX 中的 keras 模型 我想用它创建一个 LaTeX 表 我可以手动实现它 但我想知道是否有任何 更好 的方法来实现这一点 我四处
  • 列表推导式和 for 循环中的 Lambda 表达式[重复]

    这个问题在这里已经有答案了 我想要一个 lambda 列表 作为一些繁重计算的缓存 并注意到这一点 gt gt gt j for j in lambda i for i in range 10 9 9 9 9 9 9 9 9 9 9 Alt
  • 使用会话在 Django 中将文件从一个视图传递到另一个视图

    我当前的工作项目要求我允许用户上传各种格式的文件 目前仅处理 CSV 格式 然后使用包含的数据来绘制图表Pandas http pandas pydata org 图书馆 我决定将图形渲染到模板的最简单方法是为图形创建特定视图 然后将图像从
  • 使用 ElementTree 在 python 中解析 xml

    我对 python 很陌生 我需要解析一些脏的 xml 文件 这些文件需要先清理 我有以下 python 代码 import arff import xml etree ElementTree import re totstring wit
  • Python:导入模块一次然后与多个文件共享

    我有如下文件 file1 py file2 py file3 py 假设这三个都使用 lib7 py lib8 py lib9 py 目前 这三个文件中的每一个都有以下行 import lib7 import lib8 import lib
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 如何将两列 pandas Dataframe 移动并堆叠为一列?

    我有一个下面提到的数据框 ETHNIC SEX USUBJID 0 HISPANIC OR LATINO F 16 1 HISPANIC OR LATINO M 8 2 HISPANIC OR LATINO Total 24 3 NOT H
  • SQLAlchemy 与 count、group_by 和 order_by 使用 ORM

    我有几个函数需要使用 count group by 和 order by 进行一对多连接 我使用 sqlalchemy select 函数生成一个查询 该查询将返回一组 id 然后我对其进行迭代以对各个记录执行 ORM 选择 我想知道是否有
  • PyQt5按钮lambda变量变成布尔值[重复]

    这个问题在这里已经有答案了 当我运行下面的代码时 它显示如下 为什么 x 不是 x 而是变成布尔值 这种情况仅发生在传递到用 lambda 调用的函数中的第一个参数上 错误的 y home me model some file from P
  • 检查 IP 地址是否在给定范围内

    我想检查一下是否有IP180 179 77 11位于特定范围之间 例如180 179 0 0 180 179 255 255 我编写了一个函数 它将每个 IP 八位字节与其他八位字节进行比较 def match mask IP min ip
  • ProcessPoolExecutor 传递多个参数

    ESPN播放器免费 class ESPNPlayerFree def init self player id match id match id team 团队名单1 277906 cA2i150s81HI3qbq1fzi za1Oq5CG
  • 超过两个点的Python相对导入

    是否可以使用路径中包含两个以上点的模块引用 就像这个例子一样 Project structure sound init py codecs init py echo init py nix init py way1 py way2 py w

随机推荐

  • Qt Creator中增加新的ui文件时报错

    原因分析 moc 开头的文件编译过程中没有又一次生成导致 解决的方法 删除编译产生的build目录 又一次编译就可以 错误类型截图例如以下 这个问题的解决 使得能够在不论什么时候都能够在project中加入新的ui文件 而不必在開始就加入全
  • linux修改文件名的三种方法

    文章目录 前言 一 用mv命令修改文件名 二 使用cp命令修改 三 使用rename命令修改 总结 前言 我们在使用linux系统过程中为了便于记忆或整理维护 经常需要对文件名进行修改 下面文章介绍了linux系统的三种修改文件名称的方式
  • logback时区设置东八区,生产环境配置

    写在springboot启动类main里面 设置时区东八区 TimeZone timeZone TimeZone getTimeZone GMT 08 TimeZone setDefault timeZone System out prin
  • 【webpack】webpack打包后, 静态图片资源不显示的若干个问题

    背景 最近在搭建公司的前端组件库 vue写的 webpack打包后 在项目中引用组件库 其中有个组件引用了静态图片资源 然而打包后在项目中引用该组件的图片就不显示了 遇到了以下问题 小小记录一下 1 打包时报错 问题 webpack打包时报
  • QT:头部菜单栏和右击菜单事件

    实现思路 1 gt 每一个小的选项都是一个action 项 一个menu 菜单 可以盛放很多action 一个菜单栏 QMenuBar 可以盛放很多menu 2 gt 把以上的嵌套起来就组合成了头部菜单栏 一般只能设置一个 3 gt men
  • Android的第一天

    早就想学下Android开发了 目前为止flash开发Android还不给力 所以还是老老实实的研究用java 开发 apk吧 下载好了 Android开发视频 看了两个视频 现在开始配置环境 ADK https dl ssl google
  • 在kali中进行bp字典爆破——攻防世界weak_auth结尾附带常用bp字典

    第一步 在kali中启动burpsuite 第二步 进入Proxy代理模块 代理模块是Burp的核心模块也是我们平时使用最多的模块 它主要用来拦截并修改浏览器 手机APP等客户端的HTTP HTTPS数据包 第三步 打开代理的浏览器进入题目
  • matlab函数 在线说明,matlab函数说明

    如果你刚接触matlab 可以看这篇Matlab自定义函数详解 MATLAB自定义函数形式function a b c funname x1 x2 x3 输入变量 对于输入变量 MATLAB可以识别输入变量的个数 通过nargin来记录当前
  • VC/MFC如何设置对话框背景颜色

    方法一 调用CWinApp类的成员函数SetDialogBkColor来实现 这个函数已经废弃 1 void SetDialogBkColor COLORREF clrCtlBk RGB 192 192 192 COLORREF clrCt
  • 二、OSPFv2 LSA详解

    OSPFv2 LSA 什么是LSA LSA头格式 LSA的类型 Router LSA Type 1 路由器LSA 类型1 Network LSA Type2 网络LSA 类型2 Network Summary LSA Type3 网络汇总L
  • 考研OR工作----计算机操作系统简答题及疑难知识点总结(第二章 进程的描述与控制)

    计算机操作系统从第二章开始内容会变得异常多 还是希望能够帮助到大家 在这一章阿婆主还会把书上的典型的PV操作题给打上来 给大家用作参考 如果有问题的地方 还请大家在文章下方留言 我好更正 或者你们有更好的PV操作的解法 也欢迎大家在文章下方
  • 从入门到渐入佳境——记我的第六届字节青训营经历

    文章目录 为什么参加 开营前 开营后 做项目 准备答辩 为什么参加 参加第六届字节青训营之前 我也参加了今年5 6月的第五届青训营 最初是在我们学校一个工作室群里看到的 是一个学长发出来的 当时看到了非常感兴趣 想着是学点新知识 因为当时我
  • C++中sort函数详解

    原文链接点这 0 简介 sort函数用于C 中 对给定区间所有元素进行排序 默认为升序 也可进行降序排序 sort函数进行排序的时间复杂度为n log2n 比冒泡之类的排序算法效率要高 sort函数包含在头文件为 include的c 标准库
  • 性能测试基础概念和分类

    什么是性能测试 gt 在给定环境和场景中进行的测试活动 gt 根据测试结果评判是否存在性能问题 gt 如果存在性能问题 编辑定位性能瓶颈 并提出改进建议 性能不仅仅包括响应时间 还包括资源的占用 性能测试基本流程 1 性能测试需求分析 项目
  • vue项目中使用pdf.js预览pdf文件

    项目要求需要预览pdf文件 网上找了很久 大多数都是推荐pdf js 自己先了解了一下 最后决定用pdf js 但是发现 在vue中使用这个很少 所以我就写这一篇帮助一下vue使用pdfjs的朋友 其实 这和前端框架无关的 直接使用pdf
  • C++ 多态类型

    多态 C 在面向对象中 多态就是不同对象收到相同消息 执行不同的操作 在程序设计中 多态性是名字相同的函数 这些函数执行不同或相似的操作 这样就可以用同一个函数名调用不同内容的函数 简而言之 一个接口 多种方法 多态是以封装和继承为基础的
  • android 注册页面实现

    自己动手做的第一个demo 简单的注册页面的实现 并且注册成功后返回注册信息 适用于android新手基本控件的使用 注册页面的实现 import android os Bundle import android app Activity
  • 如果确定游戏服务器位置,如果确定游戏服务器位置

    如果确定游戏服务器位置 内容精选 换一换 远程登录服务器出现蓝屏或黑屏 可能是由于explorer exe进程异常导致的桌面无法显示 这是由于Windows服务器的explorer exe进程异常导致的 explorer exe是Windo
  • 腾讯混元大模型:新一代人机环境系统智能的发展趋势

    近日 腾讯混元大模型亮相 该通用大语言模型具备强大的中文创作能力 复杂语境下的逻辑推理能力 以及可靠的任务执行能力 同时也可以作为基底模型 为不同产业场景构建专属应用 从可靠 成熟 自研和实用的底层逻辑来看 腾讯混元大模型其实是建立在人机环
  • 算法设计学习记录(一):G-S算法实现稳定匹配

    最近这几周在复习微机原理 不可避免地重燃了对硬件的兴趣 一度想要拿下一张树莓派玩玩 好在这东西不便宜 思来想去还是决定暂时放放 一直有在考虑自己未来的发展方向 自动驾驶还是交通运输 这对我来说是一个很难决定的事情 回过头来想 其实现在确实想