数模0error
原题背景
最近,“city 不 city”这一网络流行语在外国网红的推动下备受关注。随着我国过境免签政策的落实,越来越多外国游客来到中国,通过网络平台展示他们在华旅行的见闻,这不仅推动了中国旅游业的发展,更是在国际舞台上展现了一个 真实而生动的中国,一举多得。 假设外国游客入境后能在中国境内逗留 144 小时,且能从任一城市附近的机场出境。由于每个城市景点较多,为了便于外国游客能够游览到更多的城市,现假定“每个城市只选择一个评分最高的景点游玩”,称之为“城市最佳景点游览原 则”。 现有一个包含中国(不含港澳台)352 个城市的旅游景点的数据集,每个城 市的 csv 文件中有 100 个景点,每个景点的信息包含有景点名称、网址、地址、 景点介绍、开放时间、图片网址、景点评分、建议游玩时长、建议游玩季节、门票信息、小贴士等。
背景分析
提取关键信息:
(1)“城市最佳景点游览原则”:假设外国游客入境后能在中国境内逗留 144 小时,且能从任一城市附近的机场出境。由于每个城市景点较多,为了便于外国游客能够游览到更多的城市,现假定“每个城市只选择一个评分最高的景点游玩”,称之为“城市最佳景点游览原则”。
(2)数据说明:现有一个包含中国(不含港澳台)352 个城市的旅游景点的数据集,每个城 市的 csv 文件中有 100个景点,每个景点的信息包含有景点名称、网址、地址、 景点介绍、开放时间、图片网址、景点评分、建议游玩时长、建议游玩季节、门票信息、小贴士等。
分析题目背景:
本题为了帮助外国游客在有限的时间内游览中国的最佳景点,我们需要利用数据集中的信息进行一些分析和建模。
-
首先根据关键信息(1),我们需要从每个城市的数据集中提取评分最高的景点信息。假设我们已经有了包含352个城市旅游景点的CSV文件。对每个城市,找到评分最高的景点,并记录其信息。我们可以编写一个脚本来处理这些CSV文件,并提取所需的数据。
-
其次,考虑到游客在144小时内需要游览多个城市,并且可能需要在不同城市之间进行交通转换,我们可以使用以下几种数学模型进行优化:
-
旅行商问题 (TSP): 这个问题可以被看作是一个典型的旅行商问题,其中每个城市是一个节点,景点是游客需要访问的地方。目标是找到一个路径,使得总的旅行时间或距离最小,同时确保游客在每个城市的停留时间在合理范围内。
-
时变网络模型: 考虑到不同交通方式(如高铁、飞机)的时间和费用,我们可以构建一个时变网络模型来优化旅行路径和时间。
-
下面,我们将根据具体的问题进行分析和解答。
问题一
原题
请问 352 个城市中所有 35200 个景点评分的最高分(Best Score,简称 BS)是多少?全国有多少个景点获评了这个最高评分(BS)?获评了这个最高评分(BS)景点最多的城市有哪些?依据拥有最高评分(BS)景点数量的多少排序,列出前 10 个城市。
思路
Step1:数据读取与处理
首先,我们需要读取所有352个城市的CSV文件,并提取每个景点的评分数据。我们可以使用Python中的Pandas库来处理这些数据。 其次,因为数据中存在数据缺失和类型不匹配问题,我们需要将空值剔除或者用0来填补,并将str型数据转换成float型。
Step2:计算最高评分(Best Score, BS)
我们需要遍历所有景点的评分数据,找到最高评分(BS)。然后统计获得最高评分(BS)的景点数量以及这些景点所在的城市。
Step3:统计各城市的最高评分(BS)景点数量
我们需要统计每个城市中获得最高评分(BS)的景点数量,并按数量排序,列出前10个城市。
程序
读取数据
import pandas as pd
import os
# 假设所有城市的CSV文件都存储在 "cities_data" 目录下
directory = "./附件"
# 用于存储所有景点评分数据
all_sights = []
# 遍历每个城市的CSV文件
for filename in os.listdir(directory):
if filename.endswith(".csv"):
city = filename.split('.')[0]
df = pd.read_csv(os.path.join(directory, filename))
df['城市'] = city
all_sights.append(df)
# 合并所有城市的数据
all_sights_df = pd.concat(all_sights)
all_sights_df
数据预处理
处理空值,将空值替换为数字0
将数据中的评分列转为数值型
# ValueError: could not convert string to float: '--
all_sights_df['评分'] = pd.to_numeric(all_sights_df['评分'], errors='coerce')
# Convert '评分' column from object to float
all_sights_df['评分'] = all_sights_df['评分'].astype(float)
寻找最终答案并输出结果:
# 找到最高评分(BS)
best_score = all_sights_df['评分'].max()
# 统计获得最高评分(BS)的景点数量
best_sights = all_sights_df[all_sights_df['评分'] == best_score]
best_sights_count = best_sights.shape[0]
# 统计每个城市中获得最高评分(BS)的景点数量
city_best_sights_count = best_sights['城市'].value_counts()
# 找到拥有最高评分(BS)景点数量最多的前10个城市
top_10_cities = city_best_sights_count.head(10)
# 输出结果
print(f"最高评分(BS)为:{best_score}")
print(f"全国共有 {best_sights_count} 个景点获得最高评分(BS)")
print("拥有最高评分(BS)景点最多的前10个城市为:")
print(top_10_cities)
问题二
原题
假如外国游客遵循“城市最佳景点游览原则”,结合城市规模、环境环保、人文底蕴、交通便利,以及气候、美食等因素,请你对 352 个城市进行综合评价,选出“最令外国游客向往的 50 个城市”。
思路
要对352个城市进行综合评价,选出“最令外国游客向往的50个城市”,我们需要建立一个多因素评价模型。这些因素包括城市规模、环境环保、人文底蕴、交通便利、气候、美食等。我们可以通过加权评分的方法来综合评估这些城市。
Step1: 定义评价指标
-
城市规模:可以用城市人口或GDP来衡量。
-
环境环保:可以用PM2.5平均浓度或城市绿化率来衡量。
-
人文底蕴:可以用历史遗迹数量、博物馆数量等来衡量。
-
交通便利:可以用公共交通覆盖率、交通便捷性等来衡量。
-
气候:可以用气候舒适度指数来衡量。
-
美食:可以用美食评价、餐厅数量等来衡量。
Step2: 收集数据
假设我们已经收集了上述指标的数据,可以用一个CSV文件来表示,其中每一列代表一个城市,每一列代表一个评价指标。 因为在原始的数据文件中指包含地点名称、网址、地址、景点介绍、开放时间、图片网址、评分、建议游玩时长、建议游玩季节、门票信息、小贴士等。并没有题目中的城市规模、环境保护、人文底蕴等信息,所以这部分数据需要我们自己补充。
Step3: 标准化数据
由于各个指标的量纲不同,需要对数据进行标准化处理。
Step4: 加权评分
给每个指标分配权重,根据加权评分计算每个城市的综合评分。
Step5: 选出前50个城市
根据综合评分进行排序,选出前50个城市。
程序
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
# 假设已经有一个包含所有城市及其各个评价指标的CSV文件
data = pd.read_csv('city_evaluation_data.csv')
# 定义各个评价指标的权重
weights = {
'城市规模': 0.2,
'环境环保': 0.2,
'人文底蕴': 0.2,
'交通便利': 0.2,
'气候': 0.1,
'美食': 0.1
}
# 对数据进行标准化处理
scaler = MinMaxScaler()
normalized_data = pd.DataFrame(scaler.fit_transform(data[list(weights.keys())]), columns=list(weights.keys()))
# 计算综合评分
normalized_data['综合评分'] = 0
for key in weights.keys():
normalized_data['综合评分'] += normalized_data[key] * weights[key]
# 将综合评分添加回原始数据
data['综合评分'] = normalized_data['综合评分']
# 根据综合评分进行排序,选出前50个城市
top_50_cities = data.sort_values(by='综合评分', ascending=False).head(50)
import ace_tools as tools; tools.display_dataframe_to_user(name="Top 50 Cities for Foreign Tourists", dataframe=top_50_cities)
# 输出结果
print("最令外国游客向往的前50个城市为:")
print(top_50_cities[['城市', '综合评分']])
问题三
原题
现有一名外国游客从广州入境,他想在 144 小时以内游玩尽可能多的城市,同时要求综合游玩体验最好,请你规划他的游玩路线。需要结合游客的要求给出具体的游玩路线,包括总花费时间,门票和交通的总费用以及可以游玩的景点数量。他的要求有:
-
① 遵循城市最佳景点游览原则;
-
② 城市之间的交通方式只选择高铁;
-
③ 只在“最令外国游客向往的 50 个城市”中选择要游玩的城市。
思路
为了解决这个问题,我们需要建立一个优化模型,该模型考虑了游客的需求、时间限制以及交通方式。以下是具体步骤:
Step1: 数据准备
-
城市数据:包括“最令外国游客向往的50个城市”以及每个城市的最佳景点。
-
高铁交通数据:包括城市之间的高铁行程时间和费用。
-
景点数据:包括每个城市最佳景点的门票费用和游玩时间。
Step2: 优化目标
我们的目标是在144小时内最大化游客能够游玩的城市数量,同时保证综合游玩体验最佳。这可以通过以下步骤实现:
-
定义时间约束:包括每个城市的游玩时间和城市之间的交通时间,确保总时间不超过144小时。
-
综合评分:根据前面定义的综合评分标准,确保选择的城市能够提供最佳的游玩体验。
-
费用计算:计算总花费,包括门票费用和高铁交通费用。
Step3: 建立模型
我们可以使用整数规划(Integer Programming)来解决这个优化问题。
为了建立问题3的模型,我们需要优化外国游客在144小时内游览尽可能多的城市,同时使综合游玩体验最好。这个问题可以通过整数规划(Integer Programming)来解决。以下是模型的详细步骤、公式和Python代码实现。
-
数据准备:
-
从数据集中读取“最令外国游客向往的50个城市”及其最佳景点的信息。
-
获取城市之间的高铁交通时间和费用。
-
-
定义决策变量:
-
:表示是否选择城市 (1 表示选择,0 表示不选择)。
-
-
定义约束条件:
-
总游玩时间不超过144小时。
-
-
定义目标函数:
-
最大化游客可以游览的城市数量,同时综合考虑游玩体验。
-
模型公式:
-
决策变量:
-
:城市 是否被选择游览, 。
-
-
约束条件:
其中 是从当前城市到城市 的旅行时间, 是城市 的游玩时间。
-
总游玩时间不超过144小时:
-
-
目标函数:
-
最大化游览城市数量,并考虑游玩体验评分:
-
其中 是城市 的综合评分。
参考代码
import pandas as pd
from ortools.linear_solver import pywraplp
# 读取数据
top_50_cities = pd.read_csv('top_50_cities.csv') # 包含最令外国游客向往的50个城市及其综合评分
high_speed_rail = pd.read_csv('high_speed_rail.csv') # 包含城市之间的高铁交通时间和费用
city_best_sights = pd.read_csv('city_best_sights.csv') # 包含每个城市最佳景点的游玩时间和门票费用
# 初始化模型
solver = pywraplp.Solver.CreateSolver('SCIP')
# 定义变量
cities = top_50_cities['城市'].tolist()
n = len(cities)
x = {}
for i in range(n):
x[i] = solver.IntVar(0, 1, f'x[{i}]')
# 时间和费用数据
travel_time = high_speed_rail.set_index('目的地')['时间'].to_dict()
sight_time = city_best_sights.set_index('城市')['建议游玩时长'].to_dict()
sight_cost = city_best_sights.set_index('城市')['门票费用'].to_dict()
city_score = top_50_cities.set_index('城市')['综合评分'].to_dict()
# 定义约束条件:时间限制
time_limit = 144 # 小时
time_constraints = solver.Constraint(0, time_limit)
for i in range(n):
city = cities[i]
time_constraints.SetCoefficient(x[i], travel_time.get(city, 0) + sight_time.get(city, 0))
# 定义目标函数:最大化综合游玩体验(评分)
objective = solver.Objective()
for i in range(n):
city = cities[i]
objective.SetCoefficient(x[i], city_score[city])
objective.SetMaximization()
# 求解模型
status = solver.Solve()
if status == pywraplp.Solver.OPTIMAL:
total_time = 0
total_cost = 0
total_sights = 0
visited_cities = []
for i in range(n):
if x[i].solution_value() == 1:
city = cities[i]
total_time += travel_time.get(city, 0) + sight_time.get(city, 0)
total_cost += sight_cost.get(city, 0)
total_sights += 1
visited_cities.append(city)
print("总游玩时间:", total_time, "小时")
print("总费用:", total_cost, "元")
print("总游玩景点数量:", total_sights, "个")
print("游玩城市列表:", visited_cities)
else:
print("No optimal solution found.")
# 显示数据框
import ace_tools as tools; tools.display_dataframe_to_user(name="Top 50 Cities for Foreign Tourists", dataframe=top_50_cities)
问题四
原题
如果将问题 3 的游览目标改为:既要尽可能的游览更多的城市,又需要使门票和交通的总费用尽可能的少。请重新规划游玩路线,并给出门票和交通的总费用,总花费时间以及可以游玩的城市数量。
思路
Step1:数据准备
假设我们仍然有相同的数据集,包括“最令外国游客向往的50个城市”及其相关信息。
Step2: 优化目标
-
最大化游玩城市数量:通过整数规划来选择尽可能多的城市。
-
最小化费用:在第一个目标的基础上,最小化门票和交通的总费用。
Step3: 建立模型
-
数据准备:
-
从数据集中读取“最令外国游客向往的50个城市”及其最佳景点的信息。
-
获取城市之间的高铁交通时间和费用。
-
-
定义决策变量:
-
:表示是否选择城市(1 表示选择,0 表示不选择)。
-
-
定义约束条件:
-
总游玩时间不超过144小时。
-
-
定义目标函数:
-
在144小时内,最大化游览城市数量,并最小化总费用。
-
模型公式:
-
决策变量:
-
:城市是否被选择游览,。
-
-
约束条件:
-
总游玩时间不超过144小时:
-
-
目标函数:
-
最大化游览城市数量,并最小化费用:
-
其中:
-
是一个调整参数,用于平衡游览数量和费用之间的权重。
-
是城市 的交通费用。
-
是城市 的门票费用。
参考代码
import pandas as pd
from ortools.linear_solver import pywraplp
# 读取数据
top_50_cities = pd.read_csv('top_50_cities.csv') # 包含最令外国游客向往的50个城市及其综合评分
high_speed_rail = pd.read_csv('high_speed_rail.csv') # 包含城市之间的高铁交通时间和费用
city_best_sights = pd.read_csv('city_best_sights.csv') # 包含每个城市最佳景点的游玩时间和门票费用
# 初始化模型
solver = pywraplp.Solver.CreateSolver('SCIP')
# 定义变量
cities = top_50_cities['城市'].tolist()
n = len(cities)
x = {}
for i in range(n):
x[i] = solver.IntVar(0, 1, f'x[{i}]')
# 时间和费用数据
travel_time = high_speed_rail.set_index('目的地')['时间'].to_dict()
travel_cost = high_speed_rail.set_index('目的地')['费用'].to_dict()
sight_time = city_best_sights.set_index('城市')['建议游玩时长'].to_dict()
sight_cost = city_best_sights.set_index('城市')['门票费用'].to_dict()
# 定义约束条件:时间限制
time_limit = 144 # 小时
time_constraints = solver.Constraint(0, time_limit)
for i in range(n):
city = cities[i]
time_constraints.SetCoefficient(x[i], travel_time.get(city, 0) + sight_time.get(city, 0))
# 定义目标函数:最大化游览城市数量,并最小化费用
# 这里我们使用一个权重参数 lambda 来平衡两者
lambda_weight = 0.01
objective = solver.Objective()
for i in range(n):
objective.SetCoefficient(x[i], 1 - lambda_weight * (travel_cost.get(cities[i], 0) + sight_cost.get(cities[i], 0)))
objective.SetMaximization()
# 求解模型
status = solver.Solve()
if status == pywraplp.Solver.OPTIMAL:
total_time = 0
total_cost = 0
total_sights = 0
visited_cities = []
for i in range(n):
if x[i].solution_value() == 1:
city = cities[i]
total_time += travel_time.get(city, 0) + sight_time.get(city, 0)
total_cost += travel_cost.get(city, 0) + sight_cost.get(city, 0)
total_sights += 1
visited_cities.append(city)
print("总游玩时间:", total_time, "小时")
print("总费用:", total_cost, "元")
print("总游玩景点数量:", total_sights, "个")
print("游玩城市列表:", visited_cities)
else:
print("No optimal solution found.")
# 显示数据框
import ace_tools as tools; tools.display_dataframe_to_user(name="Top 50 Cities for Foreign Tourists", dataframe=top_50_cities)
问题五
原题
现有一名外国游客只想游览中国的山景,他乘飞机入境中国的城市不限。请你为他选择入境的机场和城市,并个性化定制他的 144 小时旅游路线,既要尽可能的游览更多的山,又需要使门票和交通的总费用尽可能的少。需要结合游客的要求给出具体的游玩路线,包括总花费时间,门票和交通的总费用以及可以游玩的景点数量。他的要求有:
-
① 每个城市只游玩一座评分最高的山;
-
② 城市之间的交通方式只选择高铁;
-
③ 旅游城市不局限于“最令外国游客向往的 50 个城市”,游览范围拓展到 352 个城市。
思路
为了帮助这名外国游客在144小时内游览尽可能多的山景,并且在控制费用的情况下选择最佳路线,我们需要建立一个多目标优化模型。以下是具体步骤:
Step1: 数据准备
-
城市和山景数据:包括352个城市及其评分最高的山景、游玩时间、门票费用等信息。
-
高铁交通数据:包括城市之间的高铁行程时间和费用。
-
机场数据:包括352个城市中主要机场的位置和信息。
Step2: 优化目标
-
最大化游览山景数量:尽可能多地游览不同城市的评分最高的山景。
-
最小化费用:在游览尽可能多山景的基础上,最小化总的门票和交通费用。
Step3: 选择入境城市
选择入境城市的策略可以基于入境城市到其他城市的高铁交通便利性和山景的分布情况。
Step4: 建立模型
我们同样可以使用整数规划(Integer Programming)来解决这个优化问题。
A题 机器臂关节角路径的优化设计
问题 1 为方便后续建模,请先绘制出零位状态(�1=0°、�2=−90°、�3=0°、�4=180°、�5=−90°、�6=0°)的六自由度机器臂简图,机器臂初始参数(包括关节的初始位置,角度等)如表 1 所示。假设机器臂收到一次抓取货物的任务,目标点相对于机器臂的位置为(1500mm,1200mm,200mm),请建立机器臂运 动的数学模型,并以最小化末端误差为目标,对机器臂的关节角路径进行优化。 表 1 机器臂初始 Denavit-Hartenberg(D-H)参数
关节 i | ��/(mm) | ��/(°) | ��/(mm) | ��关节变化范围/(°) |
1 | 0 | 0 | 600 | -160~160 |
2 | 300 | -90 | 0 | -150~15 |
3 | 1200 | 0 | 0 | -200~80 |
4 | 300 | -90 | 1200 | -180~180 |
5 | 0 | -90 | 0 | -120~120 |
6 | 0 | -90 | 0 | -180~180 |
问题 2 在第一问的基础上,已知机器臂质量和末端载重之和为 5kg,各个关 节的转动惯量和平均角速度如表 2 所示。假设末端误差(末端误差指目标点坐标 与机器臂端部坐标之间的欧式距离)允许的范围为±200mm,请以最小化末端误 差和能耗为目标,对机器臂的关节角路径进行优化。
表 2 关节转动能耗参数
关节 i | 转动惯量(kg ∙ m²) | 平均角速度(rad/s) |
1 | 0.5 | 2.0 |
2 | 0.3 | 1.5 |
3 | 0.4 | 1.0 |
4 | 0.6 | 2.5 |
5 | 0.2 | 3.0 |
6 | 0.4 | 2.0 |
问题 3 在问题二的基础上,假设机器臂收到一次货物抓取任务,需要绕过 障碍物抓取一个货物,收到指令后,机器臂底座(移动过程中视为质点,为了简 化问题,假设移动的能耗不考虑,只考虑机器臂抓取过程中的能耗)先移动到目 标点附近,然后再进行抓取动作。机器臂底座栅格图中默认无法沿斜线移动,机 器臂底座需要回到起点。机器臂出发时的状态与问题一中的零位状态一致。机器臂的所有关节均无法从障碍上方越过进行物体抓取。请以最小化末端误差和能耗 为目标,设计出最优底座移动路径和最优关节角路径,并将底座移动路径用栅格 图可视化。货物和障碍物的位置见“附件.xlsx”中的 Sheet1。
问题 4 假设机器臂收到一次完整的货物抓取任务,需要绕过障碍物抓取多 个货物,请以最小化末端误差和能耗为目标,设计出最优底座移动路径和关节角 路径,并将底座移动路径用栅格图可视化。货物和障碍物的位置见“附件.xlsx”中 的 Sheet2。请在结果中明确给出总末端误差和总能耗。
1.1.1 问题1分析
问题1主要考察机器臂运动学模型的建立和单目标优化。首先需要根据给定的D-H参数绘制机器臂简图,这有助于直观理解机器臂的结构和运动特性。接下来需要建立正向运动学模型,描述末端执行器位置与关节角之间的关系,这可以使用齐次变换矩阵来实现。建立模型时需要考虑每个关节的运动范围限制,这构成了优化问题的约束条件。在此基础上,需要求解逆运动学问题,即根据目标位置计算所需的关节角。由于逆运动学问题通常存在多个解,需要设计合理的策略选择最优解。
优化目标是最小化末端误差,可以将其表示为实际位置与目标位置之间的欧氏距离。可以考虑使用梯度下降、牛顿法等优化算法来求解最优关节角路径。在算法设计时,需要考虑如何处理局部最优解的问题,可能需要采用多次随机初始化或引入扰动的策略。同时,由于问题具有非线性特性,可能需要使用数值方法求解。在实现过程中,需要注意数值稳定性和计算效率的平衡。整体而言,这是一个非线性约束优化问题,解决它需要综合运用运动学知识和优化理论。
1.1.2 问题2分析
问题2在问题1的基础上增加了能耗最小化的目标,形成了一个多目标优化问题。需要考虑关节转动产生的动能和重力势能变化,这涉及到动力学建模。能耗的计算需要考虑各关节的转动惯量和角速度,可能需要引入时间维度来描述机................................................................................................................................