码迷,mamicode.com
首页 > 编程语言 > 详细

【算法】恋爱中的博弈论(stable matching)(附带源码)

时间:2015-02-10 23:17:53      阅读:1390      评论:0      收藏:0      [点我收藏+]

标签:算法   博弈论   恋爱   好玩   

思路源自知乎:恋爱中有那些博弈?,主要是@尼克余 的回答。感谢他。然后原文有些描述不清楚的,我直接就按照我的理解补充上去了。


注:本文采用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:这只是运行一次的结果,运行多次结果可能不同)

技术分享


源码 点击打开链接


【算法】恋爱中的博弈论(stable matching)(附带源码)

标签:算法   博弈论   恋爱   好玩   

原文地址:http://blog.csdn.net/nxshow/article/details/43707307

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!