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

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

这个博弈是对现实生活中人与人之间是否合作的简单抽象,具体内容和规则可以概括为“如果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 }

时间: 2024-10-26 18:19:04

博弈论中的简单合作博弈 C#实现的相关文章

浪潮与思科合资,树立中美经贸合作典范

据新华社报道,国务院副总理汪洋20日下午在中南海紫光阁会见了美国思科公司首席执行官罗卓克一行.汪洋表示,中国正在大力实施网络强国战略,推进"互联网+"行动计划,欢迎思科公司等美国企业进一步与中国企业开展深度合作,加强高新技术交流,抢抓市场机遇,实现互利共赢,为中美新型大国关系建设注入新动力. 这看似只是一则简单的"国务院副总理会见美国客人"的新闻,但却并不"普通".一来,熟悉网络行业的人恐怕都知道,思科公司是全球领先的网络解决方案供应商.更为重要

百度与Uber合作开启中美互联网合作最新模式

北京寒冷的冬天,没能挡住位于上地十街百度总部热烈的气氛.中美互联网公司之间首次达成了深度战略合作.12月17日,百度与硅谷新兴创业公司Uber签署战略合作及投资协议,双方达成全球范围内战略合作伙伴关系.协议签订后,百度和Uber将在技术创新.开拓国际化市场.拓展中国O2O服务三个方面展开合作.百度CEO李彦宏在签约仪式上多次强调,"百度和Uber的合作有着深远的里程碑意义."在此前,中美两国互联网公司的合作大多是在投资层面,比较早是美国公司投资中国公司,后来也有一些中国公司到美国去投资

Python的Flask框架中实现简单的登录功能的教程

  Python的Flask框架中实现简单的登录功能的教程,登录是各个web框架中的基础功能,需要的朋友可以参考下 回顾 在前面的系列章节中,我们创建了一个数据库并且学着用用户和邮件来填充,但是到现在我们还没能够植入到我们的程序中. 两章之前,我们已经看到怎么去创建网络表单并且留下了一个实现完全的登陆表单. 在这篇文章中,我们将基于我门所学的网络表单和数据库来构建并实现我们自己的用户登录系统.教程的最后我们小程序会实现新用户注册,登陆和退出的功能. 为了能跟上这章节,你需要前一章节最后部分,我们

代码-Xcode6.2 中编译简单.c文件,昨天中午突然出现如下错误

问题描述 Xcode6.2 中编译简单.c文件,昨天中午突然出现如下错误 Xcode6.2 中编译简单.c文件,之前正常,昨天中午突然出现如下错误:,编译什么的都正常,就是一敲cc ./a.out 就出现报错啊,正式无语了,昨天求一天也没人能解决,自己也搞了一上午,还是不行啊...求大神解救,,代码是没错误,因为我拿最简单的代码试了,也会报错 解决方案 是不是连接模拟器了,是64位的问题吧 解决方案二: 你直接在Xcode里面创建一个命令行工程,然后再把这个C源文件导入到工程里,肯定能通过编译哇

VB.NET中的简单Web Service例程

web VB.NET中的简单Web Service例程 本文和附带的源码向您演示了在.NET开发环境下创建一个WEB服务是如何得简单,同时演示了客户端如何使用这个WEB服务.例程创建了一个计算器的简单WEB服务,它有三个方法:加.减和除. 下载文件包WebService_mehta.zip包含所有演示文件: Calculator.asmx HTMLClient.Html InetClient (VB6 Project) Calculator.asmx代码 <%@ WebService Langu

水晶报表在VC++6.0中的简单使用方法

水晶报表是一个报表设计开发的强大工具,功能强大,设计灵活,在水晶报表光盘中只提供了一个完全动态生成报表的例子,使用繁琐.现介绍其在VC++6.0中的简单使用方法.编译环境:VC++6.0 sp5 .Windows 2000 Server sp3 (en).一.导入水晶报表使用的动态联接库:根据实际修改文件路径. #import "C:\Documents and Settings\Administrator\桌面\cr\craxdrt9.dll" no_namespace 二.定义接口

如何在oracle存储过程中进行简单动态查询

在存储过程中做简单动态查询代码 ,例如: CREATE OR REPLACE procedure ZXM_SB_GZ_GET (p_table in varchar2, p_name in varchar2, p_value in varchar2, outpara out lntxdba.zxm_pag_cs_power.c_type ) as begin declare wherevalue varchar2(200): begin wherevalue:=select * from ||p

浅谈ASP.NET中最简单的自定义控件

这篇文章主要简单介绍了ASP.NET中最简单的自定义控件,以及核心代码示例,需要的朋友可以参考下 ASP.NET用户控件一般适用于产生相对静态的内容,所以没有builtin的事件支持.本文讨论用户控件返回事件的方法. 假定用户控件(UserControl.ascx)中包含按钮控件AButton,希望实现按AButton按钮时,包含该用户控件的页面可以接收到事件.为此,小鸡射手在用户控件和页面的代码中分别作了处理. UserControl.ascx.cs中的处理: 1. 定义public的事件委托

在Python的Tornado框架中实现简单的在线代理的教程

  这篇文章主要介绍了在Python的Tornado框架中实现简单的在线代理的教程,代理功能是一个常见的网络编程实现,需要的朋友可以参考下 实现代理的方式很多种,流行的web服务器也大都有代理的功能,比如http://www.tornadoweb.cn用的就是nginx的代理功能做的tornadoweb官网的镜像. 最近,我在开发一个移动运用(以下简称APP)的后台程序(Server),该运用需要调用到另一平台产品(Platform)的API.对于这个系统来说,可选的一种实现方式方式是APP同时