【B题完整论文】2025数模美赛B题完整论文+可运行代码参考(无偿分享)

注:该内容由“数模加油站”原创,无偿分享,可以领取参考但不要利用该内容倒卖,谢谢!


 2025年MCM问题B:管理可持续旅游

3、模型假设与符号说明

3.1、模型基本假设

(1) 游客行为假设:游客的日均消费金额为常数,不随税费调整或游客数量变化而波动;游客数量与税费水平存在负相关关系。

(2) 环境影响假设:游客对环境的直接单位影响是线性变化的,而冰川退缩的速率随游客数量平方增长。

(3) 社会满意度假设:居民的满意度随着游客数量的增加而逐渐下降,并以对数形式反映游客压力的边际递减效应。

(4) 收入分配假设:所有收入均按照固定比例分配到环境保护、基础设施建设和社区福利,不考虑其他用途。

(5) 基础设施假设:基础设施的最大承载能力是固定的,当游客数量超过这一限制时,额外的游客会导致成本急剧增加。

(6) 政策调整假设:税费和游客数量的调整是即时生效的,且政策实施期间其他外部干扰(如气候变化)保持不变。

(7) 次级景点假设:推广次级景点不会显著改变总游客数量,仅改变游客分布,同时对主景点的环境压力具有缓解作用。

3.2、符号说明

4、模型建立与求解

4.1 问题一模型建立与求解

4.1.1 问题一求解思路

朱诺市的旅游业需要在以下三个方面实现平衡:

1. 经济效益:通过游客消费和税收获得收入;

2. 环境保护:降低游客活动对冰川退缩和生态系统的影响;

3. 社会满意度:缓解游客增长对基础设施和居民生活的压力。

4.1.2 问题一模型建立

4.1.3 问题一模型求解与分析

(1) 优化结果

通过运行代码,得到了以下结果:

(2) 可视化分析

(3) 政策建议

4.2、问题二模型建立与求解

4.2.1 问题二求解思路

问题二要求将问题一的模型应用到另一个受过度旅游影响的地区,分析如何通过合理的政策干预(如分流游客、调整游客税费、优化收入分配)在主景点和分流景点之间实现旅游效益最大化。具体解决思路如下:

(1)背景分析与建模参数调整:

选择威尼斯作为目标地,其主要景点(如圣马可广场)面临过度旅游问题,分流景点(如拉格纳地区)具有一定承载潜力。

主景点的环境退化与承载压力更高,模型参数需根据威尼斯的实际情况调整。

(2)多目标优化:

目标是最大化主景点和分流景点的综合旅游效益(包括收入减去环境与社会成本)。

考虑游客分流的影响,需优化游客数量、游客税费和收入分配比例等关键变量。

(3)约束条件:

基础设施承载力限制:主景点与分流景点的游客数量不能超过最大承载能力。

环境退化限制:需控制游客数量以满足环境可持续性的约束。

收入分配比例范围:合理划分收入用于环境保护。

(4)结果分析:

比较不同游客数量、税费和分配比例的优化结果。

通过成本与收入的变化曲线,探讨政策干预对综合效益的影响。

4.2.2 问题二模型建立

(1) 模型变量定义

定义优化决策变量:

4.2.3 问题二模型求解与分析

(1) 优化结果

(2) 可视化分析

横轴表示每日游客数量。

纵轴分别表示主景点和分流景点的收入、环境成本和社会成本。

图表显示:

随着游客数量的增加,环境成本和社会成本呈现非线性增长。

在最优游客数量处,收入与成本的差值最大,综合效益达到最大值。

(3) 政策建议

 完整内容

后续内容也都已更新完成,内容太多就不一一展示了,有需要的参考一下就行,没需要的直接划走就好哈,后边再附一段调试的代码,供大家参考下,可以跑跑试试

第一问求解代码

import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt

# 设置字体为英文字体
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['Arial']  # 设置为 Arial 英文字体
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 模型参数设置
p = 100              # 人均消费金额(美元/人)
alpha = 5            # 每位游客的环境单位影响(美元/人)
beta = 0.01          # 冰川退缩系数
delta = 2            # 基础设施单位成本(美元/人)
eta = 50             # 居民满意度下降的参数
gamma = 0.1          # 环境保护投入效率
C_max = 20000        # 基础设施承载能力(人)
E_max = 50           # 冰川允许的最大退缩速率(单位:米/年)

# 目标函数
def objective(vars):
    x, t, z = vars  # 决策变量:x为每日游客数量,t为游客税费,z为收入分配比例
    R = (p + t) * x  # 总收入
    C_e = alpha * x + beta * x**2 - gamma * z * R  # 环境成本
    C_s = delta * x + eta * np.log(1 + x)  # 社会成本
    U = R - C_e - C_s  # 综合效益
    return -U  # 由于优化是最小化,目标函数取负值

# 约束条件
def constraint1(vars):
    x, _, _ = vars
    return C_max - x  # 基础设施承载力约束:x <= C_max

def constraint2(vars):
    x, _, _ = vars
    return E_max - beta * x**2  # 冰川退缩速率约束:beta * x^2 <= E_max

def constraint3(vars):
    _, _, z = vars
    return z  # 收入分配比例约束:z >= 0

def constraint4(vars):
    _, _, z = vars
    return 1 - z  # 收入分配比例约束:z <= 1

# 初始猜测值
x0 = [10000, 10, 0.5]  # 初始值:[游客数量, 游客税费, 环境分配比例]

# 变量范围
bounds = [(1, C_max), (0, 100), (0, 1)]  # 游客数量、游客税费、分配比例的范围

# 约束集合
constraints = [
    {"type": "ineq", "fun": constraint1},
    {"type": "ineq", "fun": constraint2},
    {"type": "ineq", "fun": constraint3},
    {"type": "ineq", "fun": constraint4},
]

# 求解优化问题
result = minimize(objective, x0, method="SLSQP", bounds=bounds, constraints=constraints)

# 输出优化结果
if result.success:
    x_opt, t_opt, z_opt = result.x
    print(f"Optimization Results:")
    print(f"Daily Number of Tourists (x) = {x_opt:.2f}")
    print(f"Tourist Tax (t) = {t_opt:.2f} USD/person")
    print(f"Income Allocation for Environment (z) = {z_opt:.2f}")
    print(f"Maximum Comprehensive Benefit (U) = {-result.fun:.2f} USD")
else:
    print("Optimization was not successful:", result.message)

# 可视化分析
x_vals = np.linspace(1, C_max, 100)
U_vals = []

for x in x_vals:
    t, z = t_opt, z_opt
    R = (p + t) * x
    C_e = alpha * x + beta * x**2 - gamma * z * R
    C_s = delta * x + eta * np.log(1 + x)
    U = R - C_e - C_s
    U_vals.append(U)

# 绘制综合效益随游客数量变化的图
plt.figure(figsize=(10, 6))
plt.plot(x_vals, U_vals, label="Comprehensive Benefit (U)", color="blue", linewidth=2)
plt.axvline(x=x_opt, color="red", linestyle="--", label=f"Optimal Tourists (x = {x_opt:.0f})")
plt.xlabel("Daily Number of Tourists (x)", fontsize=14)
plt.ylabel("Comprehensive Benefit (U)", fontsize=14)
plt.title("Comprehensive Benefit vs. Daily Number of Tourists", fontsize=16)
plt.legend(fontsize=12)
plt.grid(alpha=0.6)
plt.show()

# 绘制成本和收入分布
C_e_vals = [alpha * x + beta * x**2 - gamma * z_opt * (p + t_opt) * x for x in x_vals]
C_s_vals = [delta * x + eta * np.log(1 + x) for x in x_vals]
R_vals = [(p + t_opt) * x for x in x_vals]

plt.figure(figsize=(10, 6))
plt.plot(x_vals, R_vals, label="Total Revenue (R)", color="green", linewidth=2)
plt.plot(x_vals, C_e_vals, label="Environmental Cost (C_e)", color="orange", linewidth=2)
plt.plot(x_vals, C_s_vals, label="Social Cost (C_s)", color="purple", linewidth=2)
plt.axvline(x=x_opt, color="red", linestyle="--", label=f"Optimal Tourists (x = {x_opt:.0f})")
plt.xlabel("Daily Number of Tourists (x)", fontsize=14)
plt.ylabel("Amount (USD)", fontsize=14)
plt.title("Cost and Revenue vs. Daily Number of Tourists", fontsize=16)
plt.legend(fontsize=12)
plt.grid(alpha=0.6)
plt.show()

第二问求解代码

import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt

# 设置字体为英文字体
from matplotlib import rcParams

rcParams['font.sans-serif'] = ['Arial']  # 设置为 Arial 英文字体
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 参数定义
p_main = 120  # 主景点人均消费金额(美元/人)
p_sub = 80  # 分流景点人均消费金额(美元/人)
alpha_main = 10  # 主景点环境单位影响(美元/人)
alpha_sub = 5  # 分流景点环境单位影响(美元/人)
beta_main = 0.02  # 主景点环境退化系数
beta_sub = 0.01  # 分流景点环境退化系数
delta = 5  # 基础设施单位成本(美元/人)
eta = 70  # 居民满意度下降的参数
gamma = 0.1  # 环境保护投入效率
C_main_max = 100000  # 主景点基础设施承载能力(人)
C_sub_max = 50000  # 分流景点基础设施承载能力(人)
E_main_max = 100  # 主景点允许的最大退化速率(单位:指标)
E_sub_max = 50  # 分流景点允许的最大退化速率(单位:指标)


# 目标函数
# x_main: 主景点每日游客数量
# x_sub: 分流景点每日游客数量
# t_main: 主景点游客税费
# t_sub: 分流景点游客税费
# z_main: 主景点收入分配比例
# z_sub: 分流景点收入分配比例
def objective(vars):
    x_main, x_sub, t_main, t_sub, z_main, z_sub = vars
    R_main = (p_main + t_main) * x_main  # 主景点收入
    R_sub = (p_sub + t_sub) * x_sub  # 分流景点收入

    C_e_main = alpha_main * x_main + beta_main * x_main ** 2 - gamma * z_main * R_main
    C_e_sub = alpha_sub * x_sub + beta_sub * x_sub ** 2 - gamma * z_sub * R_sub
    C_s = delta * (x_main + x_sub) + eta * np.log(1 + x_main + x_sub)

    U = R_main + R_sub - C_e_main - C_e_sub - C_s  # 综合效益
    return -U  # 求最大化,取负值


# 约束条件
def constraint_main_capacity(vars):
    return C_main_max - vars[0]  # 主景点游客数量 <= 承载能力


def constraint_sub_capacity(vars):
    return C_sub_max - vars[1]  # 分流景点游客数量 <= 承载能力


def constraint_main_environment(vars):
    return E_main_max - beta_main * vars[0] ** 2  # 主景点环境退化约束


def constraint_sub_environment(vars):
    return E_sub_max - beta_sub * vars[1] ** 2  # 分流景点环境退化约束


def constraint_z_main(vars):
    return vars[4]  # z_main >= 0


def constraint_z_sub(vars):
    return vars[5]  # z_sub >= 0


def constraint_z_main_upper(vars):
    return 1 - vars[4]  # z_main <= 1


def constraint_z_sub_upper(vars):
    return 1 - vars[5]  # z_sub <= 1


# 初始猜测值
x0 = [50000, 20000, 10, 5, 0.5, 0.5]  # 初始值:[主景点游客,分流景点游客,主景点税费,分流景点税费,主景点分配比例,分流景点分配比例]

# 变量范围
bounds = [
    (1, C_main_max),  # 主景点游客数量范围
    (1, C_sub_max),  # 分流景点游客数量范围
    (0, 50),  # 主景点游客税费范围
    (0, 50),  # 分流景点游客税费范围
    (0, 1),  # 主景点收入分配比例范围
    (0, 1)  # 分流景点收入分配比例范围
]

# 约束集合
constraints = [
    {"type": "ineq", "fun": constraint_main_capacity},
    {"type": "ineq", "fun": constraint_sub_capacity},
    {"type": "ineq", "fun": constraint_main_environment},
    {"type": "ineq", "fun": constraint_sub_environment},
    {"type": "ineq", "fun": constraint_z_main},
    {"type": "ineq", "fun": constraint_z_sub},
    {"type": "ineq", "fun": constraint_z_main_upper},
    {"type": "ineq", "fun": constraint_z_sub_upper},
]

# 优化求解
result = minimize(objective, x0, method="SLSQP", bounds=bounds, constraints=constraints)

# 输出优化结果
if result.success:
    x_main_opt, x_sub_opt, t_main_opt, t_sub_opt, z_main_opt, z_sub_opt = result.x
    print(f"Optimization Results:")
    print(f"Optimal Daily Tourists at Main Site (x_main) = {x_main_opt:.2f}")
    print(f"Optimal Daily Tourists at Sub Site (x_sub) = {x_sub_opt:.2f}")
    print(f"Optimal Tourist Tax at Main Site (t_main) = {t_main_opt:.2f} USD/person")
    print(f"Optimal Tourist Tax at Sub Site (t_sub) = {t_sub_opt:.2f} USD/person")
    print(f"Optimal Income Allocation for Environment at Main Site (z_main) = {z_main_opt:.2f}")
    print(f"Optimal Income Allocation for Environment at Sub Site (z_sub) = {z_sub_opt:.2f}")
    print(f"Maximum Comprehensive Benefit (U) = {-result.fun:.2f} USD")
else:
    print("Optimization was not successful:", result.message)

# 可视化分析
x_vals_main = np.linspace(1, C_main_max, 100)
x_vals_sub = np.linspace(1, C_sub_max, 100)
U_vals = []

for x_main in x_vals_main:
    for x_sub in x_vals_sub:
        t_main, t_sub = t_main_opt, t_sub_opt
        z_main, z_sub = z_main_opt, z_sub_opt
        R_main = (p_main + t_main) * x_main
        R_sub = (p_sub + t_sub) * x_sub
        C_e_main = alpha_main * x_main + beta_main * x_main ** 2 - gamma * z_main * R_main
        C_e_sub = alpha_sub * x_sub + beta_sub * x_sub ** 2 - gamma * z_sub * R_sub
        C_s = delta * (x_main + x_sub) + eta * np.log(1 + x_main + x_sub)
        U = R_main + R_sub - C_e_main - C_e_sub - C_s
        U_vals.append(U)

# 绘制综合效益曲线
plt.figure(figsize=(10, 6))
plt.plot(x_vals_main, U_vals[:100], label="Comprehensive Benefit (U)", color="blue", linewidth=2)
plt.axvline(x=x_main_opt, color="red", linestyle="--",
            label=f"Optimal Tourists at Main Site (x_main = {x_main_opt:.0f})")
plt.axvline(x=x_sub_opt, color="green", linestyle="--", label=f"Optimal Tourists at Sub Site (x_sub = {x_sub_opt:.0f})")
plt.xlabel("Daily Number of Tourists", fontsize=14)
plt.ylabel("Comprehensive Benefit (U)", fontsize=14)
plt.title("Comprehensive Benefit vs. Daily Number of Tourists", fontsize=16)
plt.legend(fontsize=12)
plt.grid(alpha=0.6)
plt.show()

# 绘制成本与收入随游客数量变化图
C_e_main_vals = [alpha_main * x + beta_main * x ** 2 - gamma * z_main_opt * (p_main + t_main_opt) * x for x in
                 x_vals_main]
C_e_sub_vals = [alpha_sub * x + beta_sub * x ** 2 - gamma * z_sub_opt * (p_sub + t_sub_opt) * x for x in x_vals_sub]
C_s_vals = [delta * (x + x_sub_opt) + eta * np.log(1 + x + x_sub_opt) for x in x_vals_main]
R_main_vals = [(p_main + t_main_opt) * x for x in x_vals_main]
R_sub_vals = [(p_sub + t_sub_opt) * x for x in x_vals_sub]

plt.figure(figsize=(12, 8))
plt.plot(x_vals_main, R_main_vals, label="Revenue from Main Site (R_main)", color="green", linewidth=2)
plt.plot(x_vals_sub, R_sub_vals, label="Revenue from Sub Site (R_sub)", color="blue", linewidth=2)
plt.plot(x_vals_main, C_e_main_vals, label="Environmental Cost at Main Site (C_e_main)", color="orange", linewidth=2)
plt.plot(x_vals_sub, C_e_sub_vals, label="Environmental Cost at Sub Site (C_e_sub)", color="purple", linewidth=2)
plt.plot(x_vals_main, C_s_vals, label="Social Cost (C_s)", color="red", linewidth=2)
plt.axvline(x=x_main_opt, color="red", linestyle="--",
            label=f"Optimal Tourists at Main Site (x_main = {x_main_opt:.0f})")
plt.axvline(x=x_sub_opt, color="green", linestyle="--", label=f"Optimal Tourists at Sub Site (x_sub = {x_sub_opt:.0f})")
plt.xlabel("Daily Number of Tourists", fontsize=14)
plt.ylabel("Cost and Revenue (USD)", fontsize=14)
plt.title("Cost and Revenue vs. Daily Number of Tourists", fontsize=16)
plt.legend(fontsize=12)
plt.grid(alpha=0.6)
plt.show()

各位加油,祝大家有一个好成绩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值