注:该内容由“数模加油站”原创,无偿分享,可以领取参考但不要利用该内容倒卖,谢谢!
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()
各位加油,祝大家有一个好成绩。