思路源自知乎:恋爱中有那些博弈?,主要是@尼克余 的回答。感谢他。然后原文有些描述不清楚的,我直接就按照我的理解补充上去了。
注:本文采用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;
}
然后就是虚拟世界的表白算法了,虚拟世界规定:1.只有男性才能表白 2.只有单身的男性才能表白
//开始表白
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));
}
}
}
}
然后知乎上的结果是,女性的幸福感会比男性的低,我设置了一千组数据,看看谁的幸福感比较高(注意,程序中设定幸福感数值越高表示幸福感越低,详情请看函数AddLoveIndex)(PS:这只是运行一次的结果,运行多次结果可能不同)
源码 点击打开链接