使用Erlang消息机制实现稳定婚姻问题

如何在异步消息传递中实现稳定婚姻Stable Marrige问题,这是使用Erlang编码的源码实现。

Solving the Stable Marriage problem in Erlang | th

稳定婚姻问题是这样:
假设有n个男人和n个女人,每位男士都要和所有的女士进行短暂的单独交流,并为她们打分,然后按照喜欢程度,对每一位女士进行排序;同样的,每位女士也要对所有男士进行打分和排序。每个男人只能配一个女人,如果没有一个人喜欢两个人,那么所有这些婚姻都是稳定的。

对于这个问题描述,假设在我们系统中有三个模块:
1.一个模块代表男人
2.一个模块代表女人
3.一个模块代表好娘中介机构,复制给男女配对策划的。

如下图:


注意上图中每一个消息过程,首先,策划者orchestrator向两个男人发出消息表示开始抢女人,最左边的男人提议了一个女人,这个女人接受了这个男人,男人向策划者报告自己配对了一个女人,下面竞争来了,左边第二个男人也看中了这个女人,这个女人发现第二个男人比第一个更好,接受了第二个男人,同时反悔拒绝了第一个男人,第二个男人高兴地向策划者报告自己配对成功一个女人,第一个男人沮丧地报告自己没有配对。

男人向女人求爱propose这个过程必须是同步的,一直等到他能得到一个求爱结果的答案,但是所有其他的联系都是异步的。

注意Erlang的OTP-sense的同步调用还和通常Java/C中通过堵塞线程调用实现的同步不同。这里的同步通讯还是通过异步消息传递,但是调用过程是异步等待直到获得一个回应才继续向下执行。

Erlang的源码:Github