前言: 前一天接触了囚徒困境,觉得挺有意思的。两位囚徒为了自己的利益和最大的好处,仅仅站在自己的角度去考虑问题,而忽略了集体利益可最大化,都会选择认罪。但自己以为个人利益最大化的同时,却中了警察的圈套,结果是两位都得坐牢5年。但仔细想想,人可能都会如此选择,因为一个人很难走进一个人的内心。说了这么多,什么······你还不知到什么是囚徒困境?那就赶紧科普一下吧!囚徒困境背景

一、想法:

在用JAVA模拟囚徒困境时,这里只用了3种策略,分别是:
1、好人策略:一直选择合作,不会背叛团队中的另一个人。(现实世界中是不会存在的,活雷锋一般的存在)
2、随机策略:合作概率50%,背叛概率50%
3、Tit For Tat策略:总是根据团队中另一人的选择,来决定决定自己下一次的选择是什么。但是在最开始的时候,都是处于好意,本着和他人合作的心思,所以第一次都是选择合作。为了体现善良、宽容的特性。如果另一人这次选择了背叛,下一次自己的选择结果为95%的背叛,5%的合作。依此方式对团队中的另一人进行报复。

二、JAVA代码:

prisoner类:

  public class prisoner {public String name;//构造函数public void prisoner(String name) {this.name = name;}public String getName() {return name;}}

SelectCooperation类:(一直都会选择合作)

public class SelectCooperation extends prisoner{public SelectCooperation(String name){super.prisoner(name);}//老好人策略,一直选择合作public int select() {return 1;}
}

SelectRandom类:(50%合作,50%背叛)

public class SelectRandom extends prisoner{public SelectRandom(String name) {super.prisoner(name);}//在合作和背叛之间随机选择public int select() {//Random r = new Random();int r = (int)(Math.random()*100);if(r < 50) {return 1;}else {return 0;}}
}

SelectTitForTat类:(Tit For Tat策略)


import java.util.Random;public class SelectTitForTat extends prisoner{public SelectTitForTat(String name) {super.prisoner(name);}/* “Tit For Tat”策略:* 通过记录另一囚徒的选择,分析本次该做出如何选择* 在第一次进行选择时,都是好意进行合作* 后一次的选择判断另一人上次的选择,进行本次的选择* 若上一次另一人选择了背叛,在本次选择中1%-5%的概率继续选择合作*  *//** boolean flag = true; //获取另一人上一次的选择 public void otherSelect(int selectWhat) {* * if(selectWhat == 1) { flag = true; }else { flag = false; }* * }*/public int select(int selectWhat) {int myselect = 0;//如果对手上次选择了合作,本次选择合作if(selectWhat == 1) {myselect = 1;}else {//如果对手选择了背叛,本次95%选择背叛Random r = new Random();int [] a = {0,1,2,3,4};for(int i = 0;i<5;i++) {if(r.nextInt(100) == a[i]) {myselect = 1;break;}}myselect = 0;}return myselect;}

mian函数:(程序入口)


import java.util.Scanner;
public class test01 {public static void main(String[] args) {// TODO Auto-generated method stubScanner cin = new Scanner(System.in);//用户实例化SelectCooperation cooperation = new SelectCooperation("好人");SelectRandom random = new SelectRandom("随机选择");SelectTitForTat tit = new SelectTitForTat("Tit For Tat");//记录坐牢情况int score_1 = 0;int score_2 = 0;int totalScore = 0;//选择情况System.out.println("输入你想要查看的结果(1———好人和随机策略,2———代表好人和Tit For Tat策略,3———代表随机策略和Tit For Tat策略)");int sc = cin.nextInt();switch(sc) {case 1://第一种:老好人策略与随机策略System.out.println("你选择的是好人和随机策略,10轮结果如下:");for(int i = 0;i < 10;i++){int selectCooper = cooperation.select();int selectRandom = random.select();if(selectCooper == 1) {System.out.println(cooperation.getName() + "选择了合作————抵赖");}else {System.out.println(cooperation.getName() + "选择了背叛————认罪");}if(selectRandom == 1) {System.out.println(random.getName() + "选择了合作————抵赖");}else {System.out.println(random.getName() + "选择了背叛————认罪");}//本轮各囚徒坐牢年数int s1 = 0; int s2 = 0;System.out.println();//囚徒1选择认罪,囚徒2选择抵赖   囚徒1坐牢8年if(selectCooper == 1&&selectRandom == 0){s1 = 8;}//囚徒1选择抵赖,囚徒2选择认罪   囚徒2坐牢8年else if(selectCooper == 0&&selectRandom == 1){s2 = 8;}//囚徒1、囚徒2都选择抵赖   囚徒1、囚徒2都坐1年else if(selectCooper == 1&&selectRandom == 1){s1 = s2 = 1;}else{//囚徒1、囚徒2都选择认罪   囚徒1、囚徒2都坐5年s1 = s2 = 5;}//坐牢年数之和score_1 += s1;score_2 += s2;totalScore = score_1 + score_2;System.out.println("本轮结束, 情况如下");System.out.println(cooperation.getName() + "需要坐牢年数" + s1 + ",总的坐牢年数:"+score_1);System.out.println(random.getName() + "需要坐牢年数" + s2 + ",总的坐牢年数:"+score_2);System.out.println("两位囚徒总的坐牢年数:" + totalScore);System.out.println("======================================");}break;case 2://第二种:好人和Tit For Tat策略结果score_1 = 0;score_2 = 0;totalScore = 0;System.out.println("你选择的是好人和Tit For Tat策略,10轮结果如下:");for(int i = 0;i < 10;i++){int selectCooper = cooperation.select();//记录另一人的选择int selectTit = tit.select(selectCooper);if(selectCooper == 1) {System.out.println(cooperation.getName() + "选择了合作————抵赖");}else {System.out.println(cooperation.getName() + "选择了背叛————认罪");}if(selectTit == 1) {System.out.println(tit.getName() + "选择了合作————抵赖");}else {System.out.println(tit.getName() + "选择了背叛————认罪");}//本轮各囚徒坐牢年数int s1 = 0; int s2 = 0;System.out.println();//囚徒1选择认罪,囚徒2选择抵赖   囚徒1坐牢8年if(selectCooper == 1&&selectTit == 0){s1 = 8;}//囚徒1选择抵赖,囚徒2选择认罪   囚徒2坐牢8年else if(selectCooper == 0&&selectTit == 1){s2 = 8;}//囚徒1、囚徒2都选择抵赖   囚徒1、囚徒2都坐1年else if(selectCooper == 1&&selectTit == 1){s1 = s2 = 1;}else{//囚徒1、囚徒2都选择认罪   囚徒1、囚徒2都坐5年s1 = s2 = 5;}//坐牢年数之和score_1 += s1;score_2 += s2;totalScore = score_1 + score_2;System.out.println("本轮结束, 情况如下");System.out.println(cooperation.getName() + "需要坐牢年数" + s1 + ",总的坐牢年数:"+score_1);System.out.println(tit.getName() + "需要坐牢年数" + s2 + ",总的坐牢年数:"+score_2);System.out.println("两位囚徒总的坐牢年数:" + totalScore);System.out.println("======================================");}break;case 3://Tit For Tat和随机选择的结果System.out.println("你选择的是随机策略和Tit For Tat,10轮结果如下:");int []selectRanomResult = new int[11];for(int i = 0;i < 10;i++) {int selectRadom = random.select();int j = i;selectRanomResult[j] = selectRadom;//记录另一人的选择int selectTit;if(i == 0) {selectTit = tit.select(1);}else {System.out.println("上次随机选择的值是:" + selectRanomResult[j--]);selectTit = tit.select(selectRanomResult[j--]);}if(selectRadom == 1) {System.out.println(random.getName() + "选择了合作————抵赖");}else {System.out.println(cooperation.getName() + "选择了背叛————认罪");}if(selectTit == 1) {System.out.println(tit.getName() + "选择了合作————抵赖");}else {System.out.println(tit.getName() + "选择了背叛————认罪");}//本轮各囚徒坐牢年数int s1 = 0; int s2 = 0;System.out.println();//囚徒1选择认罪,囚徒2选择抵赖   囚徒1坐牢8年if(selectRadom == 1&&selectTit == 0){s1 = 8;}//囚徒1选择抵赖,囚徒2选择认罪   囚徒2坐牢8年else if(selectRadom == 0&&selectTit == 1){s2 = 8;}//囚徒1、囚徒2都选择抵赖   囚徒1、囚徒2都坐1年else if(selectRadom == 1&&selectTit == 1){s1 = s2 = 1;}else{//囚徒1、囚徒2都选择认罪   囚徒1、囚徒2都坐5年s1 = s2 = 5;}//坐牢年数之和score_1 += s1;score_2 += s2;totalScore = score_1 + score_2;System.out.println("本轮结束, 情况如下");System.out.println(random.getName() + "需要坐牢年数" + s1 + ",总的坐牢年数:"+score_1);System.out.println(tit.getName() + "需要坐牢年数" + s2 + ",总的坐牢年数:"+score_2);System.out.println("两位囚徒总的坐牢年数:" + totalScore);System.out.println("======================================");}break;default:break;}}

三、模拟实现:

在main函数中,实现了3钟模拟,
1、好人策略与随机策略:结果可想而知。不管好人怎么做,随机就是一直随机。真的是像极了爱情。
2、好人策略与Tit For Tat:一旦Tit For Tat明白了好人是真的好人,那就是“你浓,我也浓”。
3、随机策略与Tit For Tat策略:你不仁就别怪我不义。当然我Tit For Tat大人也不是无情,只要你肯悔改,商量的余地还是有的。

[算法·思想]囚徒困境中Tit For Tat策略为什么就是最好的,之JAVA代码模拟实现相关推荐

  1. 博弈论(1):囚徒困境中的博弈论

    囚徒困境(Prisoner's dilemma) 囚徒困境是博弈论的非零和博弈中具代表性的例子,反映个人最佳选择并非团体最佳选择. 经典的囚徒困境 1950年,由就职于兰德公司的梅里尔·弗拉德(Mer ...

  2. 模拟退火算法 java_转 | 模拟退火算法(SA)和迭代局部搜索(ILS)求解TSP的Java代码分享...

    以下文章来源于数据魔术师 ,作者周航 前言 大家好呀!我们你们好久不见的...咳咳,初次见面的小编! 之前重新整理了ILS的代码,有人留言问能不能提供java版. 正好最近在学启发式算法和java,为 ...

  3. 博弈论-囚徒困境与重复囚徒困境的启示

    博弈论-囚徒困境与重复囚徒困境的启示 "囚徒困境" 囚徒困境(prisoner's dilemma):讨论的是两个被捕的囚徒之间的一种博弈,它阐明了为什么"在合作对双方都 ...

  4. 做数据分析如何从囚徒困境到合作的进化

    小飞象·交流会 即使拿到一手烂牌,也要打出一串王炸.这是场无限游戏,努力成为牌桌上最后一名玩家. 内部交流│7期 做数据分析如何 从囚徒困境到合作的进化 data analysis ●●●● 分享人: ...

  5. matlab 重复博弈,博弈论-囚徒困境与重复囚徒困境的启示

    博弈论-囚徒困境与重复囚徒困境的启示 "囚徒困境"囚徒困境(prisoner's dilemma):讨论的是两个被捕的囚徒之间的一种博弈,它阐明了为什么"在合作对双方都有 ...

  6. 北大清华的状元之争:一个典型的囚徒困境

    北大清华的状元之争是一个典型的囚徒困境. 囚徒困境是社会合作面临的最大难题,它深刻揭示了个体理性和集体理性之间的矛盾和冲突:个体按照自身利益最大化的原则采取对自己最有利的占优战略,得到的却不一定是自己 ...

  7. “囚徒困境”与帕累托最优理论以及基于OpenAI的辅助--测试(3)

    "囚徒困境"与帕累托最优理论 1. "囚徒困境"的定义与理论起源 1.1 基本定义和起源 1.2 重复多次的"囚徒困境" 2. " ...

  8. 博弈论 纳什均衡 囚徒困境 智猪博弈

    项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 1.博弈论是什么 博弈论(game t ...

  9. 「囚徒困境」有哪些现实的例子?

    作者:Roland Xu 我写过一篇B2C电子商务的囚徒困境,或许可以用来作为一个现实的例子来回答上面的问题.因为有上下文的关系,所以我这里保留了全文.天猫淘宝电商卖家应该了解的囚徒困境"囚 ...

  10. 01博弈三要素和囚徒困境

    目录 引例1:攻城问题(诺曼底登陆模拟博弈) 问题 方案 结果 策略分析 囚徒困境与博弈三要素 博弈三要素 囚徒困境 问题 博弈格局 博弈分析 几个博弈论概念 博弈结果 价格大战和双赢对局 公共品供给 ...

最新文章

  1. 散布矩阵与相关系数的实践应用
  2. 【响应式Web前端设计】!important的用法及作用
  3. javascript写滑动图片
  4. 计算机文件共享访问无权限,WIN7访问共享文件无权限解决方法
  5. SpringBoot中@EventListener注解的使用
  6. 提取某一个镇的行政边界_接口测试:A04_HttpRunner通用_02_提取数据_02_regex方式
  7. 分享一个B端产品体验报告
  8. Spring3 报org.aopalliance.intercept.MethodInterceptor问题解决方法
  9. java中OOA,OOT, OOP, OOD, OOSM,OOM英文表示的含义是什么?
  10. 与时俱进的治疗策略不断提高RA无药缓解机会[EULAR2015_SAT0058]
  11. 人物 | 当我们在谈论语音识别时,我们在谈些什么?——知乎达人、CMU博士生王赟...
  12. java list get 引用_java 关于List 对象的引用一个问题
  13. spring jdbcTemplate中获取jdbc Connection并执行操作
  14. ios中UIView和CALayer关系
  15. 为什么每个人都有发旋?
  16. 什么是cmm3规范?什么是CMMI5 呢?
  17. python学习第十弹:宝可梦数据分析-平民最强
  18. 传奇世界手游公益服【剑指轩辕2】服务端搭建源码使用指南
  19. C++面向对象(1):防卫式声明
  20. 一帆基金投资报告:下周初股指将选择方向

热门文章

  1. c语言程序设计行李管理系统,行李全流程管控C位登场,让你Cue到行李人的努力了嘛?...
  2. SIM800C实现GPRS上网的AT指令
  3. uva10066-双塔
  4. 计算机网络图标打不开怎么回事,双击打不开图标怎么办 双击打不开图标解决方法【详解】...
  5. 研究鸟类迁徙的目的和意义
  6. 【100+ python基础入门-32】元组元素的增删改查操作方法总结
  7. 【李守聪原创】攻坚克难,梦在远方
  8. Java 实现 百度地图
  9. 破解jQuery插件收费、下载币(单页扒站小工具)
  10. 忍之の爱你术 全代码