WEB开发网
开发学院软件开发C语言 博弈论中的简单合作博弈 C#实现 阅读

博弈论中的简单合作博弈 C#实现

 2010-09-30 21:00:00 来源:WEB开发网   
核心提示:最近在看一本关于博弈的书.有个比较简单的合作不合作的博弈.挺有意思,大意是这样的:这个博弈是对现实生活中人与人之间是否合作的简单抽象,博弈论中的简单合作博弈 C#实现,具体内容和规则可以概括为“如果A与B都是合作态度,则是双赢,我在第一次合作时保持合作态度,在以后是否合作都根据对手和自己上一步的情况来确定是

最近在看一本关于博弈的书.有个比较简单的合作不合作的博弈.挺有意思,大意是这样的:

这个博弈是对现实生活中人与人之间是否合作的简单抽象,具体内容和规则可以概括为“如果A与B都是合作态度,则是双赢,每人得3分;如果A合作态度,B玩阴的,则A欺骗了B,取得了B本该得到的利益,则B得5分,A扣3分,反之亦然。最后如果A和B都不合作,则一拍两散,两个人都白费劲,则每人扣一分”在这个游戏里,每个人都和除了自己之外的人合作100次,则得分最高的人胜利.

我抽象到C#代码里是用一个接口来规范参与者,让他们实现自己的算法,并通过泛型列表保存和对手之间以往的合作记录,并可以根据合作记录来返回采取的策略..废话不说接口代码如下:

1 public interface ActorBase
2 {
3       bool Gamble(string OpponentName);//你的策略封装在这个函数里,true是合作false是不合作
4        string GetUniqueCode();//用于返回你的名字来让对手确认你的身份
5        int Score { get; set; }//记录总分
6        void AddRecord(string OpponentName,bool record);  //用于添加以往对战的记录
7 }

对于我的策略,我在第一次合作时保持合作态度,在以后是否合作都根据对手和自己上一步的情况来确定是否合作

具体代码如下:

 1public class CareySon : ActorBase
 2        {
 3            Dictionary<string, List<bool>> Record;//用于保存和对手以往的记录
 4            public Songyunjian()//构造函数,用于构造记录
 5            {
 6                Record = new Dictionary<string, List<bool>>();
 7            }
 8            public string GetUniqueCode()  //返回你的唯一标识
 9            {
10                return "CareySon";
11            }
12            public void AddRecord(string OpponentName, bool record)
13            {
14                if (!Record.ContainsKey(OpponentName))//如果没合作过,创建合作记录
15                {
16                    List<bool> l = new List<bool>();
17                    l.Add(record);
18                    Record.Add(OpponentName, l);
19                }
20                else
21                {
22                    Record[OpponentName].Add(record);//利用索引器把记录添加到list里
23                }
24            }
25            public bool Gamble(string name)
26            {
27                if (!Record.ContainsKey(name))//如果是第一次合作,则保持合作态度
28                {
29                    return true;
30                }
31                else
32                {
33                    List<bool> t = Record[name];
34                    if (t.Count >= 1)
35                    {
36                        if (t[t.Count - 1])//如果最后一次是合作则返回合作
37                        {
38                            return true;
39                        }
40                        else//否则返回不合作
41                        {
42                            return false;
43                        }
44                    }
45                    return true;
46                   
47
48                }
49            }
50            public int Score
51            {
52                get { return _score; }
53                set{_score=value;}
54            }
55            public int _score=0;//用于记录每个人的分数
56
57        }

1 2 3 4  下一页

Tags:博弈论 简单 合作

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接