lead/tsp_data/tsp_test.ipynb

722 lines
92 KiB
Plaintext
Raw Normal View History

2025-03-17 16:40:01 +08:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['CHN144.tsp', 'eil101.tsp', 'eil76.tsp', 'GR96.tsp', 'PBK411.tsp', 'PR76.tsp', 'RBU737.tsp', 'ulysses16.tsp', 'ulysses8.tsp', 'XIT1083.tsp']\n"
]
}
],
"source": [
"import os\n",
"import numpy as np\n",
"import time\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"from tsp_algo import *\n",
"\n",
"# 获取tsp_data目录下所有tsp文件\n",
"data_dir = \"C:/Users/Lenovo/Desktop/LEAD/\"\n",
"data_dir2 = \"C:/Users/Lenovo/Desktop/LEAD/tsp_data/data/\"\n",
"test_files = [f for f in os.listdir(data_dir2) if f.endswith('tsp')]\n",
"print(test_files)\n",
"\n",
"# 定义评估函数\n",
"def evaluate_tsp(tsp_func, distances):\n",
" \"\"\"评估TSP算法的性能\"\"\"\n",
" try:\n",
" # 计时并执行TSP\n",
" start_time = time.time()\n",
" path = tsp_func(distances)\n",
" end_time = time.time()\n",
" execution_time = end_time - start_time\n",
" \n",
" # 计算路径长度\n",
" total_distance = 0\n",
" n = len(distances)\n",
" for i in range(n):\n",
" total_distance += distances[path[i]][path[(i+1)%n]]\n",
" \n",
" print(f\"执行时间:{execution_time:.4f}秒, 路径长度:{total_distance:.2f}\")\n",
" return total_distance, execution_time\n",
" \n",
" except Exception as e:\n",
" print(f\"评估过程出错: {str(e)}\")\n",
" return float('inf'), float('inf')\n",
"\n",
"# 定义数据加载函数 \n",
"def load_tsp_data(filename):\n",
" \"\"\"读取TSP问题数据\"\"\"\n",
" try:\n",
" cities = []\n",
" filepath = os.path.join(data_dir2, filename)\n",
" with open(filepath, 'r') as f:\n",
" reading_coords = False\n",
" for line in f:\n",
" if line.strip() == \"NODE_COORD_SECTION\":\n",
" reading_coords = True\n",
" continue\n",
" if line.strip() == \"EOF\":\n",
" break\n",
" if reading_coords:\n",
" parts = line.strip().split()\n",
" if len(parts) == 3:\n",
" x, y = float(parts[1]), float(parts[2])\n",
" cities.append((x, y))\n",
" \n",
" # 计算距离矩阵\n",
" n = len(cities)\n",
" distances = np.zeros((n, n))\n",
" for i in range(n):\n",
" for j in range(n):\n",
" if i != j:\n",
" distances[i,j] = np.sqrt((cities[i][0] - cities[j][0])**2 + \n",
" (cities[i][1] - cities[j][1])**2)\n",
" \n",
" return distances\n",
" \n",
" except Exception as e:\n",
" print(f\"读取数据出错: {str(e)}\")\n",
" return None"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"测试实例: CHN144.tsp\n",
"\n",
"使用算法: 贪心算法\n",
"执行时间:0.0027秒, 路径长度:35884.30\n",
"\n",
"使用算法: 最近邻算法\n",
"执行时间:0.0025秒, 路径长度:35884.30\n",
"\n",
"使用算法: 插入法\n",
"执行时间:0.3583秒, 路径长度:35048.39\n",
"\n",
"使用算法: EoH-TSP\n",
"执行时间:0.1682秒, 路径长度:35884.30\n",
"\n",
"使用算法: AAD-TSP\n",
"执行时间:0.2880秒, 路径长度:33158.55\n",
"\n",
"测试实例: eil101.tsp\n",
"\n",
"使用算法: 贪心算法\n",
"执行时间:0.0010秒, 路径长度:825.24\n",
"\n",
"使用算法: 最近邻算法\n",
"执行时间:0.0010秒, 路径长度:825.24\n",
"\n",
"使用算法: 插入法\n",
"执行时间:0.1078秒, 路径长度:702.96\n",
"\n",
"使用算法: EoH-TSP\n",
"执行时间:0.0958秒, 路径长度:847.59\n",
"\n",
"使用算法: AAD-TSP\n",
"执行时间:0.1752秒, 路径长度:687.45\n",
"\n",
"测试实例: eil76.tsp\n",
"\n",
"使用算法: 贪心算法\n",
"执行时间:0.0010秒, 路径长度:711.99\n",
"\n",
"使用算法: 最近邻算法\n",
"执行时间:0.0010秒, 路径长度:711.99\n",
"\n",
"使用算法: 插入法\n",
"执行时间:0.0435秒, 路径长度:612.39\n",
"\n",
"使用算法: EoH-TSP\n",
"执行时间:0.0683秒, 路径长度:669.24\n",
"\n",
"使用算法: AAD-TSP\n",
"执行时间:0.1143秒, 路径长度:622.71\n",
"\n",
"测试实例: GR96.tsp\n",
"\n",
"使用算法: 贪心算法\n",
"执行时间:0.0010秒, 路径长度:707.09\n",
"\n",
"使用算法: 最近邻算法\n",
"执行时间:0.0020秒, 路径长度:707.09\n",
"\n",
"使用算法: 插入法\n",
"执行时间:0.0917秒, 路径长度:651.44\n",
"\n",
"使用算法: EoH-TSP\n",
"执行时间:0.0962秒, 路径长度:707.09\n",
"\n",
"使用算法: AAD-TSP\n",
"执行时间:0.2169秒, 路径长度:623.53\n",
"\n",
"测试实例: PBK411.tsp\n",
"\n",
"使用算法: 贪心算法\n",
"执行时间:0.0169秒, 路径长度:1838.48\n",
"\n",
"使用算法: 最近邻算法\n",
"执行时间:0.0170秒, 路径长度:1838.48\n",
"\n",
"使用算法: 插入法\n",
"执行时间:7.6995秒, 路径长度:1602.35\n",
"\n",
"使用算法: EoH-TSP\n",
"执行时间:0.9340秒, 路径长度:1835.85\n",
"\n",
"使用算法: AAD-TSP\n",
"执行时间:5.2911秒, 路径长度:1554.96\n",
"\n",
"测试实例: PR76.tsp\n",
"\n",
"使用算法: 贪心算法\n",
"执行时间:0.0010秒, 路径长度:153461.92\n",
"\n",
"使用算法: 最近邻算法\n",
"执行时间:0.0000秒, 路径长度:153461.92\n",
"\n",
"使用算法: 插入法\n",
"执行时间:0.0439秒, 路径长度:125936.21\n",
"\n",
"使用算法: EoH-TSP\n",
"执行时间:0.0671秒, 路径长度:145300.57\n",
"\n",
"使用算法: AAD-TSP\n",
"执行时间:0.1271秒, 路径长度:111623.46\n",
"\n",
"测试实例: RBU737.tsp\n",
"\n",
"使用算法: 贪心算法\n",
"执行时间:0.0544秒, 路径长度:4416.15\n",
"\n",
"使用算法: 最近邻算法\n",
"执行时间:0.0544秒, 路径长度:4416.15\n",
"\n",
"使用算法: 插入法\n",
"执行时间:44.8784秒, 路径长度:4097.20\n",
"\n",
"使用算法: EoH-TSP\n",
"执行时间:2.6006秒, 路径长度:4436.28\n",
"\n",
"使用算法: AAD-TSP\n",
"执行时间:29.6802秒, 路径长度:3870.50\n",
"\n",
"测试实例: ulysses16.tsp\n",
"\n",
"使用算法: 贪心算法\n",
"执行时间:0.0000秒, 路径长度:104.73\n",
"\n",
"使用算法: 最近邻算法\n",
"执行时间:0.0000秒, 路径长度:104.73\n",
"\n",
"使用算法: 插入法\n",
"执行时间:0.0015秒, 路径长度:79.39\n",
"\n",
"使用算法: EoH-TSP\n",
"执行时间:0.0131秒, 路径长度:83.79\n",
"\n",
"使用算法: AAD-TSP\n",
"执行时间:0.0314秒, 路径长度:74.00\n",
"\n",
"测试实例: ulysses8.tsp\n",
"\n",
"使用算法: 贪心算法\n",
"执行时间:0.0000秒, 路径长度:38.48\n",
"\n",
"使用算法: 最近邻算法\n",
"执行时间:0.0000秒, 路径长度:38.48\n",
"\n",
"使用算法: 插入法\n",
"执行时间:0.0000秒, 路径长度:37.83\n",
"\n",
"使用算法: EoH-TSP\n",
"执行时间:0.0076秒, 路径长度:38.48\n",
"\n",
"使用算法: AAD-TSP\n",
"执行时间:0.0216秒, 路径长度:37.83\n",
"\n",
"测试实例: XIT1083.tsp\n",
"\n",
"使用算法: 贪心算法\n",
"执行时间:0.1163秒, 路径长度:4584.27\n",
"\n",
"使用算法: 最近邻算法\n",
"执行时间:0.1150秒, 路径长度:4584.27\n",
"\n",
"使用算法: 插入法\n",
"执行时间:146.8186秒, 路径长度:4328.99\n",
"\n",
"使用算法: EoH-TSP\n",
"执行时间:5.4694秒, 路径长度:4673.87\n",
"\n",
"使用算法: AAD-TSP\n",
"执行时间:89.6922秒, 路径长度:4051.52\n",
"\n",
"所有算法在各个实例上的表现:\n",
"\n",
"贪心算法:\n",
" CHN144.tsp: 路径长度 = 35884.30\n",
" eil101.tsp: 路径长度 = 825.24\n",
" eil76.tsp: 路径长度 = 711.99\n",
" GR96.tsp: 路径长度 = 707.09\n",
" PBK411.tsp: 路径长度 = 1838.48\n",
" PR76.tsp: 路径长度 = 153461.92\n",
" RBU737.tsp: 路径长度 = 4416.15\n",
" ulysses16.tsp: 路径长度 = 104.73\n",
" ulysses8.tsp: 路径长度 = 38.48\n",
" XIT1083.tsp: 路径长度 = 4584.27\n",
" CHN144.tsp: 执行时间 = 0.0027秒\n",
" eil101.tsp: 执行时间 = 0.0010秒\n",
" eil76.tsp: 执行时间 = 0.0010秒\n",
" GR96.tsp: 执行时间 = 0.0010秒\n",
" PBK411.tsp: 执行时间 = 0.0169秒\n",
" PR76.tsp: 执行时间 = 0.0010秒\n",
" RBU737.tsp: 执行时间 = 0.0544秒\n",
" ulysses16.tsp: 执行时间 = 0.0000秒\n",
" ulysses8.tsp: 执行时间 = 0.0000秒\n",
" XIT1083.tsp: 执行时间 = 0.1163秒\n",
"\n",
"最近邻算法:\n",
" CHN144.tsp: 路径长度 = 35884.30\n",
" eil101.tsp: 路径长度 = 825.24\n",
" eil76.tsp: 路径长度 = 711.99\n",
" GR96.tsp: 路径长度 = 707.09\n",
" PBK411.tsp: 路径长度 = 1838.48\n",
" PR76.tsp: 路径长度 = 153461.92\n",
" RBU737.tsp: 路径长度 = 4416.15\n",
" ulysses16.tsp: 路径长度 = 104.73\n",
" ulysses8.tsp: 路径长度 = 38.48\n",
" XIT1083.tsp: 路径长度 = 4584.27\n",
" CHN144.tsp: 执行时间 = 0.0025秒\n",
" eil101.tsp: 执行时间 = 0.0010秒\n",
" eil76.tsp: 执行时间 = 0.0010秒\n",
" GR96.tsp: 执行时间 = 0.0020秒\n",
" PBK411.tsp: 执行时间 = 0.0170秒\n",
" PR76.tsp: 执行时间 = 0.0000秒\n",
" RBU737.tsp: 执行时间 = 0.0544秒\n",
" ulysses16.tsp: 执行时间 = 0.0000秒\n",
" ulysses8.tsp: 执行时间 = 0.0000秒\n",
" XIT1083.tsp: 执行时间 = 0.1150秒\n",
"\n",
"插入法:\n",
" CHN144.tsp: 路径长度 = 35048.39\n",
" eil101.tsp: 路径长度 = 702.96\n",
" eil76.tsp: 路径长度 = 612.39\n",
" GR96.tsp: 路径长度 = 651.44\n",
" PBK411.tsp: 路径长度 = 1602.35\n",
" PR76.tsp: 路径长度 = 125936.21\n",
" RBU737.tsp: 路径长度 = 4097.20\n",
" ulysses16.tsp: 路径长度 = 79.39\n",
" ulysses8.tsp: 路径长度 = 37.83\n",
" XIT1083.tsp: 路径长度 = 4328.99\n",
" CHN144.tsp: 执行时间 = 0.3583秒\n",
" eil101.tsp: 执行时间 = 0.1078秒\n",
" eil76.tsp: 执行时间 = 0.0435秒\n",
" GR96.tsp: 执行时间 = 0.0917秒\n",
" PBK411.tsp: 执行时间 = 7.6995秒\n",
" PR76.tsp: 执行时间 = 0.0439秒\n",
" RBU737.tsp: 执行时间 = 44.8784秒\n",
" ulysses16.tsp: 执行时间 = 0.0015秒\n",
" ulysses8.tsp: 执行时间 = 0.0000秒\n",
" XIT1083.tsp: 执行时间 = 146.8186秒\n",
"\n",
"EoH-TSP:\n",
" CHN144.tsp: 路径长度 = 35884.30\n",
" eil101.tsp: 路径长度 = 847.59\n",
" eil76.tsp: 路径长度 = 669.24\n",
" GR96.tsp: 路径长度 = 707.09\n",
" PBK411.tsp: 路径长度 = 1835.85\n",
" PR76.tsp: 路径长度 = 145300.57\n",
" RBU737.tsp: 路径长度 = 4436.28\n",
" ulysses16.tsp: 路径长度 = 83.79\n",
" ulysses8.tsp: 路径长度 = 38.48\n",
" XIT1083.tsp: 路径长度 = 4673.87\n",
" CHN144.tsp: 执行时间 = 0.1682秒\n",
" eil101.tsp: 执行时间 = 0.0958秒\n",
" eil76.tsp: 执行时间 = 0.0683秒\n",
" GR96.tsp: 执行时间 = 0.0962秒\n",
" PBK411.tsp: 执行时间 = 0.9340秒\n",
" PR76.tsp: 执行时间 = 0.0671秒\n",
" RBU737.tsp: 执行时间 = 2.6006秒\n",
" ulysses16.tsp: 执行时间 = 0.0131秒\n",
" ulysses8.tsp: 执行时间 = 0.0076秒\n",
" XIT1083.tsp: 执行时间 = 5.4694秒\n",
"\n",
"AAD-TSP:\n",
" CHN144.tsp: 路径长度 = 33158.55\n",
" eil101.tsp: 路径长度 = 687.45\n",
" eil76.tsp: 路径长度 = 622.71\n",
" GR96.tsp: 路径长度 = 623.53\n",
" PBK411.tsp: 路径长度 = 1554.96\n",
" PR76.tsp: 路径长度 = 111623.46\n",
" RBU737.tsp: 路径长度 = 3870.50\n",
" ulysses16.tsp: 路径长度 = 74.00\n",
" ulysses8.tsp: 路径长度 = 37.83\n",
" XIT1083.tsp: 路径长度 = 4051.52\n",
" CHN144.tsp: 执行时间 = 0.2880秒\n",
" eil101.tsp: 执行时间 = 0.1752秒\n",
" eil76.tsp: 执行时间 = 0.1143秒\n",
" GR96.tsp: 执行时间 = 0.2169秒\n",
" PBK411.tsp: 执行时间 = 5.2911秒\n",
" PR76.tsp: 执行时间 = 0.1271秒\n",
" RBU737.tsp: 执行时间 = 29.6802秒\n",
" ulysses16.tsp: 执行时间 = 0.0314秒\n",
" ulysses8.tsp: 执行时间 = 0.0216秒\n",
" XIT1083.tsp: 执行时间 = 89.6922秒\n",
"\n",
"各算法在不同实例上的路径长度:\n",
" 贪心算法 最近邻算法 插入法 EoH-TSP AAD-TSP\n",
"CHN144 35884.30 35884.30 35048.39 35884.30 33158.55\n",
"eil101 825.24 825.24 702.96 847.59 687.45\n",
"eil76 711.99 711.99 612.39 669.24 622.71\n",
"GR96 707.09 707.09 651.44 707.09 623.53\n",
"PBK411 1838.48 1838.48 1602.35 1835.85 1554.96\n",
"PR76 153461.92 153461.92 125936.21 145300.57 111623.46\n",
"RBU737 4416.15 4416.15 4097.20 4436.28 3870.50\n",
"ulysses16 104.73 104.73 79.39 83.79 74.00\n",
"ulysses8 38.48 38.48 37.83 38.48 37.83\n",
"XIT1083 4584.27 4584.27 4328.99 4673.87 4051.52\n",
"\n",
"各算法在不同实例上的运行时长:\n",
" 贪心算法 最近邻算法 插入法 EoH-TSP AAD-TSP\n",
"CHN144 0.0027 0.0025 0.3583 0.1682 0.2880\n",
"eil101 0.0010 0.0010 0.1078 0.0958 0.1752\n",
"eil76 0.0010 0.0010 0.0435 0.0683 0.1143\n",
"GR96 0.0010 0.0020 0.0917 0.0962 0.2169\n",
"PBK411 0.0169 0.0170 7.6995 0.9340 5.2911\n",
"PR76 0.0010 0.0000 0.0439 0.0671 0.1271\n",
"RBU737 0.0544 0.0544 44.8784 2.6006 29.6802\n",
"ulysses16 0.0000 0.0000 0.0015 0.0131 0.0314\n",
"ulysses8 0.0000 0.0000 0.0000 0.0076 0.0216\n",
"XIT1083 0.1163 0.1150 146.8186 5.4694 89.6922\n"
]
}
],
"source": [
"\n",
"# 用于存储每个算法在每个实例上的结果 \n",
"results = {}\n",
"results_time = {}\n",
"\n",
"# 遍历每个测试实例\n",
"for test_file in test_files:\n",
" print(f\"\\n测试实例: {test_file}\")\n",
" \n",
" # 加载数据\n",
" distances = load_tsp_data(test_file)\n",
" if distances is None:\n",
" continue\n",
" \n",
" # 这里可以添加多个待评估的TSP算法\n",
" algorithms = {\n",
" \"贪心算法\": greedy_tsp,\n",
" \"最近邻算法\": nearest_neighbor_tsp,\n",
" \"插入法\": insertion_tsp,\n",
" # \"tsp_01\": tsp_01,\n",
" \"EoH-TSP\": tsp_02,\n",
" \"AAD-TSP\": tsp_04,\n",
" }\n",
" \n",
" # 评估每个算法\n",
" for alg_name, alg_func in algorithms.items():\n",
" print(f\"\\n使用算法: {alg_name}\")\n",
" score, etime = evaluate_tsp(alg_func, distances)\n",
" \n",
" if alg_name not in results:\n",
" results[alg_name] = {}\n",
" if alg_name not in results_time:\n",
" results_time[alg_name] = {}\n",
" results[alg_name][test_file] = score\n",
" results_time[alg_name][test_file] = etime\n",
"\n",
"# 打印总结果\n",
"print(\"\\n所有算法在各个实例上的表现:\")\n",
"for alg_name, scores in results.items():\n",
" print(f\"\\n{alg_name}:\")\n",
" for test_file, score in scores.items():\n",
" print(f\" {test_file}: 路径长度 = {score:.2f}\")\n",
" for test_file, etime in results_time[alg_name].items():\n",
" print(f\" {test_file}: 执行时间 = {etime:.4f}秒\")\n",
"\n",
"# 将结果整理成表格\n",
"data = {}\n",
"for test_file in test_files:\n",
" instance_name = test_file.replace('.tsp', '')\n",
" data[instance_name] = {}\n",
" for alg_name in results:\n",
" if test_file in results[alg_name]:\n",
" data[instance_name][alg_name] = results[alg_name][test_file]\n",
"\n",
"# 将运行时间整理成表格\n",
"data_time = {}\n",
"for test_file in test_files:\n",
" instance_name = test_file.replace('.tsp', '')\n",
" data_time[instance_name] = {}\n",
" for alg_name in results_time:\n",
" if test_file in results_time[alg_name]:\n",
" data_time[instance_name][alg_name] = results_time[alg_name][test_file]\n",
"\n",
"import random\n",
"\n",
"# 转换为DataFrame\n",
"df_results = pd.DataFrame(data).T\n",
"df_time = pd.DataFrame(data_time).T\n",
"\n",
"# 打印结果表格\n",
"print(\"\\n各算法在不同实例上的路径长度:\")\n",
"print(df_results.round(2)) # 路径长度保留2位小数\n",
"# 统计每个算法的运行时长\n",
"print(\"\\n各算法在不同实例上的运行时长:\")\n",
"print(df_time.round(4)) # 运行时间保留4位小数\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"各算法在不同实例上的路径长度:\n",
" 贪心算法 最近邻算法 插入法 EoH-TSP AAD-TSP\n",
"ulysses8 38.48 38.48 37.83 38.48 37.83\n",
"ulysses16 104.73 104.73 79.39 83.79 74.00\n",
"eil76 711.99 711.99 612.39 669.24 622.71\n",
"PR76 153461.92 153461.92 125936.21 145300.57 111623.46\n",
"GR96 707.09 707.09 651.44 707.09 623.53\n",
"eil101 825.24 825.24 702.96 847.59 687.45\n",
"CHN144 35884.30 35884.30 35048.39 35884.30 33158.55\n",
"PBK411 1838.48 1838.48 1602.35 1835.85 1554.96\n",
"RBU737 4416.15 4416.15 4097.20 4436.28 3870.50\n",
"XIT1083 4584.27 4584.27 4328.99 4673.87 4051.52\n",
"\n",
"各算法在不同实例上的运行时长:\n",
" 贪心算法 最近邻算法 插入法 EoH-TSP AAD-TSP\n",
"ulysses8 0.0000 0.0000 0.0000 0.0076 0.0216\n",
"ulysses16 0.0000 0.0000 0.0015 0.0131 0.0314\n",
"eil76 0.0010 0.0010 0.0435 0.0683 0.1143\n",
"PR76 0.0010 0.0000 0.0439 0.0671 0.1271\n",
"GR96 0.0010 0.0020 0.0917 0.0962 0.2169\n",
"eil101 0.0010 0.0010 0.1078 0.0958 0.1752\n",
"CHN144 0.0027 0.0025 0.3583 0.1682 0.2880\n",
"PBK411 0.0169 0.0170 7.6995 0.9340 5.2911\n",
"RBU737 0.0544 0.0544 44.8784 2.6006 29.6802\n",
"XIT1083 0.1163 0.1150 146.8186 5.4694 89.6922\n"
]
}
],
"source": [
"# 创建排序用的临时索引\n",
"temp_results_idx = pd.Index([int(''.join(filter(str.isdigit, idx))) for idx in df_results.index])\n",
"temp_time_idx = pd.Index([int(''.join(filter(str.isdigit, idx))) for idx in df_time.index])\n",
"\n",
"# 按数字排序但保留原始名称\n",
"df_results = df_results.iloc[temp_results_idx.argsort()]\n",
"df_time = df_time.iloc[temp_time_idx.argsort()]\n",
"\n",
"# 打印结果表格\n",
"print(\"\\n各算法在不同实例上的路径长度:\")\n",
"print(df_results.round(2)) # 路径长度保留2位小数\n",
"# 统计每个算法的运行时长 \n",
"print(\"\\n各算法在不同实例上的运行时长:\")\n",
"print(df_time.round(4)) # 运行时间保留4位小数"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABJQAAANnCAYAAABnCwJ8AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAuopJREFUeJzs3QmcXfP9P/5PSIKIBLVrxK6prZZSS9A29iLUvkWoNZaSolpLtJQKWjtFqb1VVK2V2mqJrbXvEiK1UxJEhGT+j/fn+zvzv5nMTObMkrkz83w+Hvdxkzt3P/eee87rvD/vT7eampqaBAAAAABNNFtTrwgAAAAAQaAEAAAAQCkCJQAAAABKESgBAAAAUIpACQAAAIBSBEoAAAAAlCJQAgAAAKCU7qkDmDZtWnr77bfTPPPMk7p169beTwcAAACg06mpqUmffvppWmyxxdJss83W8QOlCJP69evX3k8DAAAAoNMbP358+uY3v9nxA6WoTCpeUJ8+fdr76QAAAAB0OhMnTswFPUUO0+EDpWKYW4RJAiUAAACAttOUdkOacgMAAABQikAJAAAAgFIESgAAAACUIlACAAAAoBSBEgAAAAClCJQAAAAAKEWgBAAAAEApAiUAAAAAShEoAQAAAFCKQAkAAACAUrqnLqSmpiZ99dVXadq0ae39VGCWmW222VKPHj1St27d2vupAAAA0El0iUBp6tSp6cMPP0yffvppDpSgq4lAaZ555kkLLLBAmn322dv76QAAANDBde8KYdL48ePTl19+mfr27Zt69+6dd6hVa9BVqvLiO/DZZ5+lTz75JH3xxRepX79+QiUAAABapNMHSlGZFGHSEksskeaaa672fjrQLiJIjUD1zTffzN+JhRdeuL2fEgAAAB3YbJ29OiOGucWOtDCJri6+A3369MnfifhuAAAAQHN16kAp+iXFKaozgJT7KBXfCwAAgPb2wgsvpG222SYtvvjiqVevXmn55ZdPRx11VJowYcJ013vnnXfS3nvvna/XvXv3XDiy8847p7feeqvVnssHH3yQFlxwwbTooovmliFNMXTo0C7bUqdTD3krZnPTLwbSdN8FMx0CAADtbezYsWn99dfPkwgNHjw4zTnnnOmRRx5JI0eOTHfddVd69NFH0xxzzJHef//9tPbaa+f+yIsttljaeOON07PPPpv+/Oc/p8cffzw9/fTTrVJIMmzYsNwi5C9/+Uuad955Z3r9W2+9NV1++eWpq+rUFUqFrpoWQl2+CwAAQLUYMWJEnjjoscceSxdddFE666yzcoh0wAEH5JDo2muvzdc78sgjc5h04oknpnHjxqU77rgjjRkzJv3whz/ModQll1zS4udyww03pOuvvz796Ec/SjvssMNMr/+///0v7bfffqkr6xKBEgAAAFBdorpopZVWSv3795/u8i233DKfv/LKK3no2Y033phDnuOPPz4PdwtRuTR8+PDa+2mJjz76KB100EFp7rnnTuedd16TbnPwwQfnYXh1n3tX0qmHvAEAAADVKQKc119/PU2ePDkPdyvEcLaw5JJL5qFnESpNmTJlhtt//fXXrdLmJsKhGFZ35pln5hnim1LNdO211+aeTlOnTk1/+tOfUlekQgkAAACY5XbZZZdcHbTXXnvloWwxI3WENaeeempujr3ddtvVBkb1zdx+yy235PP11luv2c8h7uO6667LTb4/++yzdPjhh6fTTz89vf322/VeP4KnGJK31FJLpd///vepK1OhBAAAAMxyRxxxRHrvvfdyE+5osF1YffXV09VXX50WWGCBBm8blU1XXnllvs5uu+3WrMf/8ssv02GHHZb/HbPKxZC6wq9//et06aWXpu23336620SYFP2TbrzxxjyLdlcmUKqw5M9vS53ZG6f+3zhUAAAAaG/PP/98bZAUFUgxBC4qll588cXcaPu0005Ls80248Cqmpqa3BA7hsqdc845zZ7hLR4jgqmYvCgahO+00075vqNKKgKlCKoGDBiQVlxxxXz9CLluuummdNRRR6WBAwemrs6QN9pEdOiPL2WUJsa0i01xzDHH5NvMP//8eRxqQ+I6lacoTVx++eXTnnvumf7+97/nFUBreeONN2Z4vMZO9fnrX/+aBg0alOabb77cOC6atsVzjZVkXffdd1+99xuN5xZZZJG09dZb5xkNAAAAOrLYb4tG2zG0LIKdiRMnpg8++CCHTKuttlo644wz0kknnVTvbaOi6Z///Gdu3v2Tn/yk2c8hgqPw05/+NFcnrbDCCulb3/pW+uUvf5lOPvnk3LcpqpRCNOA+5JBD0iqrrJLDJgRKtJFiLOu0adPS7bffXuo2H3/8cXrooYdmev0Iq3r27JlXPK+++moud9xmm23S+uuvn8smW0OEORECVZ6K4Ki+v9VtEBdjgmMleffdd+dGcl999VV6880383Ndc8010wMPPNDgY/fo0SPfZ7zGCNjiNcV7tMUWW+QVHgAAQEf18MMPp5deeikdeOCBaZ999qmdvS0qgm699dZcsVRfs+t77703Bz7RsPuKK65o0XP473//m8+juXZdm266aT6P5xgiuJo0aVK66qqr8j4aAiXaQHzJIkCpGxQ1JsoMI4kuc5tjjz02j3mNx/vXv/5V27AtVkxRERR/a6moJooyysrTBhtskP8W53X/VikS7WjuFiWa0dQtSjfjud55551p8cUXz//eY4896p2tIES1VdxnvI4IzR555JHa13jWWWflUAoAAKAjGj9+fD4vhpNVitEdsc9UBD6FMWPGpB133DEHOtHDKEa3tESfPn3y+TLLLDPD36IYIMRj3XbbbblQIkbGxBC92Bc99v+dnnzyyXy94v9diUCJVhelh5Xhyj/+8Y8GQ5OGAqSmBEqFSK5j/GqUKx599NH5sueeey797ne/S+0lKrPOO++8/O9I24cPH55XdjEVZiTdMfY2xEwGN99880zvL5q9rb322vk1RgVWiBJQAACAjmjhhRfO56+99toMf4uhb9F+pLIpd4zY2GyzzfKB+ssvvzwPi2up4j5iFEldTz/9dD5fddVV8/MJzz77bC4cqDw988wz+W/F/7sSgRKtrgiDhg0blhZaaKE89eP999/fpNscd9xxudTx5ZdfzsPYyoqxrDF9Y4hxuO0lVjjFSidWQHVtuOGGufdTDGkrVlRN9aMf/Sifx4orqpwAAAA6mqhMin2/2G+rbAUSB91333333EIkeiSFCJG+//3v5/Ap9vmirUhrKGaH+8UvflFbkVT0SzrxxBPzaJNdd9017bXXXrnnU32nIUOG5NsU/+9KBEq0qvgCRTlgiC9/Me60sYqjGM5VBE7Rc2idddaZ6W0a6zsUJZBFOeTYsWNTe+jVq1ftbAQN9YOKnkpRydVQo7mGfOMb36h9r+M+AAAAOpooPogRJrFPE+1EYpjbggsumHsj3XXXXbmCKUKdYgKnmNQo9oW++OKL6Yacxaly9EbcX93LGrLRRhvlHk4xfC6abR988ME5IPr2t7+dK6SiV1M06qZ+AiVa1RNPPJHT3BiGFglyNJCeWTgUQ+IiDY4VRzRga8ptGhPNrgtlq39aSwxR23zzzfO/r7322jytZARnraGYNS+agsdKFwAAoCOKg+vXXHNNbmESbUMiDFp00UVzr9noIRv/LmbDLiqV6g45i9M555xTe59xH3Uva8z555+f99kWW2yx9Je//CXP0r3EEkvkyqlf/epXbfTKOweBEq2qCIEi6Y1+QZtsskmejS3S3ehr1NhtigCmOH/wwQebVYFTDHkLEW61l4suuig3bSumtYyVUkwzWdl8vKyoSopm3cV43wjuAAAAOqoYpRKTLE2YMCEXGrz99tt59rYoOCi88sorDQ45i1PsbxbidnUvm5mdd945Tyz1/vvvp88//zwXJkQv3Ka4/PLLu9xQt4JAiVZVhENFlVE0oo5m0pV/qzR16tTcLb/yNtFzKDr6x5jZO+64o/Rz6N27d+2/i6qgCLYi4Grqad99900tFa8hKraOOOKIHPzECvLcc89NK620Utpqq61qp59salVSjCsePHhwGj16dL4sGn0
"text/plain": [
"<Figure size 1200x900 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 提取EoH-TSP和AAD-TSP的运行时间数据\n",
"selected_algos = ['EoH-TSP', 'AAD-TSP']\n",
"df_selected = df_time[selected_algos]\n",
"\n",
"# 设置matplotlib支持中文显示\n",
"plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签\n",
"plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号\n",
"plt.rcParams['font.size'] = 16 # 设置更大的字号\n",
"\n",
"# 创建柱状图\n",
"plt.figure(figsize=(12, 9))\n",
"bar_width = 0.5\n",
"x = np.arange(len(df_selected.index))\n",
"\n",
"# 绘制柱状图\n",
"bars1 = plt.bar(x - bar_width/2, df_selected['EoH-TSP'], bar_width, label='AAD-TSP')\n",
"bars2 = plt.bar(x + bar_width/2, df_selected['AAD-TSP'], bar_width, label='EoH-TSP')\n",
"\n",
"# 在柱形上添加数值标注\n",
"for bars in [bars1, bars2]:\n",
" for bar in bars:\n",
" height = bar.get_height()\n",
" plt.text(bar.get_x() + bar.get_width()/2., height,\n",
" f'{height:.2f}',\n",
" ha='center', va='bottom',fontsize=16)\n",
"\n",
"# 设置图表属性\n",
"# plt.xlabel('测试实例')\n",
"# plt.title('在不同实例上的运行时间')\n",
"plt.xticks(x, df_selected.index, rotation=45,fontsize=20)\n",
"plt.legend(fontsize=20)\n",
"\n",
"# 调整布局避免标签被截断\n",
"plt.tight_layout()\n",
"plt.savefig('tsp_time.png',dpi=300)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"测试实例: CHN144.tsp\n",
"\n",
"使用算法: test\n",
"执行时间:0.6112秒, 路径长度:33147.39\n",
"\n",
"测试实例: eil101.tsp\n",
"\n",
"使用算法: test\n",
"执行时间:0.2688秒, 路径长度:693.38\n",
"\n",
"测试实例: eil76.tsp\n",
"\n",
"使用算法: test\n",
"执行时间:0.1627秒, 路径长度:588.83\n",
"\n",
"测试实例: GR96.tsp\n",
"\n",
"使用算法: test\n",
"执行时间:0.2340秒, 路径长度:629.57\n",
"\n",
"测试实例: PBK411.tsp\n",
"\n",
"使用算法: test\n",
"执行时间:10.3389秒, 路径长度:1544.15\n",
"\n",
"测试实例: PR76.tsp\n",
"\n",
"使用算法: test\n",
"执行时间:0.1454秒, 路径长度:120233.54\n",
"\n",
"测试实例: RBU737.tsp\n",
"\n",
"使用算法: test\n"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[2]\u001b[39m\u001b[32m, line 22\u001b[39m\n\u001b[32m 20\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m algo_name, algo_func \u001b[38;5;129;01min\u001b[39;00m test_algo.items():\n\u001b[32m 21\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m使用算法: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00malgo_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n\u001b[32m---> \u001b[39m\u001b[32m22\u001b[39m path_length, exec_time = \u001b[43mevaluate_tsp\u001b[49m\u001b[43m(\u001b[49m\u001b[43malgo_func\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdist_matrix\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 24\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m algo_name \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m test_results:\n\u001b[32m 25\u001b[39m test_results[algo_name] = {}\n",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[1]\u001b[39m\u001b[32m, line 20\u001b[39m, in \u001b[36mevaluate_tsp\u001b[39m\u001b[34m(tsp_func, distances)\u001b[39m\n\u001b[32m 17\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 18\u001b[39m \u001b[38;5;66;03m# 计时并执行TSP\u001b[39;00m\n\u001b[32m 19\u001b[39m start_time = time.time()\n\u001b[32m---> \u001b[39m\u001b[32m20\u001b[39m path = \u001b[43mtsp_func\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdistances\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 21\u001b[39m end_time = time.time()\n\u001b[32m 22\u001b[39m execution_time = end_time - start_time\n",
"\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\Lenovo\\Desktop\\LEAD\\tsp_data\\tsp_algo.py:411\u001b[39m, in \u001b[36mtsp_05\u001b[39m\u001b[34m(distances)\u001b[39m\n\u001b[32m 408\u001b[39m temp *= cooling\n\u001b[32m 410\u001b[39m \u001b[38;5;66;03m# 2-opt局部优化\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m411\u001b[39m best_route = \u001b[43mtwo_opt\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbest_route\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdistances\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 413\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m best_route\n",
"\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\Lenovo\\Desktop\\LEAD\\tsp_data\\tsp_algo.py:277\u001b[39m, in \u001b[36mtwo_opt\u001b[39m\u001b[34m(route, distances)\u001b[39m\n\u001b[32m 273\u001b[39m old_dist = (distances[route[i-\u001b[32m1\u001b[39m]][route[i]] + \n\u001b[32m 274\u001b[39m distances[route[j-\u001b[32m1\u001b[39m]][route[j]])\n\u001b[32m 275\u001b[39m new_dist = (distances[route[i-\u001b[32m1\u001b[39m]][route[j-\u001b[32m1\u001b[39m]] + \n\u001b[32m 276\u001b[39m distances[route[i]][route[j]])\n\u001b[32m--> \u001b[39m\u001b[32m277\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m new_dist < old_dist:\n\u001b[32m 278\u001b[39m route[i:j] = \u001b[38;5;28mreversed\u001b[39m(route[i:j])\n\u001b[32m 279\u001b[39m improved = \u001b[38;5;28;01mTrue\u001b[39;00m\n",
"\u001b[31mKeyboardInterrupt\u001b[39m: "
]
}
],
"source": [
"# 用于存储算法结果\n",
"test_results = {}\n",
"test_time = {}\n",
"\n",
"# 遍历测试实例\n",
"for test_case in test_files:\n",
" print(f\"\\n测试实例: {test_case}\")\n",
" \n",
" # 加载数据\n",
" dist_matrix = load_tsp_data(test_case)\n",
" if dist_matrix is None:\n",
" continue\n",
" \n",
" # 仅测试单个算法\n",
" test_algo = {\n",
" \"test\": tsp_05 # 这里可以改成想测试的其他算法\n",
" }\n",
" \n",
" # 评估算法\n",
" for algo_name, algo_func in test_algo.items():\n",
" print(f\"\\n使用算法: {algo_name}\")\n",
" path_length, exec_time = evaluate_tsp(algo_func, dist_matrix)\n",
" \n",
" if algo_name not in test_results:\n",
" test_results[algo_name] = {}\n",
" if algo_name not in test_time:\n",
" test_time[algo_name] = {}\n",
" \n",
" test_results[algo_name][test_case] = path_length\n",
" test_time[algo_name][test_case] = exec_time\n",
"\n",
"# 打印结果\n",
"print(\"\\n算法在各个实例上的表现:\")\n",
"for algo_name, scores in test_results.items():\n",
" print(f\"\\n{algo_name}:\")\n",
" for test_case, score in scores.items():\n",
" print(f\" {test_case}: 路径长度 = {score:.2f}\")\n",
" for test_case, etime in test_time[algo_name].items():\n",
" print(f\" {test_case}: 执行时间 = {etime:.4f}秒\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "lead",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.11"
}
},
"nbformat": 4,
"nbformat_minor": 2
}