当前位置: 首页 > news >正文

用Streamlit构建的四方演化博弈分析

1. 项目概述

基于四方演化博弈理论的交互式分析平台,专门研究政府-企业-商家-消费者在外卖包装废弃物回收治理中的策略互动关系。

2. 核心架构解析

2.1 字体与可视化配置

def setup_chinese_font():"""彻底解决中文字符显示问题的创新方法"""
  • 系统级字体探测:自动扫描系统中所有可用中文字体

  • 优先级匹配机制:按照SimHei→Microsoft YaHei→SimSun的顺序选择

  • 多层级字体回退:确保在任何系统环境下都能正常显示中文

2.2 四方演化博弈模型核心类

class AdvancedFourPartyEvolutionaryGame:def __init__(self):self.params = {# 四类关键参数:环境效益、成本、补贴、罚金'E1': 6.0, 'E2': 3.0, 'E3': 2.0, 'E4': 1.0,  # 环境效益'Cg1': 2.0, 'Ct1': 3.0, 'Cm1': 2.0, 'Cc1': 1.0,  # 成本参数'St': 2.0, 'Sm1': 1.0, 'Sc': 0.5,  # 补贴参数'F1': 1.0, 'F2': 0.5,  # 罚金参数'alpha': 0.5, 'beta': 0.2  # 口碑转化率}

3. 博弈收益计算深度解析

3.1 政府收益差计算(核心算法)

def government_payoff_difference(self, u, x, y, z):"""政府策略收益差(强监管-弱监管)的完整概率组合计算"""# 8种策略组合的期望收益计算payoff_strong = (x * y * z * (E1+E2+E3+E4-Cg1+St+Sm1+Sc) +  # 全参与情况x * y * (1-z) * (E1+E2+E4-Cg1+St+Sm1-Sc) +  # 消费者不参与# ... 其他6种组合)

数学原理:基于概率论的全期望公式,计算所有策略组合的加权平均收益。

3.2 复制动态方程系统

def replication_dynamics(self, state, t):u, x, y, z = statedu_dt = u * (1 - u) * self.government_payoff_difference(u, x, y, z)dx_dt = x * (1 - x) * self.enterprise_payoff_difference(u, x, y, z)# ... 其他主体

演化博弈核心:采用复制者动态方程,描述策略比例随时间演化的微分方程组。

4. 高级可视化系统

4.1 关系网络图

def create_advanced_relationship_diagram():"""创建专业的四方主体关系网络图"""nodes = {'政府': {'pos': (0.5, 0.9), 'color': '#FF6B6B', 'size': 3000},'第三方回收企业': {'pos': (0.9, 0.5), 'color': '#4ECDC4', 'size': 2500},# ... 其他节点}
  • 节点布局:采用菱形布局体现层级关系

  • 边权可视化:不同颜色和粗细表示不同的关系强度

4.2 相位空间分析

def create_phase_portrait(game, fixed_variables=None):"""创建政府-企业二维相位图"""U, X = np.meshgrid(u_range, x_range)DU, DX = np.zeros_like(U), np.zeros_like(X)# 计算每个点的演化方向for i in range(n_points):for j in range(n_points):derivatives = game.replication_dynamics(state, 0)DU[i, j] = derivatives[0]  # du/dtDX[i, j] = derivatives[1]  # dx/dt

动力学分析:通过流线图展示系统在状态空间中的演化轨迹和稳定点。

4.3 3D轨迹可视化

def create_evolution_trajectory_3d(game, initial_state, time_range):"""三维演化轨迹的多视角展示"""# 三个子图:政府-企业-商家、企业-商家-消费者、时间序列ax1.plot(trajectory[:, 0], trajectory[:, 1], trajectory[:, 2], linewidth=3, alpha=0.8, color='blue')

多维度分析:同时展示三维轨迹投影和时间序列,全面理解演化过程。

5. Streamlit交互界面设计

5.1 参数分组管理

# 环境效益参数组
st.sidebar.subheader("📊 环境效益参数")
col1, col2 = st.sidebar.columns(2)
with col1:E1 = st.slider("企业环境效益 E1", 0.0, 10.0, 6.0, 0.1)E2 = st.slider("商家环境效益 E2", 0.0, 10.0, 3.0, 0.1)

用户体验优化:参数按功能分组,双列布局提高空间利用率。

5.2 多标签页信息架构

tab1, tab2, tab3, tab4, tab5, tab6 = st.tabs(["🏛️ 模型框架", "📈 演化分析", "🎯 相位分析", "🔍 稳定性分析", "📊 敏感性分析", "⚡ 动态模拟"
])

分析流程引导:从基础框架到高级分析的渐进式探索路径。

6. 高级分析功能

6.1 参数敏感性分析

def create_parameter_sensitivity_heatmap(game, param_name, param_range):"""热图展示参数变化对四方策略的敏感性"""for i, param_val in enumerate(param_values):game.params[param_name] = param_valresults[i, :] = trajectory[-1, :]  # 最终稳定状态

政策启示:识别关键杠杆参数,为政策制定提供量化依据。

6.2 均衡点稳定性测试

equilibrium_points = [[0,0,0,0], [1,0,0,0], [0,1,0,0], [0,0,1,0],# ... 16种纯策略均衡点
]

博弈论应用:检验所有可能均衡点的吸引域和稳定性。

7. 代码

import numpy as np
import matplotlib.pyplot as plt
import streamlit as st
from scipy.integrate import odeint
import pandas as pd
from matplotlib import rcParams
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import sympy as sp
from mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
from matplotlib.colors import LinearSegmentedColormap
import matplotlib.patches as patches
import matplotlib.font_manager as fm
import sys
import os# 彻底解决中文字符显示问题
def setup_chinese_font():"""设置中文字体,彻底解决字体问题"""try:# 获取系统中所有字体font_list = fm.findSystemFonts(fontpaths=None, fontext='ttf')# 寻找中文字体chinese_fonts = []for font_path in font_list:try:font_prop = fm.FontProperties(fname=font_path)font_name = font_prop.get_name()# 检查是否是中文字体if any(name in font_name.lower() for name in['simhei', 'microsoft', 'noto', 'simsun', 'kaiti', 'stsong']):chinese_fonts.append((font_name, font_path))except:continue# 设置字体优先级preferred_fonts = ['SimHei', 'Microsoft YaHei', 'SimSun', 'KaiTi', 'Noto Sans CJK SC', 'STSong']selected_font = Nonefor font_name in preferred_fonts:for name, path in chinese_fonts:if font_name.lower() in name.lower():selected_font = namebreakif selected_font:breakif selected_font:# 设置全局字体plt.rcParams['font.family'] = selected_fontplt.rcParams['font.sans-serif'] = [selected_font, 'DejaVu Sans']plt.rcParams['axes.unicode_minus'] = Falseprint(f"成功设置中文字体: {selected_font}")else:# 使用默认字体plt.rcParams['font.family'] = 'DejaVu Sans'plt.rcParams['font.sans-serif'] = ['DejaVu Sans']plt.rcParams['axes.unicode_minus'] = Falseprint("使用默认字体: DejaVu Sans")except Exception as e:# 异常处理plt.rcParams['font.family'] = 'DejaVu Sans'plt.rcParams['font.sans-serif'] = ['DejaVu Sans']plt.rcParams['axes.unicode_minus'] = Falseprint(f"字体设置异常: {e}")# 初始化字体设置
setup_chinese_font()class AdvancedFourPartyEvolutionaryGame:def __init__(self):# 默认参数设置(基于文档中的数值)self.params = {# 环境效益参数'E1': 6.0, 'E2': 3.0, 'E3': 2.0, 'E4': 1.0,# 成本参数'Cg1': 2.0, 'Cg2': 1.0, 'Ct1': 3.0, 'Ct2': 2.0,'Cm1': 2.0, 'Cm2': 1.0, 'Cc1': 1.0, 'Cc2': 0.5,# 补贴参数'St': 2.0, 'Sm1': 1.0, 'Sc': 0.5, 'Sm2': 0.8,# 罚金参数'F1': 1.0, 'F2': 0.5,# 口碑转化率'alpha': 0.5, 'beta': 0.2,}def government_payoff_difference(self, u, x, y, z):"""政府策略收益差(强监管-弱监管)"""p = self.params# 强监管收益payoff_strong = (x * y * z * (p['E1'] + p['E2'] + p['E3'] + p['E4'] - p['Cg1'] + p['St'] + p['Sm1'] + p['Sc']) +x * y * (1 - z) * (p['E1'] + p['E2'] + p['E4'] - p['Cg1'] + p['St'] + p['Sm1'] - p['Sc']) +x * (1 - y) * z * (p['E1'] + p['E3'] + p['E4'] - p['Cg1'] + p['St'] + p['Sc'] + p['F2']) +x * (1 - y) * (1 - z) * (p['E1'] + p['E4'] - p['Cg1'] + p['St'] + p['F2']) +(1 - x) * y * z * (p['E2'] + p['E3'] + p['E4'] - p['Cg1'] + p['Sm1'] + p['Sc'] + p['F1']) +(1 - x) * y * (1 - z) * (p['E2'] + p['E4'] - p['Cg1'] + p['Sm1'] + p['F1']) +(1 - x) * (1 - y) * z * (p['E3'] + p['E4'] - p['Cg1'] + p['Sc'] + p['F1'] + p['F2']) +(1 - x) * (1 - y) * (1 - z) * (p['E4'] - p['Cg1'] + p['F1'] + p['F2']))# 弱监管收益payoff_weak = (x * y * z * (p['E1'] + p['E2'] + p['E3'] + p['E4'] - p['Cg2']) +x * y * (1 - z) * (p['E1'] + p['E2'] + p['E4'] - p['Cg2']) +x * (1 - y) * z * (p['E1'] + p['E3'] + p['E4'] - p['Cg2']) +x * (1 - y) * (1 - z) * (p['E1'] + p['E4'] - p['Cg2']) +(1 - x) * y * z * (p['E2'] + p['E3'] + p['E4'] - p['Cg2']) +(1 - x) * y * (1 - z) * (p['E2'] + p['E4'] - p['Cg2']) +(1 - x) * (1 - y) * z * (p['E3'] + p['E4'] - p['Cg2']) +(1 - x) * (1 - y) * (1 - z) * (p['E4'] - p['Cg2']))return payoff_strong - payoff_weakdef enterprise_payoff_difference(self, u, x, y, z):"""企业策略收益差(构建-不构建)"""p = self.params# 构建收益payoff_build = (u * y * z * (p['St'] - p['Ct1'] + p['alpha'] * (p['E1'] + p['E2'])) +u * y * (1 - z) * (p['St'] - p['Ct1'] + p['alpha'] * p['E1']) +u * (1 - y) * z * (p['St'] - p['Ct1'] + p['alpha'] * p['E1'] - p['F2']) +u * (1 - y) * (1 - z) * (p['St'] - p['Ct1'] + p['alpha'] * p['E1'] - p['F2']) +(1 - u) * y * z * (-p['Ct1'] + p['alpha'] * (p['E1'] + p['E2'])) +(1 - u) * y * (1 - z) * (-p['Ct1'] + p['alpha'] * p['E1']) +(1 - u) * (1 - y) * z * (-p['Ct1'] + p['alpha'] * p['E1']) +(1 - u) * (1 - y) * (1 - z) * (-p['Ct1'] + p['alpha'] * p['E1']))# 不构建收益payoff_not_build = (u * y * z * (-p['Ct2'] - p['F1']) +u * y * (1 - z) * (-p['Ct2'] - p['F1']) +u * (1 - y) * z * (-p['Ct2'] - p['F1']) +u * (1 - y) * (1 - z) * (-p['Ct2'] - p['F1']) +(1 - u) * y * z * (-p['Ct2']) +(1 - u) * y * (1 - z) * (-p['Ct2']) +(1 - u) * (1 - y) * z * (-p['Ct2']) +(1 - u) * (1 - y) * (1 - z) * (-p['Ct2']))return payoff_build - payoff_not_builddef merchant_payoff_difference(self, u, x, y, z):"""商家策略收益差(配合-投机)"""p = self.params# 配合收益payoff_cooperate = (u * x * z * (p['Sm1'] + p['Sm2'] - p['Cm1'] + p['beta'] * (p['E2'] + p['E3'])) +u * x * (1 - z) * (p['Sm1'] + p['Sm2'] - p['Cm1'] + p['beta'] * p['E2']) +u * (1 - x) * z * (p['Sm1'] - p['Cm1'] + p['beta'] * p['E2'] - p['F1']) +u * (1 - x) * (1 - z) * (p['Sm1'] - p['Cm1'] + p['beta'] * p['E2'] - p['F1']) +(1 - u) * x * z * (p['Sm2'] - p['Cm1'] + p['beta'] * (p['E2'] + p['E3'])) +(1 - u) * x * (1 - z) * (p['Sm2'] - p['Cm1'] + p['beta'] * p['E2']) +(1 - u) * (1 - x) * z * (-p['Cm1'] + p['beta'] * p['E2']) +(1 - u) * (1 - x) * (1 - z) * (-p['Cm1'] + p['beta'] * p['E2']))# 投机收益payoff_speculate = (u * x * z * (-p['Cm2'] - p['F2']) +u * x * (1 - z) * (-p['Cm2'] - p['F2']) +u * (1 - x) * z * (-p['Cm2'] - p['F2']) +u * (1 - x) * (1 - z) * (-p['Cm2'] - p['F2']) +(1 - u) * x * z * (-p['Cm2']) +(1 - u) * x * (1 - z) * (-p['Cm2']) +(1 - u) * (1 - x) * z * (-p['Cm2']) +(1 - u) * (1 - x) * (1 - z) * (-p['Cm2']))return payoff_cooperate - payoff_speculatedef consumer_payoff_difference(self, u, x, y, z):"""消费者策略收益差(参与-不参与)"""p = self.params# 参与收益payoff_participate = (u * x * y * (p['Sc'] - p['Cc1'] + p['E3']) +u * x * (1 - y) * (p['Sc'] - p['Cc1'] + p['E3'] - p['F2']) +u * (1 - x) * y * (p['Sc'] - p['Cc1'] + p['E3'] - p['F1']) +u * (1 - x) * (1 - y) * (p['Sc'] - p['Cc1'] + p['E3'] - p['F1'] - p['F2']) +(1 - u) * x * y * (-p['Cc1'] + p['E3']) +(1 - u) * x * (1 - y) * (-p['Cc1'] + p['E3']) +(1 - u) * (1 - x) * y * (-p['Cc1'] + p['E3']) +(1 - u) * (1 - x) * (1 - y) * (-p['Cc1'] + p['E3']))# 不参与收益payoff_not_participate = (u * x * y * (-p['Cc2']) +u * x * (1 - y) * (-p['Cc2']) +u * (1 - x) * y * (-p['Cc2']) +u * (1 - x) * (1 - y) * (-p['Cc2']) +(1 - u) * x * y * (-p['Cc2']) +(1 - u) * x * (1 - y) * (-p['Cc2']) +(1 - u) * (1 - x) * y * (-p['Cc2']) +(1 - u) * (1 - x) * (1 - y) * (-p['Cc2']))return payoff_participate - payoff_not_participatedef replication_dynamics(self, state, t):"""复制动态方程系统"""u, x, y, z = statedu_dt = u * (1 - u) * self.government_payoff_difference(u, x, y, z)dx_dt = x * (1 - x) * self.enterprise_payoff_difference(u, x, y, z)dy_dt = y * (1 - y) * self.merchant_payoff_difference(u, x, y, z)dz_dt = z * (1 - z) * self.consumer_payoff_difference(u, x, y, z)return [du_dt, dx_dt, dy_dt, dz_dt]def simulate_evolution(self, initial_state, time_range, n_points=1000):"""模拟演化过程"""t = np.linspace(0, time_range, n_points)solution = odeint(self.replication_dynamics, initial_state, t)return t, solutiondef create_advanced_relationship_diagram():"""创建专业的四方主体关系图"""fig, ax = plt.subplots(1, 1, figsize=(10, 8))# 定义节点位置和属性nodes = {'政府': {'pos': (0.5, 0.9), 'color': '#FF6B6B', 'size': 3000},'第三方回收企业': {'pos': (0.9, 0.5), 'color': '#4ECDC4', 'size': 2500},'餐饮商家': {'pos': (0.1, 0.5), 'color': '#45B7D1', 'size': 2500},'消费者': {'pos': (0.5, 0.1), 'color': '#96CEB4', 'size': 2000}}# 定义边和关系edges = [('政府', '第三方回收企业', '监管/补贴', '#FF6B6B', 2),('政府', '餐饮商家', '监管/补贴', '#FF6B6B', 2),('政府', '消费者', '引导/激励', '#FF6B6B', 2),('第三方回收企业', '餐饮商家', '合作/技术支持', '#4ECDC4', 1.5),('第三方回收企业', '消费者', '服务/回收', '#4ECDC4', 1.5),('餐饮商家', '消费者', '服务/环保包装', '#45B7D1', 1.5)]# 绘制边for start, end, label, color, width in edges:start_pos = nodes[start]['pos']end_pos = nodes[end]['pos']# 绘制箭头ax.annotate('', xy=end_pos, xytext=start_pos,arrowprops=dict(arrowstyle='->', color=color,lw=width, alpha=0.7))# 添加标签,显式设置字体mid_x = (start_pos[0] + end_pos[0]) / 2mid_y = (start_pos[1] + end_pos[1]) / 2ax.text(mid_x, mid_y, label, ha='center', va='center',fontsize=9, bbox=dict(boxstyle="round,pad=0.3",facecolor='white', alpha=0.8),fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))# 绘制节点for name, props in nodes.items():ax.scatter(*props['pos'], s=props['size'], c=props['color'],alpha=0.8, edgecolors='black', linewidth=2)ax.text(*props['pos'], name, ha='center', va='center',fontsize=12, fontweight='bold',fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax.set_xlim(0, 1)ax.set_ylim(0, 1)ax.set_aspect('equal')ax.axis('off')# 设置标题字体ax.set_title('外卖包装废弃物回收治理四方主体关系图\n', fontsize=16, fontweight='bold',fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))# 添加图例legend_elements = [plt.Line2D([0], [0], marker='o', color='w', markerfacecolor='#FF6B6B',markersize=10, label='监管主体'),plt.Line2D([0], [0], marker='o', color='w', markerfacecolor='#4ECDC4',markersize=10, label='实施主体'),plt.Line2D([0], [0], marker='o', color='w', markerfacecolor='#45B7D1',markersize=10, label='配合主体'),plt.Line2D([0], [0], marker='o', color='w', markerfacecolor='#96CEB4',markersize=10, label='参与主体')]# 设置图例字体legend = ax.legend(handles=legend_elements, loc='upper center',bbox_to_anchor=(0.5, -0.05), ncol=4, fontsize=10)for text in legend.get_texts():text.set_fontfamily(plt.rcParams['font.family'])plt.tight_layout()return figdef create_phase_portrait(game, fixed_variables=None):"""创建专业的相位图"""if fixed_variables is None:fixed_variables = {'y': 0.5, 'z': 0.5}n_points = 20u_range = np.linspace(0.01, 0.99, n_points)x_range = np.linspace(0.01, 0.99, n_points)U, X = np.meshgrid(u_range, x_range)DU = np.zeros_like(U)DX = np.zeros_like(X)y_fixed = fixed_variables.get('y', 0.5)z_fixed = fixed_variables.get('z', 0.5)for i in range(n_points):for j in range(n_points):u_val = U[i, j]x_val = X[i, j]state = [u_val, x_val, y_fixed, z_fixed]derivatives = game.replication_dynamics(state, 0)DU[i, j] = derivatives[0]DX[i, j] = derivatives[1]# 创建相位图fig, ax = plt.subplots(figsize=(10, 8))# 计算速度大小用于颜色映射speed = np.sqrt(DU ** 2 + DX ** 2)lw = 2 * speed / speed.max() + 0.5# 绘制流线图strm = ax.streamplot(U, X, DU, DX, density=2, color=speed,cmap='viridis', linewidth=lw, arrowsize=1.5)# 添加颜色条cbar = plt.colorbar(strm.lines, ax=ax)cbar.set_label('演化速度', rotation=270, labelpad=15,fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))# 标记稳定点equilibrium_points = [[0, 0], [0, 1], [1, 0], [1, 1]]for point in equilibrium_points:ax.plot(point[0], point[1], 'ro', markersize=10,markeredgecolor='black', markeredgewidth=2)# 设置坐标轴标签和标题,显式设置字体ax.set_xlabel('政府强监管概率 (u)', fontsize=12,fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax.set_ylabel('企业构建概率 (x)', fontsize=12,fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax.set_title(f'政府-企业相位图 (y={y_fixed}, z={z_fixed})', fontsize=14,fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax.grid(True, alpha=0.3)return figdef create_parameter_sensitivity_heatmap(game, param_name, param_range, n_points=10):"""创建参数敏感性热图"""results = np.zeros((n_points, 4))  # 存储四个主体的最终概率for i, param_val in enumerate(np.linspace(param_range[0], param_range[1], n_points)):game.params[param_name] = param_val_, trajectory = game.simulate_evolution([0.5, 0.5, 0.5, 0.5], 20)results[i, :] = trajectory[-1, :]# 创建热图fig, ax = plt.subplots(figsize=(12, 6))im = ax.imshow(results.T, cmap='RdYlGn', aspect='auto',vmin=0, vmax=1, extent=[param_range[0], param_range[1], 0, 3])# 设置坐标轴ax.set_xticks(np.linspace(param_range[0], param_range[1], 5))ax.set_yticks([0.5, 1.5, 2.5, 3.5])# 设置坐标轴标签,显式设置字体yticklabels = ['消费者(z)', '商家(y)', '企业(x)', '政府(u)']ax.set_yticklabels(yticklabels, fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax.set_xlabel(f'{param_name} 参数值', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax.set_ylabel('主体类型', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax.set_title(f'{param_name} 参数敏感性分析', fontsize=14,fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))# 添加颜色条cbar = plt.colorbar(im, ax=ax)cbar.set_label('最终策略概率', rotation=270, labelpad=15,fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))# 添加数值标注for i in range(n_points):for j in range(4):text = ax.text(i * (param_range[1] - param_range[0]) / n_points + param_range[0],j + 0.5, f'{results[i, j]:.2f}',ha="center", va="center", color="black", fontsize=8,fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))return figdef create_evolution_trajectory_3d(game, initial_state, time_range):"""创建3D演化轨迹图"""t, trajectory = game.simulate_evolution(initial_state, time_range)fig = plt.figure(figsize=(15, 5))# 子图1: 政府-企业-商家ax1 = fig.add_subplot(131, projection='3d')ax1.plot(trajectory[:, 0], trajectory[:, 1], trajectory[:, 2],linewidth=3, alpha=0.8, color='blue')ax1.scatter(*trajectory[0, :3], color='green', s=100, label='起点')ax1.scatter(*trajectory[-1, :3], color='red', s=100, label='终点')# 设置3D图的标签和标题ax1.set_xlabel('政府概率 (u)', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax1.set_ylabel('企业概率 (x)', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax1.set_zlabel('商家概率 (y)', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax1.set_title('政府-企业-商家演化轨迹', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))# 设置图例字体legend = ax1.legend()for text in legend.get_texts():text.set_fontfamily(plt.rcParams['font.family'])# 子图2: 企业-商家-消费者ax2 = fig.add_subplot(132, projection='3d')ax2.plot(trajectory[:, 1], trajectory[:, 2], trajectory[:, 3],linewidth=3, alpha=0.8, color='red')ax2.scatter(*trajectory[0, 1:], color='green', s=100, label='起点')ax2.scatter(*trajectory[-1, 1:], color='red', s=100, label='终点')ax2.set_xlabel('企业概率 (x)', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax2.set_ylabel('商家概率 (y)', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax2.set_zlabel('消费者概率 (z)', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax2.set_title('企业-商家-消费者演化轨迹', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))legend2 = ax2.legend()for text in legend2.get_texts():text.set_fontfamily(plt.rcParams['font.family'])# 子图3: 时间序列ax3 = fig.add_subplot(133)colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4']labels = ['政府(u)', '企业(x)', '商家(y)', '消费者(z)']for i in range(4):ax3.plot(t, trajectory[:, i], color=colors[i], linewidth=2, label=labels[i])ax3.set_xlabel('时间', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax3.set_ylabel('策略概率', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax3.set_title('策略演化时间序列', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))legend3 = ax3.legend()for text in legend3.get_texts():text.set_fontfamily(plt.rcParams['font.family'])ax3.grid(True, alpha=0.3)plt.tight_layout()return figdef main():# 设置Streamlit页面配置,支持中文st.set_page_config(page_title="高级四方演化博弈分析",layout="wide",page_icon="📊")# 设置页面标题st.title("🚀 外卖包装废弃物协同回收治理 - 高级四方演化博弈分析平台")game = AdvancedFourPartyEvolutionaryGame()# 侧边栏参数设置st.sidebar.header("🎛️ 模型参数设置")# 参数分组设置st.sidebar.subheader("📊 环境效益参数")col1, col2 = st.sidebar.columns(2)with col1:E1 = st.slider("企业环境效益 E1", 0.0, 10.0, 6.0, 0.1)E2 = st.slider("商家环境效益 E2", 0.0, 10.0, 3.0, 0.1)with col2:E3 = st.slider("消费者环境效益 E3", 0.0, 10.0, 2.0, 0.1)E4 = st.slider("基础环境效益 E4", 0.0, 10.0, 1.0, 0.1)st.sidebar.subheader("💰 成本与补贴参数")col1, col2 = st.sidebar.columns(2)with col1:Ct1 = st.slider("企业构建成本 Ct1", 0.0, 5.0, 3.0, 0.1)Cm1 = st.slider("商家配合成本 Cm1", 0.0, 5.0, 2.0, 0.1)St = st.slider("企业补贴 St", 0.0, 5.0, 2.0, 0.1)with col2:Cg1 = st.slider("政府监管成本 Cg1", 0.0, 5.0, 2.0, 0.1)Cc1 = st.slider("消费者参与成本 Cc1", 0.0, 5.0, 1.0, 0.1)F1 = st.slider("企业罚金 F1", 0.0, 5.0, 1.0, 0.1)st.sidebar.subheader("📈 关键转化率参数")alpha = st.sidebar.slider("企业口碑转化率 α", 0.0, 1.0, 0.5, 0.05)beta = st.sidebar.slider("商家口碑转化率 β", 0.0, 1.0, 0.2, 0.05)# 更新参数game.params.update({'E1': E1, 'E2': E2, 'E3': E3, 'E4': E4,'Cg1': Cg1, 'Ct1': Ct1, 'Cm1': Cm1, 'Cc1': Cc1,'St': St, 'F1': F1, 'alpha': alpha, 'beta': beta})# 标签页布局tab1, tab2, tab3, tab4, tab5, tab6 = st.tabs(["🏛️ 模型框架", "📈 演化分析", "🎯 相位分析", "🔍 稳定性分析","📊 敏感性分析", "⚡ 动态模拟"])with tab1:st.header("🏛️ 四方演化博弈模型框架")col1, col2 = st.columns([2, 1])with col1:st.subheader("四方主体协同关系图")fig_relation = create_advanced_relationship_diagram()st.pyplot(fig_relation)plt.close()with col2:st.subheader("📋 当前参数配置")param_df = pd.DataFrame.from_dict(game.params, orient='index', columns=['数值'])st.dataframe(param_df.style.format('{:.3f}').highlight_max(axis=0, color='#ff6b6b'))st.subheader("🧮 动态方程")st.latex(r"\frac{du}{dt} = u(1-u)\Delta U_g")st.latex(r"\frac{dx}{dt} = x(1-x)\Delta U_e")st.latex(r"\frac{dy}{dt} = y(1-y)\Delta U_m")st.latex(r"\frac{dz}{dt} = z(1-z)\Delta U_c")st.info("""**方程说明:**- $u$: 政府强监管概率- $x$: 企业构建概率  - $y$: 商家配合概率- $z$: 消费者参与概率""")with tab2:st.header("📈 多维度演化轨迹分析")col1, col2 = st.columns(2)with col1:st.subheader("🎛️ 模拟参数设置")u0 = st.slider("政府初始概率 u₀", 0.0, 1.0, 0.5, 0.1)x0 = st.slider("企业初始概率 x₀", 0.0, 1.0, 0.5, 0.1)y0 = st.slider("商家初始概率 y₀", 0.0, 1.0, 0.5, 0.1)z0 = st.slider("消费者初始概率 z₀", 0.0, 1.0, 0.5, 0.1)time_range = st.slider("模拟时间范围", 5, 50, 20)with col2:st.subheader("📊 可视化选项")show_3d = st.checkbox("显示3D演化轨迹", value=True)show_phase = st.checkbox("显示二维投影", value=True)resolution = st.selectbox("模拟精度", ["标准", "高精度", "超高精度"])# 执行模拟n_points = 1000 if resolution == "标准" else (2000 if resolution == "高精度" else 5000)initial_state = [u0, x0, y0, z0]t, solution = game.simulate_evolution(initial_state, time_range, n_points)# 显示时间序列图st.subheader("📊 策略演化时间序列")fig, axes = plt.subplots(2, 2, figsize=(12, 8))axes = axes.flatten()labels = ['政府概率 u', '企业概率 x', '商家概率 y', '消费者概率 z']colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4']for i in range(4):axes[i].plot(t, solution[:, i], color=colors[i], linewidth=2)axes[i].set_xlabel('时间', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))axes[i].set_ylabel('概率', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))axes[i].set_title(labels[i], fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))axes[i].grid(True, alpha=0.3)axes[i].set_ylim(0, 1)plt.tight_layout()st.pyplot(fig)plt.close()# 显示3D轨迹if show_3d:st.subheader("🌐 三维演化轨迹分析")fig_3d = create_evolution_trajectory_3d(game, initial_state, time_range)st.pyplot(fig_3d)plt.close()# 显示二维投影if show_phase:st.subheader("📐 二维投影分析")col1, col2 = st.columns(2)with col1:# u-x 平面投影fig, ax = plt.subplots(figsize=(8, 6))ax.plot(solution[:, 0], solution[:, 1], linewidth=2, alpha=0.8)ax.scatter(solution[0, 0], solution[0, 1], color='green', s=100, label='起点')ax.scatter(solution[-1, 0], solution[-1, 1], color='red', s=100, label='终点')ax.set_xlabel('政府概率 (u)', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax.set_ylabel('企业概率 (x)', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax.set_title('政府-企业演化轨迹投影',fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))legend = ax.legend()for text in legend.get_texts():text.set_fontfamily(plt.rcParams['font.family'])ax.grid(True, alpha=0.3)st.pyplot(fig)plt.close()with col2:# y-z 平面投影fig, ax = plt.subplots(figsize=(8, 6))ax.plot(solution[:, 2], solution[:, 3], linewidth=2, alpha=0.8)ax.scatter(solution[0, 2], solution[0, 3], color='green', s=100, label='起点')ax.scatter(solution[-1, 2], solution[-1, 3], color='red', s=100, label='终点')ax.set_xlabel('商家概率 (y)', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax.set_ylabel('消费者概率 (z)', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))ax.set_title('商家-消费者演化轨迹投影',fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))legend = ax.legend()for text in legend.get_texts():text.set_fontfamily(plt.rcParams['font.family'])ax.grid(True, alpha=0.3)st.pyplot(fig)plt.close()with tab3:st.header("🎯 相位空间分析")st.subheader("政府-企业相位图分析")col1, col2 = st.columns(2)with col1:y_fixed = st.slider("固定商家概率 y", 0.0, 1.0, 0.5, 0.1)z_fixed = st.slider("固定消费者概率 z", 0.0, 1.0, 0.5, 0.1)with col2:phase_resolution = st.selectbox("相位图分辨率", ["标准", "高分辨率"])n_points = 20 if phase_resolution == "标准" else 40fig_phase = create_phase_portrait(game, {'y': y_fixed, 'z': z_fixed})st.pyplot(fig_phase)plt.close()st.info("""**相位图解读:**- 🔴 红色圆点:可能的均衡点- 箭头方向:策略演化方向- 颜色深浅:演化速度(颜色越亮速度越快)- 流线:系统的演化轨迹""")with tab4:st.header("🔍 均衡点稳定性分析")# 定义均衡点equilibrium_points = [[0, 0, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0],[0, 0, 0, 1], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1],[0, 1, 1, 0], [0, 1, 0, 1], [0, 0, 1, 1], [1, 1, 1, 0],[1, 1, 0, 1], [1, 0, 1, 1], [0, 1, 1, 1], [1, 1, 1, 1]]st.subheader("📈 均衡点收敛分析")# 测试多个初始点向均衡点的收敛fig, axes = plt.subplots(2, 2, figsize=(12, 10))axes = axes.flatten()labels = ['政府概率 u', '企业概率 x', '商家概率 y', '消费者概率 z']colors = plt.cm.viridis(np.linspace(0, 1, 8))initial_points = [[0.1, 0.1, 0.1, 0.1], [0.9, 0.1, 0.1, 0.1],[0.1, 0.9, 0.1, 0.1], [0.1, 0.1, 0.9, 0.1],[0.1, 0.1, 0.1, 0.9], [0.9, 0.9, 0.1, 0.1],[0.5, 0.5, 0.5, 0.5], [0.8, 0.2, 0.7, 0.3]]for j, init_point in enumerate(initial_points):_, trajectory = game.simulate_evolution(init_point, 15)for i in range(4):axes[i].plot(trajectory[:, i], color=colors[j], alpha=0.7,label=f'初始{init_point}' if i == 0 else "")for i in range(4):axes[i].set_xlabel('时间步', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))axes[i].set_ylabel('概率', fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))axes[i].set_title(labels[i], fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))axes[i].grid(True, alpha=0.3)axes[i].set_ylim(0, 1)# 设置图例字体legend = axes[0].legend(bbox_to_anchor=(1.05, 1), loc='upper left', fontsize=8)for text in legend.get_texts():text.set_fontfamily(plt.rcParams['font.family'])plt.tight_layout()st.pyplot(fig)plt.close()with tab5:st.header("📊 多参数敏感性分析")st.subheader("🔧 关键参数影响分析")# 参数敏感性分析param_to_analyze = st.selectbox("选择分析参数",['alpha', 'beta', 'E1', 'St', 'F1'])param_range = st.slider("参数范围", 0.0, 10.0, (0.1, 5.0))# 执行参数敏感性分析param_values = np.linspace(param_range[0], param_range[1], 20)results = np.zeros((len(param_values), 4))for i, val in enumerate(param_values):game.params[param_to_analyze] = val_, trajectory = game.simulate_evolution([0.5, 0.5, 0.5, 0.5], 15)results[i, :] = trajectory[-1, :]# 绘制敏感性曲线fig, axes = plt.subplots(2, 2, figsize=(12, 8))axes = axes.flatten()labels = ['政府(u)', '企业(x)', '商家(y)', '消费者(z)']colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4']for i in range(4):axes[i].plot(param_values, results[:, i],color=colors[i], linewidth=3, marker='o')axes[i].set_xlabel(f'{param_to_analyze} 参数值',fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))axes[i].set_ylabel('最终概率',fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))axes[i].set_title(f'{labels[i]}敏感性',fontproperties=fm.FontProperties(family=plt.rcParams['font.family']))axes[i].grid(True, alpha=0.3)plt.tight_layout()st.pyplot(fig)plt.close()with tab6:st.header("⚡ 实时动态模拟")st.subheader("📊 实时数据监控")# 显示当前参数下的收敛结果_, final_trajectory = game.simulate_evolution([0.5, 0.5, 0.5, 0.5], 20)final_probs = final_trajectory[-1, :]metrics_data = {'主体': ['政府', '企业', '商家', '消费者'],'最终概率': final_probs,'收敛状态': ['收敛' if p > 0.8 else '震荡' if p > 0.3 else '发散' for p in final_probs]}metrics_df = pd.DataFrame(metrics_data)st.dataframe(metrics_df)# 显示收敛指标col1, col2, col3 = st.columns(3)with col1:st.metric("系统稳定性",f"{sum(final_probs > 0.7)}/4")with col2:st.metric("协同程度", f"{np.mean(final_probs):.1%}")with col3:st.metric("演化速度", "快速" if np.std(final_probs) < 0.2 else "中等")if __name__ == "__main__":main()

http://www.dtcms.com/a/593895.html

相关文章:

  • 【Prompt】提示词工程
  • 地图可视化实践录:GeoJSON学习
  • 聊聊c++的反射
  • 长安做网站公司微信开发时间
  • 做电影网站的软件潍坊网络推广个人合作
  • 零基础学AI大模型之Milvus向量数据库全解析
  • Spring MVC 核心工作原理:DispatcherServlet 全流程深度解析
  • 网站建设计入哪个明细科目在百度如何发布作品
  • 四大AI相关平台特点分析与对比
  • 网站上的链接怎么做wordpress转移服务器
  • 基于微信小程序的个性化漫画阅读推荐系统
  • 压缩上下文以提升大语言模型的推理效率
  • DrawEduMath:评估视觉语言模型的教育领域新基准
  • 医院网站站群建设小程序商店怎么接入视频号
  • 编程课哪个培训机构好肇庆网页关键词优化
  • 外国网站做问卷调查挣钱网站建设对客户的优势
  • 移动通信网络建设-实验3:5G建设方案规划设计
  • 关于文艺网站建设政策展馆展厅设计方案
  • 网站 设计理念上海网站排名
  • 《算法通关指南:算法基础篇 --- 一维前缀和(1)—1. 【模板】前缀和,2.最大子段和》
  • 英文网站设计多少钱wordpress qux
  • 编程语言排行榜2025年11月
  • 现在网站开发的前端语言如何做百度推广
  • 多粒子模型--交通堵塞
  • wordpress快速仿站视频教程wordpress如何进数据库
  • 做的ASP网站手机石家庄seo扣费
  • 扫二维码进入个人的购物网站如何做软件外包公司绩效考核内容
  • iOS的事件响应链
  • iOS Widget 开发-9:可配置 Widget:使用 IntentConfiguration 实现参数选择
  • 教育网站报名网络推广100种方法免费