不同博弈情景下策略选择的最优化探索

一:鹰鸽博弈

鹰鸽博弈是博弈论中的一个经典模型,以下是对鹰鸽博弈的具体介绍:

基本策略和行为模式

鹰策略:代表着激进、好斗、具有攻击性的行为方式。在博弈中,选择鹰策略的个体在面对竞争或冲突时会全力以赴、坚决斗争,不轻易退缩,直到取得胜利或者给对手造成重大伤害。这种策略往往需要付出较高的成本,比如在战斗中可能会受伤,但如果获胜,就能获得较高的收益。

鸽策略:象征着温和、妥协、非攻击性的行为方式。选择鸽策略的个体在遇到竞争或冲突时,通常会选择避免正面冲突,以和平的方式解决问题,或者选择退让、分享资源。鸽策略的成本相对较低,因为可以避免激烈的战斗和受伤的风险,但获得的收益也相对较少。

收益情况

当两只鹰相遇时,它们会进行激烈的战斗,由于战斗会带来两败俱伤的结果,所以双方的收益都是负的(比如假定为 - 2)。

当两只鸽子相遇时,它们会共同分享资源,各自获得一定的收益(比如假定为 1)。

当鹰和鸽子相遇时,鸽子会逃走,鹰将独自获得全部资源,鹰的收益较高(比如假定为 2)。

在这个博弈中,玩家可以选择扮演鹰(攻击型)或鸽(和平型)。鹰会争夺资源,但可能受伤;鸽则避免战斗,但可能无法获得资源。

import numpy as np# 博弈矩阵
payoff_matrix = np.array([[-2, 2], [1, 1]])# 策略选择函数
def choose_strategy(payoff_matrix, strategy):if strategy == "hawk":return np.argmax(payoff_matrix[0])elif strategy == "dove":return np.argmax(payoff_matrix[1])# 模拟博弈
strategy1 = "hawk"
strategy2 = "dove"
result1 = choose_strategy(payoff_matrix, strategy1)
result2 = choose_strategy(payoff_matrix, strategy2)print(f"玩家1选择:{strategy1}, 玩家2选择:{strategy2}")
print(f"玩家1的收益:{payoff_matrix[0][result2]}, 玩家2的收益:{payoff_matrix[1][result1]}")

以下是对代码的详细解释:

1:定义博弈矩阵

import numpy as np
payoff_matrix = np.array([[-2, 2], [1, 1]])

这里创建了一个新的二维 numpy 数组作为博弈矩阵。

  • 矩阵的第一行 [-2, 2] 代表当玩家 1 选择鹰策略(hawk)时,分别对应玩家 2 选择鹰策略和鸽策略(dove)时玩家 1 的收益。即两只鹰相遇时玩家 1 收益为 -2,鹰和鸽子相遇时玩家 1 收益为 2
  • 矩阵的第二行 [1, 1] 代表当玩家 1 选择鸽策略时,分别对应玩家 2 选择鹰策略和鸽策略时玩家 1 的收益。即鸽子和鹰相遇时玩家 1 收益为 1,两只鸽子相遇时玩家 1 收益也为 1

2:定义策略选择函数

def choose_strategy(payoff_matrix, strategy):if strategy == "hawk":return np.argmax(payoff_matrix[0])elif strategy == "dove":return np.argmax(payoff_matrix[1])

这个函数用于根据给定的策略和博弈矩阵,确定该策略下的最优行动(即对应收益最大的列)。

  • 如果传入的策略是 "hawk",则在博弈矩阵的第一行中找到收益最大的列索引并返回。这是因为第一行代表玩家选择鹰策略时在不同对手策略下的收益。
  • 如果传入的策略是 "dove",则在博弈矩阵的第二行中找到收益最大的列索引并返回。第二行代表玩家选择鸽策略时在不同对手策略下的收益。

3:模拟博弈

strategy1 = "hawk"
strategy2 = "dove"
result1 = choose_strategy(payoff_matrix, strategy1)
result2 = choose_strategy(payoff_matrix, strategy2)

这里模拟了一次博弈过程。

  • 首先定义两个策略变量 strategy1 和 strategy2,分别表示玩家 1 和玩家 2 的策略,这里玩家 1 选择鹰策略,玩家 2 选择鸽策略。
  • 然后调用 choose_strategy 函数,根据玩家 1 的策略和博弈矩阵确定玩家 1 在该策略下的最优行动,并将结果存储在 result1 中。同样,对玩家 2 进行相同操作,结果存储在 result2 中。
print(f"玩家1选择:{strategy1}, 玩家2选择:{strategy2}")
print(f"玩家1的收益:{payoff_matrix[0][result2]}, 玩家2的收益:{payoff_matrix[1][result1]}")

最后,打印出玩家 1 和玩家 2 的选择以及各自的收益。

  • payoff_matrix[0][result2] 表示玩家 1(鹰策略)在玩家 2 的行动(由 result2 确定)下的收益。
  • payoff_matrix[1][result1] 表示玩家 2(鸽策略)在玩家 1 的行动(由 result1 确定)下的收益。

结果如下:

可以看出在玩家均理性的假设的情况下,鸽策略收益较鹰策略收益更高。

也可以依照这个过程重复博弈过程进行模拟。

二:骑士博弈

在这个博弈中,玩家分为骑士和盗贼两个阵营。骑士的目标是抓住盗贼,而盗贼的目标是避开骑士。接下来的这段代码模拟了一个骑士抓盗贼的博弈场景。骑士和盗贼在一个二维的坐标空间中活动:

import random# 骑士和盗贼的位置
knight_position = [0, 0]
robber_position = [random.randint(0, 10), random.randint(0, 10)]# 骑士移动函数
def move_knight(knight_position, robber_position):dx = robber_position[0] - knight_position[0]dy = robber_position[1] - knight_position[1]if abs(dx) > abs(dy):knight_position[0] += 1 if dx > 0 else -1else:knight_position[1] += 1 if dy > 0 else -1return knight_position# 盗贼移动函数
def move_robber(robber_position):robber_position[0] += random.choice([-1, 0, 1])robber_position[1] += random.choice([-1, 0, 1])return robber_position# 模拟博弈
for _ in range(10):knight_position = move_knight(knight_position, robber_position)robber_position = move_robber(robber_position)if knight_position == robber_position:print("骑士抓住了盗贼!")breakprint(f"骑士位置:{knight_position}, 盗贼位置:{robber_position}")

结果如下:

具体元素和行为解释:

1:骑士和盗贼的位置初始化

knight_position = [0, 0]:骑士初始位置在坐标原点。

robber_position = [random.randint(0, 10), random.randint(0, 10)]:盗贼的初始位置在一个 10x10 的二维空间中随机生成。

2:骑士的移动策略

骑士总是朝着盗贼的方向移动。

在 move_knight 函数中,通过计算骑士与盗贼在 x 和 y 方向上的距离差(dx 和 dy)来决定移动方向。

如果 x 方向上的距离差绝对值大于 y 方向上的距离差绝对值,骑士会在 x 方向上移动一步(如果盗贼在骑士右边,即 dx > 0,则向右移动一步,即 knight_position[0] += 1,否则向左移动一步)。

如果 y 方向上的距离差绝对值更大,骑士会在 y 方向上移动一步,同样根据盗贼的相对位置决定向上(dy > 0时)还是向下移动。

3:盗贼的移动策略

在 move_robber 函数中,盗贼随机地在 x 和 y 方向上移动一步、原地不动或向反方向移动一步。具体通过随机选择 -101 来分别对应向负方向移动、原地不动和向正方向移动,并更新盗贼的位置。

4:模拟博弈过程

通过一个循环进行模拟,循环次数为 10 次。在每次循环中,骑士和盗贼分别移动。检查骑士和盗贼的位置是否相同,如果相同,则表示骑士抓住了盗贼,打印相应信息并退出循环。如果在 10 次循环内骑士没有抓住盗贼,则循环结束后程序也会停止,没有其他输出结果。

三:石头剪刀布

石头剪刀布博弈介绍

这是一个简单的双人博弈游戏,双方各自从石头、剪刀、布三种选项中选择一种。石头胜剪刀,剪刀胜布,布胜石头。接下来将实现一个简单的“石头、剪刀、布”游戏模拟,并通过多次模拟来统计玩家1、玩家2的胜利次数以及平局的次数,最终探究玩家1胜,玩家2胜和平局各自的概率分布。

import random
import matplotlib.pyplot as plt
import numpy as np# 定义可能的选择
choices = ['石头', '剪刀', '布']# 判断胜负的函数
def determine_winner(player1_choice, player2_choice):if player1_choice == player2_choice:return "平局"elif (player1_choice == '石头' and player2_choice == '剪刀') or (player1_choice == '剪刀' and player2_choice == '布') or (player1_choice == '布' and player2_choice == '石头'):return "玩家1胜"else:return "玩家2胜"# 模拟一次游戏
def play_game():player1_choice = random.choice(choices)player2_choice = random.choice(choices)result = determine_winner(player1_choice, player2_choice)return player1_choice, player2_choice, result# 进行多次游戏并统计结果
num_games = 10000  # 增加游戏次数以提高统计的准确性
player1_wins = 0
player2_wins = 0
draws = 0
results = []for _ in range(num_games):choice1, choice2, outcome = play_game()results.append(outcome)if outcome == "玩家1胜":player1_wins += 1elif outcome == "玩家2胜":player2_wins += 1else:draws += 1# 可视化结果
labels = '玩家1胜', '玩家2胜', '平局'
sizes = [player1_wins, player2_wins, draws]
colors = ['gold', 'lightcoral', 'lightskyblue']plt.figure(figsize=(8, 8))
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=140)
plt.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.plt.show()

可视化图表如下:

通过进行10000次游戏的可视化结果,我们可以看到:

  • 玩家1胜利的比例约为33.3%
  • 玩家2胜利的比例约为33.2%
  • 平局的比例约为33.5%

这些数据显示,在这个石头剪刀布的游戏中,玩家1胜、玩家2胜和平局的概率非常接近,几乎相同。这符合我们的预期,因为在理想情况下,石头剪刀布是一个完全随机的游戏,每个结果(胜、负、平)出现的概率应该是相等的。

想要探索更多元化的数据分析视角,可以关注之前发布的相关内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1535526.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

“树”据结构:并查集从入门到AC

“树”据结构:并查集 前言算法设计代码示例优化相关文章 前言 在一组数据中,数据被分为了不同的集合,那么其中的集合往往可以用树形来表示。而区分集合,与查找集合的元素,就会成为核心的问题。并查集主要就是解决这类…

2024_中秋国庆双节来临 祝CSDN所有开发者与网站节日快乐

亲爱的CSDN朋友们: 在这个金风送爽、丹桂飘香的美好时节,我们迎来了一年一度的中秋佳节。明月高悬,洒下银辉,照亮了我们心中的思念与祝福。 中秋,是团圆的象征。无论你此刻身在何处,心中那份对家的眷恋、对…

0基础带你入门Linux之简介

1.Linux和Windows对比 Window很明显的特征就是有C盘、D盘登各种磁盘 我们通过点击不同的盘符,点击里面存储的文件进行查阅的操作 而Linux则很简单,只有一个根目录,也可以说只有一个盘,整个系统所有的东西都是在根目录下的 我们可…

redis基本数据结构-set

文章目录 1. set的基本介绍1.1. set底层结构之hash表的简单介绍1.2. 常用命令 2. 常见的业务场景2.1. 标签系统2.2. 社交网络好友关系 1. set的基本介绍 参考链接:https://mp.weixin.qq.com/s/srkd73bS2n3mjIADLVg72A redis 的 set 数据结构是一个无序的集合&#…

暴雨传染病智能监测预警前置一体机筑牢疾控第一道防线

自新冠疫情爆发以来,疾病防控已成为全球关注的焦点。只有加强监测预警、做到“早发现”才能及时防范和化解传染病疫情。近日,经国务院批准,国家疾控局、国家卫生健康委等九部门联合发布了《关于建立健全智慧化多点触发传染病监测预警体系的指…

信息安全数学基础(12)剩余类及完全剩余系

一、剩余类 定义:设 m 是一个正整数,a 是任意整数。模 m 的 a 的剩余类定义为集合 Ca​{c∣c∈Z,c≡a(modm)}。这个集合包含了所有模 m 余数为 a 的整数。 解释:剩余类实际上是将整数集 Z 分成了 m 个等价类,每个类中的元素在模 m…

大公司与小公司:产品经理的职业抉择与发展之路

在产品经理的职业旅程中,常常面临一个重要的抉择:是选择大公司还是小公司?这个问题困扰着许多初入职场的新人以及寻求职业转型的资深人士。今天,我们就来深入探讨一下大公司与小公司对于产品经理的不同意义,以及如何规…

互相关、相关系数和内积的关系

目录 问题互相关与卷积xcorr互相关xcorr2 2-D cross-correlationconv卷积conv2二维卷积关系与区别xcov互协方差 相关系数cov协方差与协方差矩阵corrcoef相关系数与相关系数矩阵图像均值、标准差和相关系数 内积与相似系数内积(Inner Product)欧几里得空间…

AUTOSAR_EXP_ARAComAPI的5章笔记(6)

返回目录 5.3.5.5 Event-Driven vs Polling-Based access ara::com实现完全支持事件驱动和轮询的方式来访问新数据。 对于轮询方式,典型的用例是,一个应用程序被周期性地触发并在特定的截止时间前进行一些处理。这是调节器/控制算法的典型模式 —— 循…

Visual Studio安装教程

这次我给大家讲一下Visual Studio安装 一、官网下载 官网下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ 下载下来的是一个.exe文件 双击打开,出现下面的界面 二、安装visual studio (一)更改安装路径 首先&am…

如何提升RAG检索的准确率及答案的完整性?

RAG(检索增强生成),重点在于检索,即通过解析文档,然后使用嵌入模型进行向量化,通过欧式距离、向量积乘、最近临等算法来计算向量的相似度,找到与提问语义相似的上下文。然后通过将上下文提交给大…

【LeetCode】每日一题 2024_9_15 与车相交的点(差分)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 今天的题目曾经的我做过了 . . . 又是复习的一天 题目:与车相交的点 代码与解题思路 func numberOfPoints(nums [][]int) (ans int) { diff : [102]int{}for _, p : range nums {diff[p[0]]d…

基于java网吧管理系统设计与实现

博主介绍:专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…

c++基础入门二

C基础入门(二) 一、函数重载 在自然语言中,一句话或者一个词有不同的意思。例如:国乒和别人比赛是“谁也赢不了”,而国足和别人比赛是“谁也赢不了” 函数重载:是函数的一种特殊情况,C允许在同一作用域中声明几个功…

开放系统,面向各类业务需求可提供定制化服务的智慧物流开源了。

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。构建基于Ai技术的…

c++中的二叉搜索树

一概念: 静图展示: 动图展示: ①左子树不为空,则左子树节点值小于根节点值。 ②右子树不为空,则右子树节点值大于根节点值。 ③左右子树均为二叉搜索树。 ④对于它可以插入相等的也可以插入不相等的,这里如果插入的…

JavaSE语法阶段复习知识整理3之封装

文章目录 一、封装1.1 封装的概念1.2 访问限定符1.3封装扩展之包 二、static成员2.1static关键字的引入2.2静态成员变量初始化2.3访问静态成员变量2.4用实际问题加深静态成员变量的理解2.5静态成员变量的总结要点2.6静态成员方法的总结要点 三、代码块3.1普通代码块3.2构造代码…

QXDM 如何更新软件?

如何更新QXDM等高通软件?之前做过这个事情,但过几个月给别人讲的时候就忘记了,特做如下记录。 一. 背景知识: 1. QXDM 依赖于Qualcomm package Managers 3(QPM in short)。 目前的时间是2024年9月15日,但不知从何…

学习笔记JVM篇(一)

1、类加载的过程 加载->验证->准备->解析->初始化->使用->卸载 2、JVM内存组成部分(HotSpot) 名称作用特点元空间(JDK8之前在方法区)用于存储类的元数信息,例如名称、方法名、字段等;…

[苍穹外卖]-09Spring Task定时任务

Spring Task spring Task是spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑 只要是需要定时处理的场景都可以使用Spring Task定时任务框架 cron表达式就是一个字符串,可以定义任务触发的时间 构成规则: 分为6或7个域, 由空格隔开,每个域代表一个含义每…