思路源自知乎:恋爱中有那些博弈?,主要是@尼克余 的回答。感谢他。然后原文有些描述不清楚的,我直接就按照我的理解补充上去了。
注:本文采用C#实现
首先假设一个虚拟世界,这个世界中分别有N个男生,N个女生,男生与女生数量完全一样,男生女生都有一个心仪对象列表,不同的人的心仪对象列表都是随机的,在心仪对象列表排名越前面,说明对于他(她)来说越喜欢。男生能向女生表白,女生不能向男生表白,女生能接受或者拒绝男生的表白。
男生首先会向对他最喜欢的女生表白,然后是次喜欢的,依次下去表白。而女生则通过对表白的男生进行判断,如果他是自己心仪列表里面排名第一的,嗯,就是他了,他就是最适合我的。但是如果不是,女生会说,对不起,你是个好人,然后拒绝男生。然后女生会想,是不是我要求太高了,那排名第二的也可以啦。然后女生把排名限制放宽到第二名。但是相应的,第二名就不是女生的最佳伴侣,如果她接受了第二名的邀请,那就说明她的幸福感并不是最高的。当然,如果在第二名向她表白之后,第一名也向她表白,她会无情的甩掉第二名,然后和第一名么么哒。
ok,基于上述要求,那么首先要设计一个人类,人类需要有下面几个属性,分别是编号(方便认识和排序),性别,心仪对象列表,预期对象,伴侣。然后这个类还要能表白,能接受表白。主要功能就那么多了。下面是类的设计
enum Sex { Man, Woman } class Human { int _index = 0; //索引 public int index { get { return _index; } } Sex _sex = Sex.Man; //性别 public Sex sex { get { return _sex; } } List<Human> _loveList = new List<Human>(); //心仪对象列表 int _curLoveIndex = 0; //幸福感 public int LoveIndex { get { return _curLoveIndex; } } Human _partner = null; //伴侣 public Human partner { get { return _partner; } set { _partner = value; } } //表白 public bool Confession() { } //考虑是否接受 public bool Accept(Human askMan) { } }
首先是最为重要的表白程序啦,表白者首先要获取到心仪对象列表,挨个和心仪的对象表白,如果对象接受了,那OK,恋爱吧;如果对象不接受,嗯,伤心一下,继续和下一个表白。哈哈哈。以下是表白函数的实现
//表白 public bool Confession() { if (_loveList.Count >= GetLoveIndex()) { for (int i = 0; i < GetLoveIndex(); i++) { form.AddList(string.Format("{0}号向{1}号表白", index, _loveList[i].index)); if (_loveList[i].Accept(this)) //表白 { //成功 //设置伴侣 _partner = _loveList[i]; return true; } else { //失败 //降低幸福感 AddLoveIndex(); } } } return false; }
表白了妹纸就要确定接受与否了,首先妹纸得看这个人自己喜欢不喜欢,如果不喜欢,直接拒绝没得商量;如果喜欢的话,再看看自己有没有男朋友;有男朋友的话,看看哪个比较好,如果男朋友比较差,那就直接甩了男朋友。妹纸就是酱紫 QAQ
//考虑是否接受 public bool Accept(Human askMan) { if (_loveList.Count >= GetLoveIndex()) { var list = _loveList.Take(GetLoveIndex()).ToList(); var man = list.FirstOrDefault(x => x._index == askMan._index); if (man != null) { //对象单身了 if (_partner != null) { _partner.partner = null; _partner.AddLoveIndex(); form.AddList(string.Format("{0}号失恋了,他的伴侣{1}号接受了{2}号的表白", _partner.index, index, askMan.index)); } _partner = askMan; return true; } else { //女生还单身的时候 AddLoveIndex(); return false; } } return false; }
//开始表白 void StartConfession() { AddList("开始表白"); foreach (var p in people) { if (p.sex == Sex.Man && p.partner == null) { bool result = p.Confession(); if (result == true) { //恋爱 string msg = string.Format("{0}号与{1}号恋爱了", p.index, p.partner.index); AddList(msg); } else { AddList(string.Format("{0}号表白失败", p.index)); } } } }
源码 点击打开链接
【算法】恋爱中的博弈论(stable matching)(附带源码)
原文地址:http://blog.csdn.net/nxshow/article/details/43707307