【两方演化博弈代码复现】:双方演化博弈的原理、概率博弈仿真、相位图、单个参数灵敏度演化

news2024/11/13 11:45:35

目录-基于MatLab2016b实现

  • 一、演化博弈的原理
    • 1. 基本概念
    • 2. 参与者的策略
    • 3.演化过程
  • 二、MATLAB 代码解读(博弈参与主体(双方)策略选择的动态演化讨程)
  • 三、MATLAB 代码解读(博弈主体随着时间策略选择的动态演化讨程)
  • 四、两方相位图MATLAB 代码复现
  • 五、单一参数灵敏度演化图
  • 五、结论

演化博弈论是研究个体在特定环境中如何通过策略选择与其他个体进行互动的学科。这一理论在生物学、经济学和社会科学等多个领域都有广泛应用。本文将深入探讨双方演化博弈的原理及其过程,并解读一段 MATLAB 代码,展示如何模拟这一过程。

一、演化博弈的原理

1. 基本概念

在演化博弈中,参与者(个体)根据其策略与其他参与者进行互动。每种策略在特定环境下的收益决定了这种策略的成功与否。参与者的策略会随着环境的变化而演变,形成“适者生存”的动态过程。

2. 参与者的策略

在一场博弈中,参与者可以选择不同的策略,这些策略的选择影响其在博弈中的收益。例如,在两个玩家的博弈中,常见的策略包括合作与背叛。通过不断的互动与反馈,成功的策略会在种群中逐渐传播。

3.演化过程

演化过程通常可分为以下几个步骤:

初始化:设定参与者的初始状态(策略)。
动态演化:根据参与者策略的收益变化,更新策略选择。
模拟和可视化:使用数学模型和计算机程序模拟演化过程,并通过图形化方式展示结果。

二、MATLAB 代码解读(博弈参与主体(双方)策略选择的动态演化讨程)

以下是用于模拟双方演化博弈的 MATLAB 代码示例:
下面这样的图就是x,y分别为不同参与主体的博弈行为策略概率

在这里插入图片描述
下面为复制动态方程函数,需要改成自己的复制动态方程。
注意下面这个代码要单独为一个文件,然后文件的名字,必须和函数的名字一样,比如下面的函数叫dxdt,那么文件名也必须要这个名字

x(1)表示主体1的概率,x(2)表示为主体2的概率,只能这样顺序的表示

所有的演化代码,都需要以这个文件为基础。

function dxdt = taihu(t, x, s, m, c1, c2, r)
    dxdt = zeros(2, 1);  % 初始化一个二元一次的输出
    dxdt(1) = x(1) * (1 - x(1)) * (r - m - r * x(2));  % x(1) 的变化率
    dxdt(2) = x(2) * (1 - x(2)) * (s - c1 + c2 - c2 * x(1));  % x(2) 的变化率
end

在设置出来动态方程文件后,再创建一个演化文件,为main文件,这个文件命名没有要求

但是[t, x] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0, 10], [0.2, 0.8]);中taihu表示的是之前设置的复制动态方程的文件,需要和文件名称一致。

clc; clear;

s = 10; m = 5; c1 = 20; c2 = 5; r = 10;  % 根据实际情况赋值

figure(1)  % 创建图形窗口

% 不同初始条件的演化
[t, x] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0, 10], [0.2, 0.8]);
plot(x(:, 1), x(:, 2), 'rh-');  % 绘制初始值[0.2, 0.8]的演化路径
hold on

[t, x] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0, 10], [0.4, 0.6]);
plot(x(:, 1), x(:, 2), 'mx-');  % 绘制初始值[0.4, 0.6]的演化路径
hold on

[t, x] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0, 10], [0.6, 0.4]);
plot(x(:, 1), x(:, 2), 'bo-');  % 绘制初始值[0.6, 0.4]的演化路径
hold on

[t, x] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0, 10], [0.8, 0.2]);
plot(x(:, 1), x(:, 2), 'gs-');  % 绘制初始值[0.8, 0.2]的演化路径
hold on

set(gca, 'XTick', [0:0.1:1], 'YTick', [0:0.1:1]);  % 设置坐标轴刻度
axis([0 1 0 1]);  % 设置坐标轴范围
xlabel('$x$', 'interpreter', 'latex');  % x 轴标签
ylabel('$y$', 'interpreter', 'latex', 'rotation', 360);  % y 轴标签
title('动态演化过程');  % 图形标题
legend('初始值[0.2,0.8]', '初始值[0.4,0.6]', '初始值[0.6,0.4]', '初始值[0.8,0.2]');  % 图例

在这里插入图片描述

代码过程分析
函数定义:
taihu 函数定义了两种策略(x(1) 和 x(2))的动态变化率。此函数输入时间 t 和状态 x,以及相关参数 s、m、c1、c2 和 r,并返回 dxdt。

参数设置:
根据实际情况设置参数 s、m、c1、c2 和 r。
使用 ode45 求解:
ode45 是 MATLAB 用于求解常微分方程的函数。在此代码中,使用不同的初始条件 [0.2, 0.8]、[0.4, 0.6]、[0.6, 0.4] 和 [0.8, 0.2] 来模拟演化过程。

绘制演化路径:
使用 plot 函数将每个初始条件下的演化路径绘制在同一图中,便于比较不同策略的动态变化。

图形设置:
设置坐标轴的刻度、范围、标签和标题,并添加图例,以便于理解和分析。

三、MATLAB 代码解读(博弈主体随着时间策略选择的动态演化讨程)

横轴为时间,演化的时间
纵轴为策略的选择概率
在这里插入图片描述

以下是代码进行复现的完整 MATLAB 代码:

clc; clear;  % 清除命令窗口和工作区变量
s = 10; m = 5; c1 = 20; c2 = 5; r = 10;  % 根据实际情况赋值
figure(1)  % 创建图形窗口

%%%%%%%%%% line1
[t, x] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0, 10], [0.2, 0.8]);  % 求解微分方程
plot(t, x(:, 1), '*');  % 绘制与 x1 相关的图形
hold on;  % 保持当前图形

%%%%%%%%%% line2
[t, x] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0, 10], [0.4, 0.6]);  % 求解微分方程
plot(t, x(:, 2), '*');  % 绘制与 x2 相关的图形
hold on;  % 保持当前图形

set(gca, 'XTick', 1:1:10, 'YTick', [0:0.1:1]);  % 设置坐标轴刻度
axis([0 10 0 1]);  % 设置坐标轴范围
xlabel('时间', 'interpreter', 'latex');  % x 轴标签
ylabel('策略值', 'interpreter', 'latex', 'rotation', 360);  % y 轴标签
title('动态演化过程');  % 图形标题
legend('策略 x_1', '策略 x_2');  % 图例

其中两个演化图形的关键区别在于:
在这里插入图片描述

代码解析

s = 10; m = 5; c1 = 20; c2 = 5; r = 10; % 根据实际情况赋值
这些变量代表模型中的参数,具体含义取决于所研究的博弈模型。

创建图形窗口:
figure(1) % 创建图形窗口

求解微分方程:
[t, x] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0, 10], [0.2, 0.8]); % 求解微分方程
使用 ode45 函数求解常微分方程,taihu 函数定义了模型的动态。
初始条件为 [0.2, 0.8]。

绘制与 x1 相关的图形:
plot(t, x(:, 1), ‘*’); % 绘制与 x1 相关的图形
hold on; % 保持当前图形

再次求解微分方程:

[t, x] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0, 10], [0.4, 0.6]); % 求解微分方程
plot(t, x(:, 2), ‘*’); % 绘制与 x2 相关的图形
hold on; % 保持当前图形

设置坐标轴:
set(gca, ‘XTick’, 1:1:10, ‘YTick’, [0:0.1:1]); % 设置坐标轴刻度
axis([0 10 0 1]); % 设置坐标轴范围
gca 是获取当前坐标轴的句柄,XTick 和 YTick 设置坐标轴的刻度。

添加标签和标题:
xlabel(‘时间’, ‘interpreter’, ‘latex’); % x 轴标签
ylabel(‘策略值’, ‘interpreter’, ‘latex’, ‘rotation’, 360); % y 轴标签
title(‘动态演化过程’); % 图形标题
legend(‘策略 x_1’, ‘策略 x_2’); % 图例

结果如下所示:
在这里插入图片描述

四、两方相位图MATLAB 代码复现

clc; clear; % 清除命令窗口和工作空间
s = 10; m = 5; c1 = 20; c2 = 5; r = 10; % 初始化参数

% 外层循环
for i = 0:0.1:1
    % 内层循环
    for j = 0:0.1:1
        [T, Y] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0 100], [i j]); % 求解微分方程
        figure(1); % 创建或激活图形窗口
        grid on; % 打开网格
        plot(Y(:, 1), Y(:, 2)); % 绘制 Y 的第一列和第二列
        hold on; % 保持当前图形
    end
end

% 设置坐标轴刻度
set(gca, 'XTick', [0:0.1:1], 'YTick', [0:0.1:1]);
xlabel('X'); % x 轴标签
ylabel('Y'); % y 轴标签

代码说明
初始化:
clc; clear; 清除命令窗口和工作空间。
定义一些参数 s, m, c1, c2, r。

双重循环:
外层循环遍历 i 从 0 到 1,以 0.1 为步长。
内层循环遍历 j 从 0 到 1,以 0.1 为步长。

ODE 求解:
使用 ode45 函数求解微分方程,调用自定义的 taihu 函数,时间范围为 [0 100],初始条件为 [i j]。

绘图:
在每次迭代中,创建或激活图形窗口,并绘制 Y 的第一列与第二列的关系。
hold on; 确保所有绘图在同一图形上显示。

设置坐标轴:
使用 set(gca, ‘XTick’, …) 和 ylabel, xlabel 函数设置坐标轴刻度和标签。

注意事项
确保 taihu 函数已定义,并且其输入参数与代码中的一致。
运行此代码需要 MATLAB 环境

在这里插入图片描述

发现有空白原点还不是从0开始,修改以下代码:

clc; clear; % 清除命令窗口和工作空间
s = 10; m = 5; c1 = 20; c2 = 5; r = 10; % 初始化参数

% 外层循环
for i = 0:0.1:1
    % 内层循环
    for j = 0:0.1:1
        [T, Y] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0 100], [i j]); % 求解微分方程
        figure(1); % 创建或激活图形窗口
        grid on; % 打开网格
        plot(Y(:, 1), Y(:, 2)); % 绘制 Y 的第一列和第二列
        hold on; % 保持当前图形
    end
end

% 设置坐标轴刻度
set(gca, 'XTick', 0:0.1:1, 'YTick', 0:0.1:1);
xlabel('X'); % x 轴标签
ylabel('Y'); % y 轴标签

% 设置坐标轴范围,确保原点重合
axis([0 1 0 1]); % 设置坐标轴范围
set(gca, 'Box', 'on'); % 开启坐标轴框

在这里插入图片描述
嗯嗯,这样就可以了

五、单一参数灵敏度演化图

先设置出来,不改变的参数(s;m;c1;c2),
然后单独设置改变的参数(r);
用for循环进入函数;

%% 改变单一参数演化过程图

% 主脚本
clc; clear; % 清除命令窗口和工作空间
s = 10; m = 5; c1 = 20; c2 = 5; % 初始化参数

figure(1); % 创建图形窗口

%%%%%% line1
for r = 10 % 循环参数 r
    [t, x] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0, 10], [0.2, 0.8]); % 初始条件应为两个元素
    plot(t, x(:, 1), '*'); % 绘制 t 与 x1 的图像
    hold on; % 保持当前图形
end

%%%%%% line2
for r = 20 % 循环参数 r
    [t, x] = ode45(@(t, x) taihu(t, x, s, m, c1, c2, r), [0, 10], [0.2, 0.8]); % 初始条件应为两个元素
    plot(t, x(:, 2), 'o'); % 绘制 t 与 x2 的图像
    hold on; % 保持当前图形
end

% 设置坐标轴刻度
% 设置坐标轴刻度
set(gca, 'XTick', 0:1:10, 'YTick', 0:0.1:1); % 设置 X 和 Y 轴的刻度
axis([0 10 0 1]); % 设置坐标轴范围

% 设置 X 轴标签
xlabel('时间', 'Interpreter', 'latex', 'FontWeight', 'bold', 'Fontname', '宋体');
% 设置 Y 轴标签
ylabel('状态变量', 'Interpreter', 'latex', 'Rotation', 360, 'FontWeight', 'bold', 'Fontname', '宋体');
% 设置图形标题
title('动态演化过程', 'Fontweight', 'bold', 'Fontname', '宋体');
% 设置图例
legend('r=10', 'r=20');

在这里插入图片描述

这里好像有点问题,和上面的图差不多,代码逻辑应该的没错的,后期还需要再看看,

五、结论

演化博弈论为我们提供了一种分析个体策略选择与环境互动的方法。通过 MATLAB 的编程实现,我们可以模拟并可视化这一复杂的动态过程。希望本文能够帮助您理解双方演化博弈的基本原理与实现方法,欢迎您在实践中进一步探索和应用这一理论!

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

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

相关文章

若依nday复现

前言 声明:此文章仅做学习,未经授权严禁转载。请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者无关 本文章只做简单汇总,在此感谢其他师傅的文章和分享 前置准备 环境搭建 下载:https:/…

访谈心脑血管名医黄力医生:医术精湛,心系患者

黄力医生,一位在心脑血管领域深耕多年的杰出医者,其医学之路同样始于对国内顶尖医学院校的刻苦钻研。在那里,她不仅打下了坚实的医学理论基础,更培养了对医学事业的无限热爱与崇高追求。毕业后,黄力医生毅然选择了心脑…

django-prometheus使用及源码分析

简介 在django服务运行过程中,希望可以对其获取promethues指标进行监控,这样可以实时知道其运行状态,当它运行异常时可以及时进行告警,并且帮助我们可以对其针对性进行优化。比如请求量过大是否要进行限流或者扩容,再…

【黄力医生】血栓隐患大排查:七类人群如何自我监测静脉血栓风险

血栓,这一看似无声无息的健康杀手,实则潜藏着巨大的风险。静脉血栓作为血栓的一种常见类型,其形成与多种因素密切相关,并可能引发严重的并发症,如肺栓塞等。黄力医生指出,有七类人群特别需要关注自身静脉血…

2024/9/16 dataloader、tensorboard、transform

一、pytorch两大法宝元素 假设有一个名为pytorch的包 dir():用于打开包,看里面的内容 help():用于查看具体的内容的用处 二、python文件,python控制台和jupyter的使用对比 三、pytorch读取数据 pytorch读取数据主要涉及到两个类&#xff1…

Redis——常用数据类型hash

目录 hash常用命令hsethgethdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhdecrby 哈希的编码方式哈希的应用 hash 常用命令 hset HSET key field value [field value ...]//时间复杂度O(1) //返回值:设置成功的键值对的个数hget HGET key field//hdel HDEL key…

数据结构——树(终极版)

树的基本概念: 树的顶部是根节点也是树的入口 父节点:例如:B是F的父节点 子节点:树中的每个节点都可以有0个或多个子节点 叶子节点:像KLFGMIJ这种没有子节点的节点 节点的度:节点的子节点数&#xff1…

新160个crackme - 059-Dope2112.1

运行分析 输入Name和Serial,点击Registrieren按钮,显示疑似错误提示 百度翻译查看一下,发现是德语 PE分析 Delphi程序,32位,无壳 静态分析&动态调试 ida字符串发现正确提示,双击跟进 来到关键函数&…

现在量化中普遍使用QMT和PTrade?哪家可以同时提供QMT/PTrade?

QMT的特点 全面的功能集成: QMT集成了行情显示、策略研究、交易执行和风控管理于一体,为投资者提供了一站式的量化交易解决方案。 高效的交易执行能力: 通过全内存交易实现低延迟的交易执行,单笔延时小于1ms,确保了交易…

秒懂C++之智能指针

目录 前言 智能指针的使用及原理 RAII RAII弊端 std::auto_ptr std::unique_ptr std::shared_ptr shared_ptr弊端 std::weak_ptr 扩展(删除器) 前言 为了解决抛异常所造成的内存泄漏等问题~秒懂C之异常-CSDN博客~我们来学习智能指针的相关用法…

【图像匹配】基于SIFT算法的图像匹配,matlab实现

博主简介:matlab图像代码项目合作(扣扣:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于基于SIFT算法的图像匹配,用matlab实现。 一、案例背景和算法介绍 本…

【MySQL】MySQL中JDBC编程——MySQL驱动包安装——(超详解)

前言: 🌟🌟本期讲解Java中JDBC编程,希望能帮到屏幕前的你。 🌈上期博客在这里:【MySQL】MySQL索引与事务的透析——(超详解)-CSDN博客 🌈感兴趣的小伙伴看一看小编主页&a…

【Linux】初识信号与信号产生

目录 一、认识信号 1 .什么是信号 2 .哪些情况会产生信号 3 . 查看信号 4 . 信号处理 二、产生信号 1 .通过终端按键产生信号 2 .调用系统函数向进程发信号 3 . 由软件条件产生信号 4 . 由硬件异常产生信号 一、认识信号 1 .什么是信号 你在网上买了很多件商品,再…

技术上,如何复现 o1?

知乎:周舒畅链接:https://zhuanlan.zhihu.com/p/720127190 基础模型 搞 o1 首先需要一个基模,这个基模必须是: 能进行“长”生成。注意这和“长 context”不是一回事。模型生成的结果,经常会有自激的噪声存在&#xf…

Unity多国语言支持

Unity多国语言支持 项目在我的课程 ”淘金城堡“ 中应用 项目的地址:http://t.csdnimg.cn/m0hFd 一、基本概念 在Unity中加入多国语言的支持可以让我们发布的游戏或应用上线在拥有不同语言的国家或地区。 下面介绍一款Unity官方提供的插件“Localization package…

USB中的传输和事务

文章目录 一、USB中的四种事务1. **控制事务(Control Transaction)**2. **批量事务(Bulk Transaction)**3. **中断事务(Interrupt Transaction)**4. **等时事务(Isochronous Transaction&#x…

C++第五十弹---类型转换全解析:从静态到动态,一网打尽

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1. C语言中的类型转换 2. 为什么C需要四种类型转换 2.1、内置类型 -> 自定义类型 2.2、自定义类型 -> 内置类型 2.3、自定义类型 -&…

Suno新上线Covers翻唱新 - 实现音频风格任意转换

历史文章 Suno AI如何解决中文多音字的问题?耗费500积分,亲测有效 ,V4版本会不会直接支持呢? 上传音频,打造贴合您喜好的风格歌曲创作,这一波新玩法我打8分 Suno AI Noisee AI 做抖音冥想账号实操 音乐…

网络安全-利用 Apache Mod CGI

一、环境 蚁剑官网拉取 二、开始操作 蚁剑连接 一样终端命令不能执行 可以看到putenv已经禁用 我们开始一下,跳入一个新终端且可以执行命令 我们具体看一下干了什么事情 上传了一个htaccess这个文件的作用是让以后所有ant文件都以cgi去执行 三、总结 cgi文件可以…

【C++】C++的多态

目录 多态的使用 多态的概念 多态的定义和实现 虚函数 构成多态的条件 特殊情况:协变 析构函数的重写 怎么实现 为什么实现 override和final关键字 override final 重载/重写/隐藏的对比 纯虚函数和抽象类 纯虚函数 抽象类 多态的实现 虚函数表指针…