832 lines
138 KiB
Plaintext
832 lines
138 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import sys\n",
|
|
"sys.path.append(\"C:/Users/Lenovo/Desktop/LEAD/\")\n",
|
|
"from gcdata.gc import *\n",
|
|
"from gcdata.gc1 import *"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"['DSJC0125.1.txt', 'DSJC0125.5.txt', 'DSJC0125.9.txt', 'DSJC0250.1.txt', 'DSJC0250.5.txt', 'DSJC0250.9.txt', 'DSJC0500.1.txt', 'DSJC0500.5.txt', 'DSJC0500.9.txt', 'DSJC1000.1.txt', 'DSJC1000.5.txt', 'DSJC1000.9.txt']\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"import os\n",
|
|
"import numpy as np\n",
|
|
"import time\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"# 获取gcdata目录下所有txt文件\n",
|
|
"data_dir = \"C:/Users/Lenovo/Desktop/LEAD/\"\n",
|
|
"data_dir2 = \"C:/Users/Lenovo/Desktop/LEAD/gcdata/\"\n",
|
|
"test_files = [f for f in os.listdir(data_dir2) if f.endswith('txt')]\n",
|
|
"print(test_files)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# 定义评估函数\n",
|
|
"def evaluate_coloring(coloring_func, adj_matrix):\n",
|
|
" \"\"\"评估图着色算法的性能\"\"\"\n",
|
|
" try:\n",
|
|
" # 计时并执行图着色\n",
|
|
" start_time = time.time()\n",
|
|
" colors = coloring_func(adj_matrix)\n",
|
|
" end_time = time.time()\n",
|
|
" execution_time = end_time - start_time\n",
|
|
" \n",
|
|
" # 检查解的合法性\n",
|
|
" n = len(adj_matrix)\n",
|
|
" for i in range(n):\n",
|
|
" for j in range(n):\n",
|
|
" if adj_matrix[i][j] == 1 and colors[i] == colors[j]:\n",
|
|
" print(f\"非法解:节点{i}和{j}相邻但颜色相同\")\n",
|
|
" return float('inf')\n",
|
|
" \n",
|
|
" # 计算使用的颜色数\n",
|
|
" num_colors = len(set(colors))\n",
|
|
" \n",
|
|
" print(f\"执行时间:{execution_time:.4f}秒, 使用颜色数:{num_colors}\")\n",
|
|
" return num_colors,execution_time\n",
|
|
" \n",
|
|
" except Exception as e:\n",
|
|
" print(f\"评估过程出错: {str(e)}\")\n",
|
|
" return float('inf')\n",
|
|
"\n",
|
|
"# 定义数据加载函数 \n",
|
|
"def load_graph_data(filename):\n",
|
|
" \"\"\"读取图着色问题数据\"\"\"\n",
|
|
" try:\n",
|
|
" filepath = os.path.join(data_dir2, filename)\n",
|
|
" with open(filepath, 'r') as f:\n",
|
|
" first_line = f.readline().strip().split()\n",
|
|
" n_vertices = int(first_line[0])\n",
|
|
" \n",
|
|
" adj_matrix = np.zeros((n_vertices, n_vertices), dtype=np.int32)\n",
|
|
" \n",
|
|
" for line in f:\n",
|
|
" v1, v2 = map(int, line.strip().split())\n",
|
|
" adj_matrix[v1][v2] = 1\n",
|
|
" adj_matrix[v2][v1] = 1\n",
|
|
" \n",
|
|
" return adj_matrix\n",
|
|
" \n",
|
|
" except Exception as e:\n",
|
|
" print(f\"读取数据出错: {str(e)}\")\n",
|
|
" return None"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"测试实例: DSJC0125.1.txt\n",
|
|
"\n",
|
|
"使用算法: FunSearch-MCP\n",
|
|
"执行时间:0.0040秒, 使用颜色数:7\n",
|
|
"\n",
|
|
"使用算法: EoH-MCP\n",
|
|
"执行时间:0.2838秒, 使用颜色数:6\n",
|
|
"\n",
|
|
"使用算法: AAD-MCP\n",
|
|
"执行时间:0.0055秒, 使用颜色数:6\n",
|
|
"\n",
|
|
"使用算法: 贪心\n",
|
|
"执行时间:0.0015秒, 使用颜色数:8\n",
|
|
"\n",
|
|
"使用算法: Welsh-Powell\n",
|
|
"执行时间:0.0026秒, 使用颜色数:7\n",
|
|
"\n",
|
|
"使用算法: DSATUR\n",
|
|
"执行时间:0.2019秒, 使用颜色数:6\n",
|
|
"\n",
|
|
"测试实例: DSJC0125.5.txt\n",
|
|
"\n",
|
|
"使用算法: FunSearch-MCP\n",
|
|
"执行时间:0.0030秒, 使用颜色数:24\n",
|
|
"\n",
|
|
"使用算法: EoH-MCP\n",
|
|
"执行时间:0.3657秒, 使用颜色数:22\n",
|
|
"\n",
|
|
"使用算法: AAD-MCP\n",
|
|
"执行时间:0.0130秒, 使用颜色数:22\n",
|
|
"\n",
|
|
"使用算法: 贪心\n",
|
|
"执行时间:0.0030秒, 使用颜色数:26\n",
|
|
"\n",
|
|
"使用算法: Welsh-Powell\n",
|
|
"执行时间:0.0030秒, 使用颜色数:23\n",
|
|
"\n",
|
|
"使用算法: DSATUR\n",
|
|
"执行时间:0.2198秒, 使用颜色数:22\n",
|
|
"\n",
|
|
"测试实例: DSJC0125.9.txt\n",
|
|
"\n",
|
|
"使用算法: FunSearch-MCP\n",
|
|
"执行时间:0.0040秒, 使用颜色数:53\n",
|
|
"\n",
|
|
"使用算法: EoH-MCP\n",
|
|
"执行时间:0.4484秒, 使用颜色数:51\n",
|
|
"\n",
|
|
"使用算法: AAD-MCP\n",
|
|
"执行时间:0.0180秒, 使用颜色数:51\n",
|
|
"\n",
|
|
"使用算法: 贪心\n",
|
|
"执行时间:0.0026秒, 使用颜色数:56\n",
|
|
"\n",
|
|
"使用算法: Welsh-Powell\n",
|
|
"执行时间:0.0060秒, 使用颜色数:53\n",
|
|
"\n",
|
|
"使用算法: DSATUR\n",
|
|
"执行时间:0.2416秒, 使用颜色数:51\n",
|
|
"\n",
|
|
"测试实例: DSJC0250.1.txt\n",
|
|
"\n",
|
|
"使用算法: FunSearch-MCP\n",
|
|
"执行时间:0.0134秒, 使用颜色数:12\n",
|
|
"\n",
|
|
"使用算法: EoH-MCP\n",
|
|
"执行时间:2.0049秒, 使用颜色数:10\n",
|
|
"\n",
|
|
"使用算法: AAD-MCP\n",
|
|
"执行时间:0.0175秒, 使用颜色数:10\n",
|
|
"\n",
|
|
"使用算法: 贪心\n",
|
|
"执行时间:0.0090秒, 使用颜色数:13\n",
|
|
"\n",
|
|
"使用算法: Welsh-Powell\n",
|
|
"执行时间:0.0111秒, 使用颜色数:11\n",
|
|
"\n",
|
|
"使用算法: DSATUR\n",
|
|
"执行时间:1.5718秒, 使用颜色数:10\n",
|
|
"\n",
|
|
"测试实例: DSJC0250.5.txt\n",
|
|
"\n",
|
|
"使用算法: FunSearch-MCP\n",
|
|
"执行时间:0.0148秒, 使用颜色数:40\n",
|
|
"\n",
|
|
"使用算法: EoH-MCP\n",
|
|
"执行时间:2.3929秒, 使用颜色数:37\n",
|
|
"\n",
|
|
"使用算法: AAD-MCP\n",
|
|
"执行时间:0.0468秒, 使用颜色数:37\n",
|
|
"\n",
|
|
"使用算法: 贪心\n",
|
|
"执行时间:0.0102秒, 使用颜色数:43\n",
|
|
"\n",
|
|
"使用算法: Welsh-Powell\n",
|
|
"执行时间:0.0141秒, 使用颜色数:41\n",
|
|
"\n",
|
|
"使用算法: DSATUR\n",
|
|
"执行时间:1.7725秒, 使用颜色数:37\n",
|
|
"\n",
|
|
"测试实例: DSJC0250.9.txt\n",
|
|
"\n",
|
|
"使用算法: FunSearch-MCP\n",
|
|
"执行时间:0.0145秒, 使用颜色数:92\n",
|
|
"\n",
|
|
"使用算法: EoH-MCP\n",
|
|
"执行时间:2.8686秒, 使用颜色数:92\n",
|
|
"\n",
|
|
"使用算法: AAD-MCP\n",
|
|
"执行时间:0.0802秒, 使用颜色数:92\n",
|
|
"\n",
|
|
"使用算法: 贪心\n",
|
|
"执行时间:0.0100秒, 使用颜色数:99\n",
|
|
"\n",
|
|
"使用算法: Welsh-Powell\n",
|
|
"执行时间:0.0327秒, 使用颜色数:93\n",
|
|
"\n",
|
|
"使用算法: DSATUR\n",
|
|
"执行时间:1.8326秒, 使用颜色数:92\n",
|
|
"\n",
|
|
"测试实例: DSJC0500.1.txt\n",
|
|
"\n",
|
|
"使用算法: FunSearch-MCP\n",
|
|
"执行时间:0.0502秒, 使用颜色数:18\n",
|
|
"\n",
|
|
"使用算法: EoH-MCP\n",
|
|
"执行时间:15.5259秒, 使用颜色数:16\n",
|
|
"\n",
|
|
"使用算法: AAD-MCP\n",
|
|
"执行时间:0.1433秒, 使用颜色数:16\n",
|
|
"\n",
|
|
"使用算法: 贪心\n",
|
|
"执行时间:0.0643秒, 使用颜色数:20\n",
|
|
"\n",
|
|
"使用算法: Welsh-Powell\n",
|
|
"执行时间:0.0521秒, 使用颜色数:18\n",
|
|
"\n",
|
|
"使用算法: DSATUR\n",
|
|
"执行时间:14.7507秒, 使用颜色数:16\n",
|
|
"\n",
|
|
"测试实例: DSJC0500.5.txt\n",
|
|
"\n",
|
|
"使用算法: FunSearch-MCP\n",
|
|
"执行时间:0.0700秒, 使用颜色数:68\n",
|
|
"\n",
|
|
"使用算法: EoH-MCP\n",
|
|
"执行时间:18.4253秒, 使用颜色数:65\n",
|
|
"\n",
|
|
"使用算法: AAD-MCP\n",
|
|
"执行时间:0.2133秒, 使用颜色数:65\n",
|
|
"\n",
|
|
"使用算法: 贪心\n",
|
|
"执行时间:0.0514秒, 使用颜色数:72\n",
|
|
"\n",
|
|
"使用算法: Welsh-Powell\n",
|
|
"执行时间:0.0777秒, 使用颜色数:71\n",
|
|
"\n",
|
|
"使用算法: DSATUR\n",
|
|
"执行时间:13.2264秒, 使用颜色数:65\n",
|
|
"\n",
|
|
"测试实例: DSJC0500.9.txt\n",
|
|
"\n",
|
|
"使用算法: FunSearch-MCP\n",
|
|
"执行时间:0.0549秒, 使用颜色数:171\n",
|
|
"\n",
|
|
"使用算法: EoH-MCP\n",
|
|
"执行时间:20.7131秒, 使用颜色数:170\n",
|
|
"\n",
|
|
"使用算法: AAD-MCP\n",
|
|
"执行时间:0.3302秒, 使用颜色数:170\n",
|
|
"\n",
|
|
"使用算法: 贪心\n",
|
|
"执行时间:0.0437秒, 使用颜色数:175\n",
|
|
"\n",
|
|
"使用算法: Welsh-Powell\n",
|
|
"执行时间:0.1895秒, 使用颜色数:169\n",
|
|
"\n",
|
|
"使用算法: DSATUR\n",
|
|
"执行时间:14.3884秒, 使用颜色数:170\n",
|
|
"\n",
|
|
"测试实例: DSJC1000.1.txt\n",
|
|
"\n",
|
|
"使用算法: FunSearch-MCP\n",
|
|
"执行时间:0.2133秒, 使用颜色数:29\n",
|
|
"\n",
|
|
"使用算法: EoH-MCP\n",
|
|
"执行时间:116.7540秒, 使用颜色数:27\n",
|
|
"\n",
|
|
"使用算法: AAD-MCP\n",
|
|
"执行时间:0.2894秒, 使用颜色数:27\n",
|
|
"\n",
|
|
"使用算法: 贪心\n",
|
|
"执行时间:0.1473秒, 使用颜色数:31\n",
|
|
"\n",
|
|
"使用算法: Welsh-Powell\n",
|
|
"执行时间:0.1852秒, 使用颜色数:29\n",
|
|
"\n",
|
|
"使用算法: DSATUR\n",
|
|
"执行时间:98.2297秒, 使用颜色数:27\n",
|
|
"\n",
|
|
"测试实例: DSJC1000.5.txt\n",
|
|
"\n",
|
|
"使用算法: FunSearch-MCP\n",
|
|
"执行时间:0.2238秒, 使用颜色数:123\n",
|
|
"\n",
|
|
"使用算法: EoH-MCP\n",
|
|
"执行时间:145.9148秒, 使用颜色数:115\n",
|
|
"\n",
|
|
"使用算法: AAD-MCP\n",
|
|
"执行时间:0.8791秒, 使用颜色数:115\n",
|
|
"\n",
|
|
"使用算法: 贪心\n",
|
|
"执行时间:0.1677秒, 使用颜色数:127\n",
|
|
"\n",
|
|
"使用算法: Welsh-Powell\n",
|
|
"执行时间:0.4773秒, 使用颜色数:121\n",
|
|
"\n",
|
|
"使用算法: DSATUR\n",
|
|
"执行时间:109.2028秒, 使用颜色数:115\n",
|
|
"\n",
|
|
"测试实例: DSJC1000.9.txt\n",
|
|
"\n",
|
|
"使用算法: FunSearch-MCP\n",
|
|
"执行时间:0.2306秒, 使用颜色数:316\n",
|
|
"\n",
|
|
"使用算法: EoH-MCP\n",
|
|
"执行时间:171.2065秒, 使用颜色数:299\n",
|
|
"\n",
|
|
"使用算法: AAD-MCP\n",
|
|
"执行时间:1.2328秒, 使用颜色数:299\n",
|
|
"\n",
|
|
"使用算法: 贪心\n",
|
|
"执行时间:0.1777秒, 使用颜色数:321\n",
|
|
"\n",
|
|
"使用算法: Welsh-Powell\n",
|
|
"执行时间:1.2785秒, 使用颜色数:313\n",
|
|
"\n",
|
|
"使用算法: DSATUR\n",
|
|
"执行时间:109.2663秒, 使用颜色数:299\n",
|
|
"\n",
|
|
"所有算法在各个实例上的表现:\n",
|
|
"\n",
|
|
"FunSearch-MCP:\n",
|
|
" DSJC0125.1.txt: 使用颜色数 = 7\n",
|
|
" DSJC0125.5.txt: 使用颜色数 = 24\n",
|
|
" DSJC0125.9.txt: 使用颜色数 = 53\n",
|
|
" DSJC0250.1.txt: 使用颜色数 = 12\n",
|
|
" DSJC0250.5.txt: 使用颜色数 = 40\n",
|
|
" DSJC0250.9.txt: 使用颜色数 = 92\n",
|
|
" DSJC0500.1.txt: 使用颜色数 = 18\n",
|
|
" DSJC0500.5.txt: 使用颜色数 = 68\n",
|
|
" DSJC0500.9.txt: 使用颜色数 = 171\n",
|
|
" DSJC1000.1.txt: 使用颜色数 = 29\n",
|
|
" DSJC1000.5.txt: 使用颜色数 = 123\n",
|
|
" DSJC1000.9.txt: 使用颜色数 = 316\n",
|
|
" FunSearch-MCP: 执行时间 = {'DSJC0125.1.txt': 0.004013776779174805, 'DSJC0125.5.txt': 0.003008127212524414, 'DSJC0125.9.txt': 0.0039904117584228516, 'DSJC0250.1.txt': 0.01337122917175293, 'DSJC0250.5.txt': 0.014790773391723633, 'DSJC0250.9.txt': 0.014544010162353516, 'DSJC0500.1.txt': 0.05017399787902832, 'DSJC0500.5.txt': 0.07002043724060059, 'DSJC0500.9.txt': 0.05488133430480957, 'DSJC1000.1.txt': 0.2132706642150879, 'DSJC1000.5.txt': 0.2238328456878662, 'DSJC1000.9.txt': 0.23056554794311523}\n",
|
|
" EoH-MCP: 执行时间 = {'DSJC0125.1.txt': 0.2837517261505127, 'DSJC0125.5.txt': 0.36574745178222656, 'DSJC0125.9.txt': 0.44835567474365234, 'DSJC0250.1.txt': 2.0048983097076416, 'DSJC0250.5.txt': 2.3928611278533936, 'DSJC0250.9.txt': 2.868635416030884, 'DSJC0500.1.txt': 15.525936365127563, 'DSJC0500.5.txt': 18.42532467842102, 'DSJC0500.9.txt': 20.713070392608643, 'DSJC1000.1.txt': 116.75400495529175, 'DSJC1000.5.txt': 145.9148268699646, 'DSJC1000.9.txt': 171.20650029182434}\n",
|
|
" AAD-MCP: 执行时间 = {'DSJC0125.1.txt': 0.0055429935455322266, 'DSJC0125.5.txt': 0.013042688369750977, 'DSJC0125.9.txt': 0.017969846725463867, 'DSJC0250.1.txt': 0.01753830909729004, 'DSJC0250.5.txt': 0.04675650596618652, 'DSJC0250.9.txt': 0.08019351959228516, 'DSJC0500.1.txt': 0.1433091163635254, 'DSJC0500.5.txt': 0.2132573127746582, 'DSJC0500.9.txt': 0.33021020889282227, 'DSJC1000.1.txt': 0.28937268257141113, 'DSJC1000.5.txt': 0.8791167736053467, 'DSJC1000.9.txt': 1.2328133583068848}\n",
|
|
" 贪心: 执行时间 = {'DSJC0125.1.txt': 0.0015063285827636719, 'DSJC0125.5.txt': 0.003003358840942383, 'DSJC0125.9.txt': 0.002640247344970703, 'DSJC0250.1.txt': 0.008993864059448242, 'DSJC0250.5.txt': 0.010194540023803711, 'DSJC0250.9.txt': 0.010005474090576172, 'DSJC0500.1.txt': 0.06428956985473633, 'DSJC0500.5.txt': 0.051430463790893555, 'DSJC0500.9.txt': 0.043711185455322266, 'DSJC1000.1.txt': 0.14725852012634277, 'DSJC1000.5.txt': 0.16768312454223633, 'DSJC1000.9.txt': 0.17772769927978516}\n",
|
|
" Welsh-Powell: 执行时间 = {'DSJC0125.1.txt': 0.002586841583251953, 'DSJC0125.5.txt': 0.003000497817993164, 'DSJC0125.9.txt': 0.006002187728881836, 'DSJC0250.1.txt': 0.011120796203613281, 'DSJC0250.5.txt': 0.014127492904663086, 'DSJC0250.9.txt': 0.03272223472595215, 'DSJC0500.1.txt': 0.05209708213806152, 'DSJC0500.5.txt': 0.0777275562286377, 'DSJC0500.9.txt': 0.18945813179016113, 'DSJC1000.1.txt': 0.18522953987121582, 'DSJC1000.5.txt': 0.4772758483886719, 'DSJC1000.9.txt': 1.2784678936004639}\n",
|
|
" DSATUR: 执行时间 = {'DSJC0125.1.txt': 0.2019205093383789, 'DSJC0125.5.txt': 0.2197577953338623, 'DSJC0125.9.txt': 0.24163603782653809, 'DSJC0250.1.txt': 1.571821928024292, 'DSJC0250.5.txt': 1.772461175918579, 'DSJC0250.9.txt': 1.8325576782226562, 'DSJC0500.1.txt': 14.750667810440063, 'DSJC0500.5.txt': 13.226407051086426, 'DSJC0500.9.txt': 14.38843822479248, 'DSJC1000.1.txt': 98.22970223426819, 'DSJC1000.5.txt': 109.20279622077942, 'DSJC1000.9.txt': 109.26631116867065}\n",
|
|
"\n",
|
|
"EoH-MCP:\n",
|
|
" DSJC0125.1.txt: 使用颜色数 = 6\n",
|
|
" DSJC0125.5.txt: 使用颜色数 = 22\n",
|
|
" DSJC0125.9.txt: 使用颜色数 = 51\n",
|
|
" DSJC0250.1.txt: 使用颜色数 = 10\n",
|
|
" DSJC0250.5.txt: 使用颜色数 = 37\n",
|
|
" DSJC0250.9.txt: 使用颜色数 = 92\n",
|
|
" DSJC0500.1.txt: 使用颜色数 = 16\n",
|
|
" DSJC0500.5.txt: 使用颜色数 = 65\n",
|
|
" DSJC0500.9.txt: 使用颜色数 = 170\n",
|
|
" DSJC1000.1.txt: 使用颜色数 = 27\n",
|
|
" DSJC1000.5.txt: 使用颜色数 = 115\n",
|
|
" DSJC1000.9.txt: 使用颜色数 = 299\n",
|
|
" FunSearch-MCP: 执行时间 = {'DSJC0125.1.txt': 0.004013776779174805, 'DSJC0125.5.txt': 0.003008127212524414, 'DSJC0125.9.txt': 0.0039904117584228516, 'DSJC0250.1.txt': 0.01337122917175293, 'DSJC0250.5.txt': 0.014790773391723633, 'DSJC0250.9.txt': 0.014544010162353516, 'DSJC0500.1.txt': 0.05017399787902832, 'DSJC0500.5.txt': 0.07002043724060059, 'DSJC0500.9.txt': 0.05488133430480957, 'DSJC1000.1.txt': 0.2132706642150879, 'DSJC1000.5.txt': 0.2238328456878662, 'DSJC1000.9.txt': 0.23056554794311523}\n",
|
|
" EoH-MCP: 执行时间 = {'DSJC0125.1.txt': 0.2837517261505127, 'DSJC0125.5.txt': 0.36574745178222656, 'DSJC0125.9.txt': 0.44835567474365234, 'DSJC0250.1.txt': 2.0048983097076416, 'DSJC0250.5.txt': 2.3928611278533936, 'DSJC0250.9.txt': 2.868635416030884, 'DSJC0500.1.txt': 15.525936365127563, 'DSJC0500.5.txt': 18.42532467842102, 'DSJC0500.9.txt': 20.713070392608643, 'DSJC1000.1.txt': 116.75400495529175, 'DSJC1000.5.txt': 145.9148268699646, 'DSJC1000.9.txt': 171.20650029182434}\n",
|
|
" AAD-MCP: 执行时间 = {'DSJC0125.1.txt': 0.0055429935455322266, 'DSJC0125.5.txt': 0.013042688369750977, 'DSJC0125.9.txt': 0.017969846725463867, 'DSJC0250.1.txt': 0.01753830909729004, 'DSJC0250.5.txt': 0.04675650596618652, 'DSJC0250.9.txt': 0.08019351959228516, 'DSJC0500.1.txt': 0.1433091163635254, 'DSJC0500.5.txt': 0.2132573127746582, 'DSJC0500.9.txt': 0.33021020889282227, 'DSJC1000.1.txt': 0.28937268257141113, 'DSJC1000.5.txt': 0.8791167736053467, 'DSJC1000.9.txt': 1.2328133583068848}\n",
|
|
" 贪心: 执行时间 = {'DSJC0125.1.txt': 0.0015063285827636719, 'DSJC0125.5.txt': 0.003003358840942383, 'DSJC0125.9.txt': 0.002640247344970703, 'DSJC0250.1.txt': 0.008993864059448242, 'DSJC0250.5.txt': 0.010194540023803711, 'DSJC0250.9.txt': 0.010005474090576172, 'DSJC0500.1.txt': 0.06428956985473633, 'DSJC0500.5.txt': 0.051430463790893555, 'DSJC0500.9.txt': 0.043711185455322266, 'DSJC1000.1.txt': 0.14725852012634277, 'DSJC1000.5.txt': 0.16768312454223633, 'DSJC1000.9.txt': 0.17772769927978516}\n",
|
|
" Welsh-Powell: 执行时间 = {'DSJC0125.1.txt': 0.002586841583251953, 'DSJC0125.5.txt': 0.003000497817993164, 'DSJC0125.9.txt': 0.006002187728881836, 'DSJC0250.1.txt': 0.011120796203613281, 'DSJC0250.5.txt': 0.014127492904663086, 'DSJC0250.9.txt': 0.03272223472595215, 'DSJC0500.1.txt': 0.05209708213806152, 'DSJC0500.5.txt': 0.0777275562286377, 'DSJC0500.9.txt': 0.18945813179016113, 'DSJC1000.1.txt': 0.18522953987121582, 'DSJC1000.5.txt': 0.4772758483886719, 'DSJC1000.9.txt': 1.2784678936004639}\n",
|
|
" DSATUR: 执行时间 = {'DSJC0125.1.txt': 0.2019205093383789, 'DSJC0125.5.txt': 0.2197577953338623, 'DSJC0125.9.txt': 0.24163603782653809, 'DSJC0250.1.txt': 1.571821928024292, 'DSJC0250.5.txt': 1.772461175918579, 'DSJC0250.9.txt': 1.8325576782226562, 'DSJC0500.1.txt': 14.750667810440063, 'DSJC0500.5.txt': 13.226407051086426, 'DSJC0500.9.txt': 14.38843822479248, 'DSJC1000.1.txt': 98.22970223426819, 'DSJC1000.5.txt': 109.20279622077942, 'DSJC1000.9.txt': 109.26631116867065}\n",
|
|
"\n",
|
|
"AAD-MCP:\n",
|
|
" DSJC0125.1.txt: 使用颜色数 = 6\n",
|
|
" DSJC0125.5.txt: 使用颜色数 = 22\n",
|
|
" DSJC0125.9.txt: 使用颜色数 = 51\n",
|
|
" DSJC0250.1.txt: 使用颜色数 = 10\n",
|
|
" DSJC0250.5.txt: 使用颜色数 = 37\n",
|
|
" DSJC0250.9.txt: 使用颜色数 = 92\n",
|
|
" DSJC0500.1.txt: 使用颜色数 = 16\n",
|
|
" DSJC0500.5.txt: 使用颜色数 = 65\n",
|
|
" DSJC0500.9.txt: 使用颜色数 = 170\n",
|
|
" DSJC1000.1.txt: 使用颜色数 = 27\n",
|
|
" DSJC1000.5.txt: 使用颜色数 = 115\n",
|
|
" DSJC1000.9.txt: 使用颜色数 = 299\n",
|
|
" FunSearch-MCP: 执行时间 = {'DSJC0125.1.txt': 0.004013776779174805, 'DSJC0125.5.txt': 0.003008127212524414, 'DSJC0125.9.txt': 0.0039904117584228516, 'DSJC0250.1.txt': 0.01337122917175293, 'DSJC0250.5.txt': 0.014790773391723633, 'DSJC0250.9.txt': 0.014544010162353516, 'DSJC0500.1.txt': 0.05017399787902832, 'DSJC0500.5.txt': 0.07002043724060059, 'DSJC0500.9.txt': 0.05488133430480957, 'DSJC1000.1.txt': 0.2132706642150879, 'DSJC1000.5.txt': 0.2238328456878662, 'DSJC1000.9.txt': 0.23056554794311523}\n",
|
|
" EoH-MCP: 执行时间 = {'DSJC0125.1.txt': 0.2837517261505127, 'DSJC0125.5.txt': 0.36574745178222656, 'DSJC0125.9.txt': 0.44835567474365234, 'DSJC0250.1.txt': 2.0048983097076416, 'DSJC0250.5.txt': 2.3928611278533936, 'DSJC0250.9.txt': 2.868635416030884, 'DSJC0500.1.txt': 15.525936365127563, 'DSJC0500.5.txt': 18.42532467842102, 'DSJC0500.9.txt': 20.713070392608643, 'DSJC1000.1.txt': 116.75400495529175, 'DSJC1000.5.txt': 145.9148268699646, 'DSJC1000.9.txt': 171.20650029182434}\n",
|
|
" AAD-MCP: 执行时间 = {'DSJC0125.1.txt': 0.0055429935455322266, 'DSJC0125.5.txt': 0.013042688369750977, 'DSJC0125.9.txt': 0.017969846725463867, 'DSJC0250.1.txt': 0.01753830909729004, 'DSJC0250.5.txt': 0.04675650596618652, 'DSJC0250.9.txt': 0.08019351959228516, 'DSJC0500.1.txt': 0.1433091163635254, 'DSJC0500.5.txt': 0.2132573127746582, 'DSJC0500.9.txt': 0.33021020889282227, 'DSJC1000.1.txt': 0.28937268257141113, 'DSJC1000.5.txt': 0.8791167736053467, 'DSJC1000.9.txt': 1.2328133583068848}\n",
|
|
" 贪心: 执行时间 = {'DSJC0125.1.txt': 0.0015063285827636719, 'DSJC0125.5.txt': 0.003003358840942383, 'DSJC0125.9.txt': 0.002640247344970703, 'DSJC0250.1.txt': 0.008993864059448242, 'DSJC0250.5.txt': 0.010194540023803711, 'DSJC0250.9.txt': 0.010005474090576172, 'DSJC0500.1.txt': 0.06428956985473633, 'DSJC0500.5.txt': 0.051430463790893555, 'DSJC0500.9.txt': 0.043711185455322266, 'DSJC1000.1.txt': 0.14725852012634277, 'DSJC1000.5.txt': 0.16768312454223633, 'DSJC1000.9.txt': 0.17772769927978516}\n",
|
|
" Welsh-Powell: 执行时间 = {'DSJC0125.1.txt': 0.002586841583251953, 'DSJC0125.5.txt': 0.003000497817993164, 'DSJC0125.9.txt': 0.006002187728881836, 'DSJC0250.1.txt': 0.011120796203613281, 'DSJC0250.5.txt': 0.014127492904663086, 'DSJC0250.9.txt': 0.03272223472595215, 'DSJC0500.1.txt': 0.05209708213806152, 'DSJC0500.5.txt': 0.0777275562286377, 'DSJC0500.9.txt': 0.18945813179016113, 'DSJC1000.1.txt': 0.18522953987121582, 'DSJC1000.5.txt': 0.4772758483886719, 'DSJC1000.9.txt': 1.2784678936004639}\n",
|
|
" DSATUR: 执行时间 = {'DSJC0125.1.txt': 0.2019205093383789, 'DSJC0125.5.txt': 0.2197577953338623, 'DSJC0125.9.txt': 0.24163603782653809, 'DSJC0250.1.txt': 1.571821928024292, 'DSJC0250.5.txt': 1.772461175918579, 'DSJC0250.9.txt': 1.8325576782226562, 'DSJC0500.1.txt': 14.750667810440063, 'DSJC0500.5.txt': 13.226407051086426, 'DSJC0500.9.txt': 14.38843822479248, 'DSJC1000.1.txt': 98.22970223426819, 'DSJC1000.5.txt': 109.20279622077942, 'DSJC1000.9.txt': 109.26631116867065}\n",
|
|
"\n",
|
|
"贪心:\n",
|
|
" DSJC0125.1.txt: 使用颜色数 = 8\n",
|
|
" DSJC0125.5.txt: 使用颜色数 = 26\n",
|
|
" DSJC0125.9.txt: 使用颜色数 = 56\n",
|
|
" DSJC0250.1.txt: 使用颜色数 = 13\n",
|
|
" DSJC0250.5.txt: 使用颜色数 = 43\n",
|
|
" DSJC0250.9.txt: 使用颜色数 = 99\n",
|
|
" DSJC0500.1.txt: 使用颜色数 = 20\n",
|
|
" DSJC0500.5.txt: 使用颜色数 = 72\n",
|
|
" DSJC0500.9.txt: 使用颜色数 = 175\n",
|
|
" DSJC1000.1.txt: 使用颜色数 = 31\n",
|
|
" DSJC1000.5.txt: 使用颜色数 = 127\n",
|
|
" DSJC1000.9.txt: 使用颜色数 = 321\n",
|
|
" FunSearch-MCP: 执行时间 = {'DSJC0125.1.txt': 0.004013776779174805, 'DSJC0125.5.txt': 0.003008127212524414, 'DSJC0125.9.txt': 0.0039904117584228516, 'DSJC0250.1.txt': 0.01337122917175293, 'DSJC0250.5.txt': 0.014790773391723633, 'DSJC0250.9.txt': 0.014544010162353516, 'DSJC0500.1.txt': 0.05017399787902832, 'DSJC0500.5.txt': 0.07002043724060059, 'DSJC0500.9.txt': 0.05488133430480957, 'DSJC1000.1.txt': 0.2132706642150879, 'DSJC1000.5.txt': 0.2238328456878662, 'DSJC1000.9.txt': 0.23056554794311523}\n",
|
|
" EoH-MCP: 执行时间 = {'DSJC0125.1.txt': 0.2837517261505127, 'DSJC0125.5.txt': 0.36574745178222656, 'DSJC0125.9.txt': 0.44835567474365234, 'DSJC0250.1.txt': 2.0048983097076416, 'DSJC0250.5.txt': 2.3928611278533936, 'DSJC0250.9.txt': 2.868635416030884, 'DSJC0500.1.txt': 15.525936365127563, 'DSJC0500.5.txt': 18.42532467842102, 'DSJC0500.9.txt': 20.713070392608643, 'DSJC1000.1.txt': 116.75400495529175, 'DSJC1000.5.txt': 145.9148268699646, 'DSJC1000.9.txt': 171.20650029182434}\n",
|
|
" AAD-MCP: 执行时间 = {'DSJC0125.1.txt': 0.0055429935455322266, 'DSJC0125.5.txt': 0.013042688369750977, 'DSJC0125.9.txt': 0.017969846725463867, 'DSJC0250.1.txt': 0.01753830909729004, 'DSJC0250.5.txt': 0.04675650596618652, 'DSJC0250.9.txt': 0.08019351959228516, 'DSJC0500.1.txt': 0.1433091163635254, 'DSJC0500.5.txt': 0.2132573127746582, 'DSJC0500.9.txt': 0.33021020889282227, 'DSJC1000.1.txt': 0.28937268257141113, 'DSJC1000.5.txt': 0.8791167736053467, 'DSJC1000.9.txt': 1.2328133583068848}\n",
|
|
" 贪心: 执行时间 = {'DSJC0125.1.txt': 0.0015063285827636719, 'DSJC0125.5.txt': 0.003003358840942383, 'DSJC0125.9.txt': 0.002640247344970703, 'DSJC0250.1.txt': 0.008993864059448242, 'DSJC0250.5.txt': 0.010194540023803711, 'DSJC0250.9.txt': 0.010005474090576172, 'DSJC0500.1.txt': 0.06428956985473633, 'DSJC0500.5.txt': 0.051430463790893555, 'DSJC0500.9.txt': 0.043711185455322266, 'DSJC1000.1.txt': 0.14725852012634277, 'DSJC1000.5.txt': 0.16768312454223633, 'DSJC1000.9.txt': 0.17772769927978516}\n",
|
|
" Welsh-Powell: 执行时间 = {'DSJC0125.1.txt': 0.002586841583251953, 'DSJC0125.5.txt': 0.003000497817993164, 'DSJC0125.9.txt': 0.006002187728881836, 'DSJC0250.1.txt': 0.011120796203613281, 'DSJC0250.5.txt': 0.014127492904663086, 'DSJC0250.9.txt': 0.03272223472595215, 'DSJC0500.1.txt': 0.05209708213806152, 'DSJC0500.5.txt': 0.0777275562286377, 'DSJC0500.9.txt': 0.18945813179016113, 'DSJC1000.1.txt': 0.18522953987121582, 'DSJC1000.5.txt': 0.4772758483886719, 'DSJC1000.9.txt': 1.2784678936004639}\n",
|
|
" DSATUR: 执行时间 = {'DSJC0125.1.txt': 0.2019205093383789, 'DSJC0125.5.txt': 0.2197577953338623, 'DSJC0125.9.txt': 0.24163603782653809, 'DSJC0250.1.txt': 1.571821928024292, 'DSJC0250.5.txt': 1.772461175918579, 'DSJC0250.9.txt': 1.8325576782226562, 'DSJC0500.1.txt': 14.750667810440063, 'DSJC0500.5.txt': 13.226407051086426, 'DSJC0500.9.txt': 14.38843822479248, 'DSJC1000.1.txt': 98.22970223426819, 'DSJC1000.5.txt': 109.20279622077942, 'DSJC1000.9.txt': 109.26631116867065}\n",
|
|
"\n",
|
|
"Welsh-Powell:\n",
|
|
" DSJC0125.1.txt: 使用颜色数 = 7\n",
|
|
" DSJC0125.5.txt: 使用颜色数 = 23\n",
|
|
" DSJC0125.9.txt: 使用颜色数 = 53\n",
|
|
" DSJC0250.1.txt: 使用颜色数 = 11\n",
|
|
" DSJC0250.5.txt: 使用颜色数 = 41\n",
|
|
" DSJC0250.9.txt: 使用颜色数 = 93\n",
|
|
" DSJC0500.1.txt: 使用颜色数 = 18\n",
|
|
" DSJC0500.5.txt: 使用颜色数 = 71\n",
|
|
" DSJC0500.9.txt: 使用颜色数 = 169\n",
|
|
" DSJC1000.1.txt: 使用颜色数 = 29\n",
|
|
" DSJC1000.5.txt: 使用颜色数 = 121\n",
|
|
" DSJC1000.9.txt: 使用颜色数 = 313\n",
|
|
" FunSearch-MCP: 执行时间 = {'DSJC0125.1.txt': 0.004013776779174805, 'DSJC0125.5.txt': 0.003008127212524414, 'DSJC0125.9.txt': 0.0039904117584228516, 'DSJC0250.1.txt': 0.01337122917175293, 'DSJC0250.5.txt': 0.014790773391723633, 'DSJC0250.9.txt': 0.014544010162353516, 'DSJC0500.1.txt': 0.05017399787902832, 'DSJC0500.5.txt': 0.07002043724060059, 'DSJC0500.9.txt': 0.05488133430480957, 'DSJC1000.1.txt': 0.2132706642150879, 'DSJC1000.5.txt': 0.2238328456878662, 'DSJC1000.9.txt': 0.23056554794311523}\n",
|
|
" EoH-MCP: 执行时间 = {'DSJC0125.1.txt': 0.2837517261505127, 'DSJC0125.5.txt': 0.36574745178222656, 'DSJC0125.9.txt': 0.44835567474365234, 'DSJC0250.1.txt': 2.0048983097076416, 'DSJC0250.5.txt': 2.3928611278533936, 'DSJC0250.9.txt': 2.868635416030884, 'DSJC0500.1.txt': 15.525936365127563, 'DSJC0500.5.txt': 18.42532467842102, 'DSJC0500.9.txt': 20.713070392608643, 'DSJC1000.1.txt': 116.75400495529175, 'DSJC1000.5.txt': 145.9148268699646, 'DSJC1000.9.txt': 171.20650029182434}\n",
|
|
" AAD-MCP: 执行时间 = {'DSJC0125.1.txt': 0.0055429935455322266, 'DSJC0125.5.txt': 0.013042688369750977, 'DSJC0125.9.txt': 0.017969846725463867, 'DSJC0250.1.txt': 0.01753830909729004, 'DSJC0250.5.txt': 0.04675650596618652, 'DSJC0250.9.txt': 0.08019351959228516, 'DSJC0500.1.txt': 0.1433091163635254, 'DSJC0500.5.txt': 0.2132573127746582, 'DSJC0500.9.txt': 0.33021020889282227, 'DSJC1000.1.txt': 0.28937268257141113, 'DSJC1000.5.txt': 0.8791167736053467, 'DSJC1000.9.txt': 1.2328133583068848}\n",
|
|
" 贪心: 执行时间 = {'DSJC0125.1.txt': 0.0015063285827636719, 'DSJC0125.5.txt': 0.003003358840942383, 'DSJC0125.9.txt': 0.002640247344970703, 'DSJC0250.1.txt': 0.008993864059448242, 'DSJC0250.5.txt': 0.010194540023803711, 'DSJC0250.9.txt': 0.010005474090576172, 'DSJC0500.1.txt': 0.06428956985473633, 'DSJC0500.5.txt': 0.051430463790893555, 'DSJC0500.9.txt': 0.043711185455322266, 'DSJC1000.1.txt': 0.14725852012634277, 'DSJC1000.5.txt': 0.16768312454223633, 'DSJC1000.9.txt': 0.17772769927978516}\n",
|
|
" Welsh-Powell: 执行时间 = {'DSJC0125.1.txt': 0.002586841583251953, 'DSJC0125.5.txt': 0.003000497817993164, 'DSJC0125.9.txt': 0.006002187728881836, 'DSJC0250.1.txt': 0.011120796203613281, 'DSJC0250.5.txt': 0.014127492904663086, 'DSJC0250.9.txt': 0.03272223472595215, 'DSJC0500.1.txt': 0.05209708213806152, 'DSJC0500.5.txt': 0.0777275562286377, 'DSJC0500.9.txt': 0.18945813179016113, 'DSJC1000.1.txt': 0.18522953987121582, 'DSJC1000.5.txt': 0.4772758483886719, 'DSJC1000.9.txt': 1.2784678936004639}\n",
|
|
" DSATUR: 执行时间 = {'DSJC0125.1.txt': 0.2019205093383789, 'DSJC0125.5.txt': 0.2197577953338623, 'DSJC0125.9.txt': 0.24163603782653809, 'DSJC0250.1.txt': 1.571821928024292, 'DSJC0250.5.txt': 1.772461175918579, 'DSJC0250.9.txt': 1.8325576782226562, 'DSJC0500.1.txt': 14.750667810440063, 'DSJC0500.5.txt': 13.226407051086426, 'DSJC0500.9.txt': 14.38843822479248, 'DSJC1000.1.txt': 98.22970223426819, 'DSJC1000.5.txt': 109.20279622077942, 'DSJC1000.9.txt': 109.26631116867065}\n",
|
|
"\n",
|
|
"DSATUR:\n",
|
|
" DSJC0125.1.txt: 使用颜色数 = 6\n",
|
|
" DSJC0125.5.txt: 使用颜色数 = 22\n",
|
|
" DSJC0125.9.txt: 使用颜色数 = 51\n",
|
|
" DSJC0250.1.txt: 使用颜色数 = 10\n",
|
|
" DSJC0250.5.txt: 使用颜色数 = 37\n",
|
|
" DSJC0250.9.txt: 使用颜色数 = 92\n",
|
|
" DSJC0500.1.txt: 使用颜色数 = 16\n",
|
|
" DSJC0500.5.txt: 使用颜色数 = 65\n",
|
|
" DSJC0500.9.txt: 使用颜色数 = 170\n",
|
|
" DSJC1000.1.txt: 使用颜色数 = 27\n",
|
|
" DSJC1000.5.txt: 使用颜色数 = 115\n",
|
|
" DSJC1000.9.txt: 使用颜色数 = 299\n",
|
|
" FunSearch-MCP: 执行时间 = {'DSJC0125.1.txt': 0.004013776779174805, 'DSJC0125.5.txt': 0.003008127212524414, 'DSJC0125.9.txt': 0.0039904117584228516, 'DSJC0250.1.txt': 0.01337122917175293, 'DSJC0250.5.txt': 0.014790773391723633, 'DSJC0250.9.txt': 0.014544010162353516, 'DSJC0500.1.txt': 0.05017399787902832, 'DSJC0500.5.txt': 0.07002043724060059, 'DSJC0500.9.txt': 0.05488133430480957, 'DSJC1000.1.txt': 0.2132706642150879, 'DSJC1000.5.txt': 0.2238328456878662, 'DSJC1000.9.txt': 0.23056554794311523}\n",
|
|
" EoH-MCP: 执行时间 = {'DSJC0125.1.txt': 0.2837517261505127, 'DSJC0125.5.txt': 0.36574745178222656, 'DSJC0125.9.txt': 0.44835567474365234, 'DSJC0250.1.txt': 2.0048983097076416, 'DSJC0250.5.txt': 2.3928611278533936, 'DSJC0250.9.txt': 2.868635416030884, 'DSJC0500.1.txt': 15.525936365127563, 'DSJC0500.5.txt': 18.42532467842102, 'DSJC0500.9.txt': 20.713070392608643, 'DSJC1000.1.txt': 116.75400495529175, 'DSJC1000.5.txt': 145.9148268699646, 'DSJC1000.9.txt': 171.20650029182434}\n",
|
|
" AAD-MCP: 执行时间 = {'DSJC0125.1.txt': 0.0055429935455322266, 'DSJC0125.5.txt': 0.013042688369750977, 'DSJC0125.9.txt': 0.017969846725463867, 'DSJC0250.1.txt': 0.01753830909729004, 'DSJC0250.5.txt': 0.04675650596618652, 'DSJC0250.9.txt': 0.08019351959228516, 'DSJC0500.1.txt': 0.1433091163635254, 'DSJC0500.5.txt': 0.2132573127746582, 'DSJC0500.9.txt': 0.33021020889282227, 'DSJC1000.1.txt': 0.28937268257141113, 'DSJC1000.5.txt': 0.8791167736053467, 'DSJC1000.9.txt': 1.2328133583068848}\n",
|
|
" 贪心: 执行时间 = {'DSJC0125.1.txt': 0.0015063285827636719, 'DSJC0125.5.txt': 0.003003358840942383, 'DSJC0125.9.txt': 0.002640247344970703, 'DSJC0250.1.txt': 0.008993864059448242, 'DSJC0250.5.txt': 0.010194540023803711, 'DSJC0250.9.txt': 0.010005474090576172, 'DSJC0500.1.txt': 0.06428956985473633, 'DSJC0500.5.txt': 0.051430463790893555, 'DSJC0500.9.txt': 0.043711185455322266, 'DSJC1000.1.txt': 0.14725852012634277, 'DSJC1000.5.txt': 0.16768312454223633, 'DSJC1000.9.txt': 0.17772769927978516}\n",
|
|
" Welsh-Powell: 执行时间 = {'DSJC0125.1.txt': 0.002586841583251953, 'DSJC0125.5.txt': 0.003000497817993164, 'DSJC0125.9.txt': 0.006002187728881836, 'DSJC0250.1.txt': 0.011120796203613281, 'DSJC0250.5.txt': 0.014127492904663086, 'DSJC0250.9.txt': 0.03272223472595215, 'DSJC0500.1.txt': 0.05209708213806152, 'DSJC0500.5.txt': 0.0777275562286377, 'DSJC0500.9.txt': 0.18945813179016113, 'DSJC1000.1.txt': 0.18522953987121582, 'DSJC1000.5.txt': 0.4772758483886719, 'DSJC1000.9.txt': 1.2784678936004639}\n",
|
|
" DSATUR: 执行时间 = {'DSJC0125.1.txt': 0.2019205093383789, 'DSJC0125.5.txt': 0.2197577953338623, 'DSJC0125.9.txt': 0.24163603782653809, 'DSJC0250.1.txt': 1.571821928024292, 'DSJC0250.5.txt': 1.772461175918579, 'DSJC0250.9.txt': 1.8325576782226562, 'DSJC0500.1.txt': 14.750667810440063, 'DSJC0500.5.txt': 13.226407051086426, 'DSJC0500.9.txt': 14.38843822479248, 'DSJC1000.1.txt': 98.22970223426819, 'DSJC1000.5.txt': 109.20279622077942, 'DSJC1000.9.txt': 109.26631116867065}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# 用于存储每个算法在每个实例上的结果 \n",
|
|
"results = {}\n",
|
|
"results_time = {}\n",
|
|
"\n",
|
|
"# 遍历每个测试实例\n",
|
|
"for test_file in test_files:\n",
|
|
" print(f\"\\n测试实例: {test_file}\")\n",
|
|
" \n",
|
|
" # 加载数据\n",
|
|
" adj_matrix = load_graph_data(test_file)\n",
|
|
" if adj_matrix is None:\n",
|
|
" continue\n",
|
|
" \n",
|
|
" # 这里可以添加多个待评估的图着色算法\n",
|
|
" algorithms = {\n",
|
|
" \"FunSearch-MCP\": graph_coloring_v1,\n",
|
|
" \"EoH-MCP\": graph_coloring_v2, \n",
|
|
" # \"MCP-03\": graph_coloring_v3,\n",
|
|
" \"AAD-MCP\": graph_coloring_v5,\n",
|
|
" \"贪心\": greedy_coloring,\n",
|
|
" \"Welsh-Powell\": welsh_powell_coloring,\n",
|
|
" \"DSATUR\": dsatur_coloring,\n",
|
|
" }\n",
|
|
" \n",
|
|
" # 评估每个算法\n",
|
|
" for alg_name, alg_func in algorithms.items():\n",
|
|
" print(f\"\\n使用算法: {alg_name}\")\n",
|
|
" score,etime = evaluate_coloring(alg_func, adj_matrix)\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}\")\n",
|
|
" for test_file, etime in results_time.items():\n",
|
|
" print(f\" {test_file}: 执行时间 = {etime}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"各算法在不同实例上的着色数量:\n",
|
|
" FunSearch-MCP EoH-MCP AAD-MCP 贪心 Welsh-Powell DSATUR\n",
|
|
"MCP0125.1 7 6 6 8 7 6\n",
|
|
"MCP0125.5 24 22 22 26 23 22\n",
|
|
"MCP0125.9 53 51 51 56 53 51\n",
|
|
"MCP0250.1 12 10 10 13 11 10\n",
|
|
"MCP0250.5 40 37 37 43 41 37\n",
|
|
"MCP0250.9 92 92 92 99 93 92\n",
|
|
"MCP0500.1 18 16 16 20 18 16\n",
|
|
"MCP0500.5 68 65 65 72 71 65\n",
|
|
"MCP0500.9 171 170 170 175 169 170\n",
|
|
"MCP1000.1 29 27 27 31 29 27\n",
|
|
"MCP1000.5 123 115 115 127 121 115\n",
|
|
"MCP1000.9 316 299 299 321 313 299\n",
|
|
"\n",
|
|
"各算法在不同实例上的运行时间(秒):\n",
|
|
" FunSearch-MCP EoH-MCP AAD-MCP 贪心 Welsh-Powell DSATUR\n",
|
|
"MCP0125.1 0.0040 0.2838 0.0055 0.0015 0.0026 0.2019\n",
|
|
"MCP0125.5 0.0030 0.3657 0.0130 0.0030 0.0030 0.2198\n",
|
|
"MCP0125.9 0.0040 0.4484 0.0180 0.0026 0.0060 0.2416\n",
|
|
"MCP0250.1 0.0134 2.0049 0.0175 0.0090 0.0111 1.5718\n",
|
|
"MCP0250.5 0.0148 2.3929 0.0468 0.0102 0.0141 1.7725\n",
|
|
"MCP0250.9 0.0145 2.8686 0.0802 0.0100 0.0327 1.8326\n",
|
|
"MCP0500.1 0.0502 15.5259 0.1433 0.0643 0.0521 14.7507\n",
|
|
"MCP0500.5 0.0700 18.4253 0.2133 0.0514 0.0777 13.2264\n",
|
|
"MCP0500.9 0.0549 20.7131 0.3302 0.0437 0.1895 14.3884\n",
|
|
"MCP1000.1 0.2133 116.7540 0.2894 0.1473 0.1852 98.2297\n",
|
|
"MCP1000.5 0.2238 145.9148 0.8791 0.1677 0.4773 109.2028\n",
|
|
"MCP1000.9 0.2306 171.2065 1.2328 0.1777 1.2785 109.2663\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# 将结果整理成表格\n",
|
|
"import pandas as pd\n",
|
|
"\n",
|
|
"# 准备性能数据\n",
|
|
"data_colors = {}\n",
|
|
"for test_file in test_files:\n",
|
|
" # 去掉.txt后缀,将DSJC替换为MCP\n",
|
|
" instance_name = test_file.replace('.txt', '').replace('DSJC', 'MCP')\n",
|
|
" data_colors[instance_name] = {}\n",
|
|
" for alg_name in results:\n",
|
|
" if test_file in results[alg_name]:\n",
|
|
" data_colors[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('.txt', '').replace('DSJC', 'MCP')\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] = round(results_time[alg_name][test_file], 4)\n",
|
|
"\n",
|
|
"# 转换为DataFrame\n",
|
|
"df_colors = pd.DataFrame(data_colors).T\n",
|
|
"df_time = pd.DataFrame(data_time).T\n",
|
|
"\n",
|
|
"# 打印结果表格\n",
|
|
"print(\"\\n各算法在不同实例上的着色数量:\")\n",
|
|
"print(df_colors)\n",
|
|
"print(\"\\n各算法在不同实例上的运行时间(秒):\")\n",
|
|
"print(df_time)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 43,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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YgXdxYoVi/X3vOeee6xChQr2wgsv2Pvvv29phfJyAAAAAKGnknFluBVYnzqV+LZar+20fYRLzdPK77//7q5LlizpX6bgu2fPni7wzqz27Nljv/32m/v5hx9+iLd+7Nix7vrRRx/1L8uRI4c7YaHtVZKekLPPPtu9tt98842lJYJuAAAAAKE3fvx/JeWnC7g92k7bT5hg0Wj+/PlubLCuE1uuscf6XYHjoEGDrGzZspY3b15r1KiRrV271n+72rVru+uHH37YDqix3P8oC6uy6UAa533ZZZe5+9H475tvvtmNBw906tQp93jnnnuu5c6d22V0n3rqKTf+OVDfvn3d/sncuXPdOOczzzzTfxLA8/PPP9s111zjxkIXLlzYBbUrVqwI+tqoHF73o21LlSplzz77rH/drl27bNu2bQlelO336DkGZrh1ffnll8d6rKVLl1rx4sXd6xroiiuucK/L0aNHLTF67nFfk3Aj6AYAAAAQWspaDxuWstu+9lrwUvQ0cPjwYduxY0esy/Hjx1N0X927d7c333zTNQZTVlbZVQWFngcffNAFmRMnTnQNwR5//HH7+++/493P9OnTrWnTpi6Q1phvBemLFi2yiy++2Pbu3evfTgG2suQNGza0119/3dq2bWsDBw50l2DGjx/vSrEVrLdp08aNLQ8s8db9L1++3N2vLps2bXLjoQNPHIiCdZ1Q0MmAl156yT0XNTlTCbhcf/31bl1Cl7p16/rvS7ctWrSoy1greFYwH9jEbt++fbZz504X2MelsfgffPCBC8gTcujQIduwYYNVrlzZ0hJjugEAAACElqYF27gx+bdTsK3b7dr133RiaUzjrHUJ9Pnnn7ssb3ItXLjQVq1a5cYVi7LZGqetQF6ZY5VEz5kzx8aMGeOC6ZdfftmGDx9uAwYMsEfUXM69HD43dlkB8ISACoDSpUu7scpqIHbvvfe6Zf/++68L8HVfnjVr1rig/Zlnnom3f4899ph99dVXLmCOSycJTp486bLKXkM3Bf5qPqZgXdl4jzL8uv9+/fq53xXsK5hWFl3B/Msvv5xoybdOJgRSEK4M9+rVq10DtMCgfP/+/UFvkxCdMNHrreeikwN6bXWionPnzpaWCLoBAAAAhFZAuXSKKLiKQNB94403+oNYz4UXXpii+3ryySf9AbdccMEF/uBbQbdkyZLFlZLros7b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sUjvDgAAAIB0QsFnkSJFYi3TuGgF48uWLXMBt4LlMWPGuHUaR63f33rrLdcZ/KKLLvLfrlq1aomWc3/55ZeJ7osC6/nz5/uD7sGDB7tAXpnuxo0bx+qCvv9/XefUtTwpNC48X7587v7USG3cuHF2zTXXWOnSpZN0e2TAoFtt7p955hl3Rmjr1q2uwcEVV1zhuvHp7I2cPHnSnnzySXv99df9Z5EaNmzoDqAKFSpE+BkAAAAAiHYqFx8+fHisZVmy/Dcad/r06e66a9eusdbrd8UcWh8YdE+aNCnWVF8TJkywiRMnup9V7n26ku9ACrrl66+/dln1xx57LFbQrRMDopMDgVQuvmbNGpeMDHy8WrVqxdquVatW7jkgEwfdOpDHjx/vSjgqVark2t+rfENnm3SwaX45tfbX/Hnquqf56pYvX+62v/HGG23FihWRfgoAAAAAopyakCm5F8w///wTtITb+91b71ECsHjx4v7fFy9enOL9Klu2rMvAa+ovBdYKwgODZE3/JSqN14kDz2+//WYXXnihS2D269fPv1z3o0BcJepKUJLhzuRB98GDB23UqFHWo0ePWPPGabxBp06d3MF7wQUX2KBBg9zk8V26dHHrtUyt9LVM12XKlIngswAAAACQnnll53/++ac/yJW//vrLXRctWjSsj69AW+Oz8+bNa1WrVo21ToH1u+++68Z7BzZY86YWO/vss2Ntf+mll/qnDEPaiOru5QcOHHBnczTmIJA69omaE+gMjQ7Azp07B93GK7cAAAAAgJTQXNYSt/xcw1u9Eu1w8krMVRrulbx7VN2ruOjtt9+O1YHca6KmSmBEVlRnulX2oANLpeM6a6ODTSXlymAre12vXj3LlSuXm+A90M6dO23kyJGuAUHcMzsAAAAAEJcai6n0Oi71lGrZsqWbB1tVuNquadOmNnfuXJsyZYpbfskll6RJ0F2nTp146xQXDRgwwLp37+7K42+//XZXEazn0r59+1gl54iMqA66ZcaMGa7Dn7r0eRRMz5o1ywXcgdQoQGeb1LigUKFC9tFHH52227kunn379oXhGQAAAACIdhoDfccdd8RbrthDQbcyyeedd5698cYb9tlnn7mx1i+//LI98sgjYd+3xIJueeKJJ9zYbA27VU8slcNrLPfTTz8d9n3D6cX4kjubexp77rnn3AGjyd7Ven/VqlWuUZrO4Khdf+AcdUuWLHHd/L777js31kFnd2rWrJngfStjHthUwLN3714rUKBA2J4TAAAAEE2OHDnigs7y5cvHS2ylxPffm9WunfLbqxdynCbbQNS9H5S01XTVp4sfo3pMtzLXffr0cYGxWuSrnOPbb7+1F154wQXUOssUtymAupprjj3NV6cMeeBE9HH16tXLvUDe5Y8//kiDZwUAAABkbPnzR/b2QDSJ6ky3xnKrXCPumQM1V9PvzZo1s2nTpgW97dixY+2uu+5ypR9e44PTSeqZCgAAACAjCXWmW3791Wz//pQF3OecE5JdAKIi0x3VY7q98wGBXfi83xV46/Ljjz/ae++956YU05zdcdv6Hz9+PI33GgAAAACBM5AOyss1WbsETv6uQLx///4umK5du7adOnXKXnzxRXv11Vdj3VadBNVOP3CuOgAAAAAA0lJUZ7o1Jrty5cquG9+ECROsZMmStn79epfqL1GihCs9V5fydu3aufHZGgOudv1Lly61iRMnumWadgwAAAAAgEiI6qBb9fMLFiyw3r172xdffGG//PKL5cuXz43RHjhwoAu4ZfTo0a5buTLiH3/8sZ1zzjlu2Z133hnppwAAAAAAyMSiupFaWqORGgAAADKjcDRSA9KrI5lpyjAAAAAAANIzgm4AAAAAAMKEoBsIgqnmkFwcMwAAAAiGoBuIY8OGDValShXXBR9Iiu3bt1utWrVs2rRpkd4VAADShcPHD0d6F4A0Q9CNiIq2Pn5qgtCiRQvbvXu35c+fP9K7k2mdOHHC0hM12NDl1ltvte+//z7SuwMAQFRb+PtCO2vwWbbo90UWbf744w+LiYmxVq1aJbiNpibWNi+++GK8dR07dnTrdMmbN69L5HTr1s3++uuvZO+LZmby7mvPnj3+5bo/LStXrlys7ZcvX26XX365e9yiRYvagw8+aPv37/ev79u3r//+dMmWLZtVqFDBnnnmGSr2woygGxGzZvIae7HIi+46Wtx11122efNmmzp1ql1wwQWx1p08edJeeeUV9+GZM2dOq1ixovs9lCcOUvsYr776qvsQrV69ekQ/PBctWmRXXXWVnXHGGS4Y1Qf67bffbr/++muCz/vll192zzt79uzuUqZMGfefgLpHhsJ7770X6z+auJfXX389xc9DJ2hmzJhhhQsXtrZt28b6Dw4AAMTW+6vedvjE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0Gzq2WafnZP8i2534lCa7WqlSpX8vaJWrVrl+kO1b9/e/T5x4kT3+yeffJLs++3bt2+qe02VK1fOOnbsmKr7iLs/3iVbtmyuIlhTM6tfVrTom8TXrUmTJu6SHkR9phsAAABAOpMtr1nhi8y2L1Er5GTcMMas8MVm2fJYWtG43Z9++sn9/Ouvv7rrDRs2uOu//vrLXWek4aqaXrlq1aquJ5aG8j7//PO2adMm15Aa4UGmGwAAAEDoVdc0vskdBuozq/6spSUF3f/++6/L9nrBthd8b9261b9NRnHllVdau3btrHPnzvbRRx/Zgw8+aO+++66tXbs20ruWYRF0AwAAAAi9Yk3MijQwi8matO21XZGG/90uDSmgVo+ov//+2wXbLVu2tB07driO1Mp0Fy5c2DVzzqiaN2/urr/99ttI70qGRdANAAAAIHzZbt/JpG2r7dI4yx2YxVaArUz35Zdf7sY7KwBXpjswy/3222+7qYw1y1LFihWtR48eduhQysafr1y50gX4RYoUsfz589sll1xis2fPDrqtZnFq1qyZ265UqVL27LP//zrt2rXLtm3bluBl+/btie6HN3762LFj/mWapvn6669302DpoubVWuapUaOGNW7c2P28YsUKdx+33Xab+12zS+n3OXPmhOV1S48IugEAAABENtsdoSx33KBbgXblypWtbNmyLgDXMm88d8+ePV0pdqNGjWz48OHWtm1be/XVV+2GG25I9mMqUFZwr8Bb9/vyyy9b1qxZ7ZprrrF169bF2vb33393j1miRAl76aWXrEyZMtanTx8X3IqCY61L6FK3bt1E90X7IHreojLziy66yBYvXmy9evVylyVLlrhlXgl6vXr1bM2aNf7mc7J69Wp3reUKur3H7RnC1y29opEaAAAAgPBmu+deFpVZ7sCgW5lclZgrE6uLflemWOvVaOzFF1+0xx57zLp37+6/7YEDB+zNN99025577rlJfkw1blPgPXToUOvatatbdtVVV9mAAQPc8kDz5893Hcb79evnflfQqmB67ty5LgOtgH337t0JPlbu3Llj/a6yea98ftGiRTZ48GCrWbOmNWjQwK3v1q2bHT582L755hv/c9JjVq9e3R555BH7/PPPXdCtaZ2VRddz0ckCLde4eGXldbuCBQuG/HVLrwi6AQAAAIQ/273j6+Cl5spyF64fkSy3FC1a1PLmzWsLFy50vyvIVtC9dOlSF0Tqd5VKnzp1ygWQusSlLG9ygsfzzz/flYq/9dZb7vGVFVZGXb/HVbx4cddx3KMx5gq6FbiKN91ZUl133XWxfr/44ovtww8/dNlpBdsK5lu1ahXr+ehnjf2eOXOmHTlyxAXdXlZbme5bb73V5s2b57L0WuatD/Xrll4RdAMAAACIXLY7glnuwPmwZ82aZWeffbYbd6y5u5WJFQXdXpMxBcUKyIMF0clx1lln2aeffuqy15qH++jRoy74vvfee92yLFn+fxRwrVq1LGfOnLFuH7g+uVSirjHZKmcvXbq0e64eZdlPnDjhxo3HpWVap230fHWiQgG2Mt0vvPCCW6ZSdQXenTp1crfxxpO/FaLXLb0i6AYAAAAQmWx3hLPcHgXWP//8sz8wDAwQlYFWmbRoPPUVV1zhX6cSbZVTe83IkqNJkybuokBWwetrr73m5sxWFltjoD1qtBZKyozrcYM588wzXTD+559/xlun8e1qMOdto5MBX331lStVr1atmmuUNn36dNcgzct0Kysf6tctPaKRGgAAAIDIdDKPgix34LjuuEG3MspewKifJ06cGOt2CpTVdTyws3dS6H6UOdb84ApkNV5aGWhZvny5RYrGf6vBm7L+Gzdu9C9XU7kvvvjCrVMlgCiwnjJlijspkSdPHhd0T5o0yWXllUmXUL9u6RWZbgAAAABpn+2Okix3sKDb61iuwDh79uxu+eOPP+6ajilL27p1a9dVfMiQIW6s86WXXpqsx1PAuWfPHjd2+o477nDBrgJW8abiihR1Ftfz0eXhhx92y/Q8FWxrnUdBt8ZrK9gWXet3Bdw5cuRwy0L9uqVXZLoBAAAApH22O0qy3IFBtxdsK3OrMu/AOboHDRrkxiYraFQXbzUfU6fvjz/+ONljrDWOWnNyq3RcHcvVwVxzgmtKrQ4dOlgkqVR82bJlrsGa9k0X/axl5513nn87TSEWOC7bC7690vJwvG7pVYzP5/NFeieixb59+1xre52F0STwAAAAQGagjtS//fabCzK98uGw+bKh2fbF/83LfeV/HcOB9Ph+SGr8mDlOLQAAAACIDjX6m2XN8981kAkwphsAAABA2inayKztDrNsuSO9J0CaINMNAAAAIG0RcCMTIegGAAAAACBMCLoBAAAAAAgTgm4AAAAAAMKEoBsAAAAAgDAh6AYAAAAAIEwIugEAAAAACBOCbgAAAAAAwoSgGwAAAEDUOHHoUKR3AQgpgm4AAAAAEffPt9/al3fcYR9dcokd2bUr0rsDhAxBNwAAAICIB9tz77zTtv/wg/lOnLDj+/en6T5s3rzZYmJi3CVr1qxWpEgRa9asmU2aNCnWdj6fz8aNG2c1atSw3Llz29lnn23dunWzI0eOBL3fTp06ufv87rvv4q0rV66c/zGDXTz6+YYbboh3+zp16rj7kPnz58e6bbZs2ax8+fJ255132qZNm0LwCiE1sqXq1gAAAACQwmB71bBhtv377y0ma9b/Fvp8Ed2nli1b2k033eQCVQXXN998sy1cuNBef/11t/6pp56yAQMGuGD2oYceskWLFtnQoUNd0P3WW2/FC9Bnzpzpfp4xY4bVrVs31vohQ4bYgQMH3M/PPPOM7d+/31599dVU7b/2t3Xr1nbw4EH78ccfbezYsfbpp5/aTz/9ZCVLlkzVfSPlCLoBAAAARDTY9p08adGgatWq1qFDB/fzY489Zg0aNLDhw4db27ZtrV69evbyyy+7rPOYMWPcNvfee68LuEeNGmX9+/e3s846y39f33//vW3bts0fdPft2zfWY1133XWxAvBTp05Zu3btUrX/NWvWjHUfF110kTtBMGHCBOvZs2eq7hspR3k5AAAAgDQtI9+xcmVUBdvBFChQwJ577jn3s7LeCqCPHj0aL2P84IMPuhJzZZcDKdD2AvMVK1bYP//8Y2ntqquu8pfPI3IIugEAAACETXoLtgNdfvnl7lpjssuWLWuFCxd2WeMFCxb4t7nsssvspZdesjJlysQLuitXrmy33HJLrFLztPTnn3+666JFi6b5Y+P/EXQDAAAACLl/ly9Pt8G2J3/+/K5k/K+//nLNyTRGWuXkTZo0sUaNGtm0adNcQB3X9u3bbfny5da4cWO7+OKLLWfOnP7MdzgdOnTIduzYYf/++687MXDPPfe4xnAa643IIegGAAAAEFInjhyxeffd58Ztp8dgO5C6lHul42pSpqZkGvet7HebNm3skksusd9//z3WbT7//HM3RlvBuW6v8eBffvmlHT9+PKz7qnJ4dV4vVqyYe2wF/+rAXq1atbA+LhJH0A0AAAAgpLLlymWXvf22FalVy/3u706eDimznTdvXv/vlSpVcmO8FWh37tzZvv32W6tfv77tCphb3MtqK9hV5rl27dq2b98+1+08nDRFmYL7Xr16ud/79etn119/fVgfE6dH0A0AAAAg5IrWrm1XTpxoTceOtcI1aqTL4Fvl2jt37rRSpUq54Hnt2rV27Ngx/zjpYcOGufHcW7dutbffftstP3HihM2ePdv9rPm8lXlWd3IJd4m5TghcccUVbgqy4sWL2+DBg13GHZFF0A0AAAAgbIrVq5dug+/58+e7MdvKZI8YMcJNKab5rwPdeuutsTqEL1261Pbs2WO33Xabyzp7F3VDT0nQrdt583kH0rzehQoVCnqbXLlyuSnP1q9fbx9//HGyHxOhRdANAAAAIOzSW/CtQPepp56yLFmy2H333ecfFz19+vRY23kl4956L7Du2LGjyzoHXtatW2cbN25M1n6cd955rinb3r17/csU4G/atMmtS8j999/vmsANHDgwWY+H0CPoBgAAAJBmojn4/uWXX2z8+PFuLPQFF1zgstoKWuvUqWNXX3211a1b1/r37+/GTo8cOdJ69uxpd911l1WoUMEF2V7QnSdPHtfdPFDLli3965Oje/fursRdndBfe+01V86uqcxUNv7EE08keLt8+fLZww8/bD/88INr7IbIIegGAAAAEBXBt8XERHSfNJe2gujhw4e78dhfffWVP7DV1FsqE3/ggQfsiy++cE3UVLqtYFvN1DS9mJqr/fzzz27ubk0TFqhFixZBM+Wnow7pY8aMcWXuCsA1XlvdyT/99FO78MILE71tly5dXHn6gAEDkv1aIHRifMEmlsuk1FGwYMGCrnRDBycAAACQGahD92+//Wbly5d344Ej4Z9vv7VVw4bZjlWrrM28eZbrzDMjsh/AkSS+H5IaP2YL034CAAAAQLIz3ycOHbJsefJEeneAkKG8HAAAAEDUIOBGRkPQDQAAAABAZg26jx8/br169XIdAVVPX7JkSWvfvr2bgD7Y5PXqKNi3b9+I7CsAAACQntHuCbCQvw+iPuju2rWrDR061G6++WbXRfCOO+6wadOmWZMmTezYsWP+7fTz7bff7uawAwAAAJB02bL91+rpxIkTkd4VICoSv17H+lCI6kZqBw8etFGjRlmPHj3s+eef9y+vXLmymxtv8eLFbo66bdu22fXXX29//PFHRPcXAAAASI8UXOiibsya+grIzFnuvXv3uinfsmfPnvGD7gMH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g1WpUoXu+kgyzcpw++232xNPPBHpXQEAAEB67l6urLfQeRzJppJxNUhTc7Vdu/6bh1vTgqlLeRQdT3v37rUWLVrY7t27LT/TliGJNINDoUKF7OWXX7aKFSvaAw88EOldAgAAQHrtXq7yyUcffdTeeecdF3wTgCNZdLxoOrFy5f67jrLj56677rLNmzfb1KlT/U3/PCdPnrRXXnnFZcE1V72CK/0erpLijh07nvb9pX2aMGGCNW3a1AV9+fLlc40L33//fYuE+fPn+z8XTnfRtoE++eQTa926tRUuXNhy585tdevWtTfffNOVbYeKTqZoFgWdQNTUh6rk+fzzzxPcfsuWLdahQwcrWbKk5ciRw92uWbNm9uWXX8bbVvt61VVXWbdu3ez7778P2T4DAAAgE2W6PZoCbPbs2S7YuPHGG6179+6h2zMgQj788EObMmWKDRw40HXfD6Rj/c4777SJEye63xVwb9++3R577DEXpL/22msh3RdNrTd+/PhEtzly5Ihde+217r3o7dOhQ4dc80NdPv30U3dyLGvWrJZWFPTXqFEj0W00VOXYsWMuiA18bb3nW6ZMGcubN68tX77cXSZNmuSGtmhZauzZs8edkFi9erWb6rB8+fJuVgYF+vrb33DDDbG2//333+2iiy6yf/75xwoWLGgVKlSwP//80wXcugwZMsQefvjhWNnu9957z84//3x38mbFihVp+toDAAAgyviSaeDAgb4vv/zSFxMT4+vVq5fvjjvucD/rkiVLFnfp0KGDb9y4ce5neeedd9zPR44ccdsNHTrUN336dLds586dvmixd+9epSrdNcLk8L8+375fk3/R7dLA0aNHfeXKlfPVrFnTd+LEiXjr33jjDXeMFChQwDd//ny37MCBA76mTZu6Y9tbFgoDBgxw96nHS+yt+sgjj7j1FStW9H3//ff+5VOnTvXlzp3brXv22Wd90eSHH35wz02v88mTJ90yfS5oX4sUKeKbM2eOf9tFixa5ZVp31113pfqxb7rpJndf559/vu/33393yzZs2OArWbKkr3Dhwr4dO3bE2v6aa65x2z///PO+U6dOuWXHjh3zvfLKK255zpw5fVu3bo33OJMnT3brR48enep9BgAAQPRJavyY5KD78OHDvquvvtoFytWqVXPXP//8s2/t2rXuy7O+WF5//fX+4NvbJjDoVkBD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5cyZ010AAAAAAMjUmW5lrz/++GO7+eabLWvWrEG30Tjv3377zW677bY03z8AAAAAANJt0D116lQ7cOCA3XrrrQluo/m6CxUqZC1atEjTfQMAAAAAIF0H3cpyFytWzDVRC+bUqVMuMG/evDkl4wAAAACAqJAugu4TJ07YV199ZY0bN05wm+XLl7v5uRPbBgAAAACAtJQugu6vv/7azaHdqFGjBLeZNWuWu05sGwAAAAAA0lKMTy2/4Siw13zdmj6sQIECkd4dAAAAAEA6jx/TRaYbAAAAAID0iKAbAAAAAIAwIegGAAAAACBMCLoBAAAAAAgTgm4AAAAAAMKEoBsAAAAAgDAh6AYAAAAAIEwIugEAAAAACBOCbgAAAAAAwoSgGwAAAACAMCHoBgAACKHjx49HeheQCaTX4yy97jfSl+NRdpwRdAMAAITIhg0brEqVKrZ06dJI7woysGXLllnVqlXd8Zae8P5AWh1nen/ofRItskV6BwAAADKCvXv3WosWLWz37t2WP3/+eOt37txpM2fOtF9++cWyZctml156qV1++eWWPXv2iOwvotPGjRttxowZtm3bNsuXL581b97cateuHWsbLddx1rJlS/vuu++sYMGClt7fH0BS/PXXX+79sXnzZsuVK5dddtll1qBBA4uJifFvkydPHjt58qRdffXVtmLFCitTpoxFnA9+e/fu9ekl0TUAAEByXH/99b5s2bL55s+fH2/dzJkzfYUKFXLfMwIvtWvX9v3+++9B7+/nn3/2XXfddb6CBQv68ubN62vVqpVv7dq1YX0OS5Ys8WXNmtXXoUOH026rbSL9VbJx48bxXtNgF20X6J577kl0+59++inV+6a/a/v27X0lSpTwZc+e3VeyZEnflVde6Zs9e3aCt3n++ed9WbJkibc/7dq18x09ejTWtgsWLHDHW9u2bX3p/f0RTMuWLd1z/+233xLdbuXKlb78+fP7+vTp4wu3DRs2+PLlyxfveArmmWeeSdL+h5P3Hj3dpWzZsrFu179//0S3/+yzz1K9bzt37vQ9+OCDvjJlyrj3R9GiRX0NGjTwffDBBwneZsyYMb5cuXLF259mzZr5du3aFWtbfVYWKFDAd9FFF/lOnDjhi3T8SKYbAAAglT788EObMmWKDRw40Bo3bhxr3dq1a+3666+3LFmy2IsvvmhNmza1P//805577jmXpbzzzjtt7ty5sW7zww8/uPvZv3+/FShQwIoXL+6yO19//bV98803VqlSpZA/Bz3WHXfc4TJEpzNgwAAbP368RZpehz179iS4XlnVLVu2WI4cOWItV/ZLf48LLrgg6O1y586dqv36/fff7aKLLrJ//vnHZaErVKjg/uZffvmluwwZMsQefvjhWLcZN26cPfXUU1a+fHl7/vnnrVq1am4/e/fube+8846dc8459swzz/i3b9SokduuZ8+e9vHHH9sNN9xg6fH9Eczw4cNdVcjpqBpA2Uwdu+Gm90W7du3swIEDp932vffes2effdYiTRneGjVqJLj+4MGDrhQ72PtDzj//fMuaNWu826W2smLPnj2u0kefjXnz5nXvD/0tFy9e7C4qC3/11Vdj3WbevHnWqVMnO+uss2zo0KHu/aXbP/300zZ79mx77LHHbMyYMf7tK1eubG+//bbdcsst7r4ef/xxi6iwhf3pEJluAACQXMpAlitXzlezZs2gGZXmzZu77xdTp06NtXzfvn2+woULu3XKoHkOHz7ssj9afsstt/gOHjzoliu7pCz0ZZddFvasWGKZ7gEDBvhiYmL820YzVQpoH6dMmeJfduTIEZdZq1y5ctge95prrnGPq8z1qVOn3LJjx475XnnlFbc8Z86cvq1bt/q319/4zDPPdBnbuJUPS5cudbcpVapUvMfR8abjrkKFCu7+0+P7I641a9b4cufO7T++EsoU6z1z3nnn+bcLd6Zb959Q5USgcePG+XLkyHHa/Y8G3bp1c/uo4zKQPn/0Nzh58mRYHrdr167uce+//37/cavHevfdd917U+uWL1/u317voSpVqrjPv++++y7Wfen9otvoos/OuK6++mpXLaTMeiTjx+j+pExjBN0AACC5Jk6c6L4/qIQ8Ln3h1hfFhg0bBr2tF5DPmDHDv+zVV191yypVqhSvpLhjx45uXVJLdJPqo48+cver0tmEgu5Dhw65kwBarzLQaA+6vWBV+xpIX9q1/MYbbwzL4+p1Uhl16dKl/QF3IB0Leny95nGPoaeffjrofSpI13rvBEwgHTta9/777/vS2/sjLh3vF154odteQyoSClrnzJnjTlIouK1Xr17Yg+6vv/7a/U2990ewoFsnFB555BG3vmrVqm7/ojno3rx5szuudMIm8HNm+/btbr/r1q0btsc+++yz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TZrknkuwxljR/v5AdL0/1KxPJ0r69+/vz+p7x+3TTz/t+kGoykbN71KqQYMGLujX/gTryO/NPhB4POuzU/0NNBxBJwS92+lEpt63+l1NKoNVuCh7r+EAEX9/hHyysnSMeboBAEBK5pytXr26r0KFCr5Dhw7FW685losWLeqf+7ZixYq+M844w/1epEgR348//hjvNr1793brtd0LL7zgGzFihO+8885zy4oVKxbvu8qbb77pq1Gjhq9Tp06pei6hnqe7RYsWbr80X3M4aR5ezYGtObj379+f6LYPPPCA2+8CBQr4Wrdu7bvhhhvc38GbH/3777+Pdxu9rnoeep2TomfPnu7+mjRp4ps4caJv9uzZvjFjxvgaNWrklrdp08YdN4E0Z3u2bNn8cw9XrlzZlytXLvd73bp1fbt37473ODredNzVqlUr3v2ll/dHQkI5T7eOP/39dDymRqjn6U7ucZVSmo+7UKFCbn/WrFmT6LaDBg1y2+nYu+qqq3w33XSTr0yZMm6Z7mPWrFnxbvP000+756HrpHjjjTfc+7VmzZq+UaNGuffHO++84+bo1uNcfPHFvsOHD8e6zcKFC3158+Z16/U+Oeecc3z58uVzv+sz9ffffw967NWvX99XsmTJZB174YgfCboDEHQDAICUBqv6Etm5c+eg67du3eq7//77XVCnL4ylS5f2PfTQQ76///476PbHjx/33XPPPf7A1rvoS++SJUsSDDySEgykZdDtBR5jx471hdN7773nHqdOnTqn3VZfxD/44AP3xV5f4hV8K6gdMGCAb8+ePYkGgIkFdnF99tlnvlatWrkTLvqb58+f3z3OkCFDXBAUzHfffee79tpr3d85R44cvmrVqrkg6OjRo0G31/Gm427BggW+9Pz+CHfQreNP2+h4jKagOyXHVUosXbrUf5IvKRQEX3bZZb6CBQu6wFYnTXr16pXg55U+L5L6ueFZtGiRO+Glz8Ts2bP78uTJ47vgggt8/fr18x08eNAXzLp163y33367ex66TaVKldx+JRS7vfTSS26/dOIr0vFjjP6JbK49emgKDjWhUImCmj4AAAAklRoQaTykpj9KbE7l5JgzZ44bY6omSBqT2LlzZ1f+nF6os7PK59XgLNqafKV3Gn+u4+zRRx/1l+RmtvdHeqcu6Xo/a1q4xMq+kXxz5851zdc0PdrkyZMt0vEjQXcAgm4AAJBSGqetZlbqlKsv0a1bt7bMTmNDNW599OjRkd6VDEVd2BVMaEqr2bNn+xtORTPeH/FpDP+YMWNcgIjQ0cwPGuNdpkwZW7ZsWYJzkqdl/EgjNQAAgBBQ4PPJJ59Y27ZtXVYaZsWLF7c+ffpEejcyHM0PreNMHanTQ8AtvD/iy5Url7+xHkJHMwPopI5OSIUz4E4OMt0ByHQDAAAAAJKCTDcAAAAAABFG0A0AAAAAQJgQdAMAAAAAECYE3QAAAAAAhAlBNwAAAAAAYULQDQAAAABAmBB0AwAAAAAQJgTdAAAAAACECUE3AAAAAACZMejevHmzxcTEJHqJa/78+ZYlSxYbMGBARPYZAAAAAABPjM/n81mUOnjwoE2dOjXoumeffdZdr1+/3r/swIEDVr16dcufP7+tWLHCsmXLlqzH27dvnxUsWND27t1rBQoUSOXeAwAAAAAyqqTGj8mLStNY3rx5rV27dvGWL1u2zH799VebMmVKrOVPPPGE/f777259cgNuIDHHjx+37NmzR3o3kI6cOHHCsmbNGrQiBwAAAJlHVJeXJ0TBdcOGDa1Nmzb+ZXPmzLG33nrLunbtanXr1o3o/iFj2bBhg1WpUsWWLl0a6V1BOnHq1Cm7/fbb3WcVAAAAMrd0lw7+4osvbPHixbZo0SL/sv3791unTp3srLPOsssvv9w++eQTq1mzppUtWzbR+zp69Ki7BJYHAIFUKtKiRQvbvXu3G7YQSSdPnnT9CsicRpY+M+bOnWtff/21C67PO+88a926tSst8ujvVKhQIXv55ZetYsWK9sADD0R0nwEAABA56S7TPXjwYLvooousQYMG/mV9+vSxLVu22M6dO619+/Z2yy23WPny5e2xxx5zX4oT8sILL7gvyt6ldOnSafQskF7cddddrqGfegtccMEF8YLgV155xWXBc+bM6YIr/R7KNgmrV692FR0K4DRkInfu3HbllVe6IRRxlStX7rSNB3Xp2LGjpRU1NkzKPumibT1bt25NdNsbbrghJPs3ZswYVxmTJ08ed1KlatWq1qNHD3eyJaGqh9q1a1urVq3s+eefdw0bNQTm3HPPtXnz5sXa9s0337SrrrrKunXrZt9//31I9hcAAADpT7rKdKs5mr7YfvTRR/5lf/zxh73++uuWL18+l+FWpvvQoUPWr18/F6CfeeaZ1rt376D316tXL3v00UdjZboJvOH58MMPXd+AgQMHWuPGjWOtU2B955132sSJE93vCri3b9/uTvQoSH/ttddS/fhLliyxZs2aueNZJ4UuvfRS27hxoxtKsWDBAvv0009dUOdRxlXBeUL++ecf27Ztm+XIkcPSit6XNWrUSHSbX375xY4dOxZrv/Rel5IlS1qRIkXi3UYn1VKrZ8+eNmjQIDfuukyZMm4f1q1b5z43pk2b5qppihYt6t/+yJEjdvXVV9vatWtd5lrBtk7qKbh+77337KabbnK312eOl+3W8vPPP9+dvNFz0mMBAAAgk/GlIx07dvQVL17cd+LECf+yt956S2lF39NPPx1v+woVKvjKly+f5Pvfu3evuy9dIzIOHTvkiwZHjx71lStXzlezZs1Yx5vnjTfecMdKgQIFfPPnz3fLDhw44GvatKkvJibGvyylDh065CtdurR7jB49evgOHz7sluv6lltuccu1f6dOnUrS/Wm7WrVquX1bsWKFL1r88MMPbp/0Op88edK//JlnnnHP8f333w/L4+o10OOec845vk2bNvmXr1u3zu2LHrtLly6xbvPCCy+45Q8//HC8+2vevLlbN2rUqHjrJk+e7NaNHj06LM8FABAZxw8ejPQuAGG3fr2+NyX/ottlBnuTGD+mm6D74MGDvnz58sX7wtu/f3/3RBcsWBDvNi1atPDlyJEjyY9B0B1ZCzYv8OV+Prdv4eaFkd4V38SJE92xMHPmzHjrjhw54itWrFjQQGrjxo2+LFmy+Jo0aZKqx3/ttdfc/d93333x1u3cudOXLVs2t37VqlVJur/33nvPbd+uXTtfNGnWrJnbrzlz5sRa3qpVK7f8559/Dsvj9u7d293/yJEj462bO3euW1etWrVYJy0qVarkPoOCfT54AfkTTzwR9PHq1avnq1KlSoifBQAgErZ9841vdrt2vveqV/cd3rkz0rsDhI0CZ6VoU3rJDIH33iTGj+lmTLfG1Goe7ltvvTXW8rPPPttdB2supVLaYsWKpdk+InV6f9XbDp847K4jbcKECVahQoVY5dselXarVFuN++64445Y63Sbpk2bumZ/CY0LTgqVq6sT/zPPPBNvncqXvaZde/bsOe19qWz6qaeesly5cln//v0tWqgZ2ezZs12jOr1mgb777js3zrpy5cpheex///3XXQf7fPDK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33bbbRzXUYZGakhTPXv2dEF3y5YtbcCAAbZu3Tp7+umnrXLlykEbQQDpjcZQ9enTxzp16mS333673Xffffbhhx/azJkz3RgslTYC0UjH68aNG90UNCox1yWwUumSSy7h2Ea6kj17djdEQvMYqzfBTTfd5E4uqTxXwyeuvfZaPrOR7uhEUTC5cuVyGewrrrjC/c5xHWV8QBr74osvfCVKlNApZ3epWrWqb/Xq1ZHeLSDZGjdu7C7BDBo0yJczZ07/cd66dWvf3r1703wfgaTYuXOn/1gNdunQoYN/W45tpDcfffSRr06dOr68efP6KlSo4HvyySd9+/fvj7UNxzXSu7Jly8b6rBaO6+gRo38iHfgj8zl8+LAtWrTIjRds2LChOxsNZDT//POPGz+l8bEJnZkG0iOObWREHNfIiDiuowNBNwAAAAAAYUIjNQAAAAAAwoSgGwAAAACAMCHoBgAAAAAgTAi6AQAAAAAIE4JuAACSMfNCeug/unLlSnvppZfs1KlTFk1OnDhhAwcOdJdDhw4luq1e51GjRtmvv/5qae348eMh2fb++++3mJgYmzJlSkgfEwCQvhB0AwBgZuvWrbMGDRrYNddck+A2gwYNslKlStnzzz+f7PsfOnSo3X333ZYWnnnmGXviiSfspptuiqqTBNqXXr16ucuxY8cS3bZPnz52zz332C233BJr2wMHDti+ffvcspMnT4Z8Hzds2GBVqlSxpUuXJrrdL7/8Yt27d7fixYvbkiVLgm6TK1cud503b95E7+v111+3yy+/3J3UAQBkPNkivQMAAJzOgw8+aFOnTrU8efJYtmzZXPYwqRSYKUBTZvWzzz6ziy++OMGAUMFTmTJlEryvuXPn2tatWxPdJhgFU2+//batWbPG3VZBcWDw1qhRI8udO7dlz5493vNTtloZYmVCdT8bN260ggULJvhYM2fOtE8//dQFg6+88kqs+xo8eLAL/hUMBnsd9VhHjx51l759+7pMbSjp+ekx9VrnyJEj0W27detm48ePt++//94F6S+//LJ/+ejRo5P8mDfffLN98MEHSdp279691qJFC9u9e/f/tXfmoVaUbxx/fwkJ1o3UVlu09VYuaSstchNLs0VNW8w2c0mk3UrDjDAzjSANSQsqI0tLSyyM8iJpG1aGLVpYQS6VtzQjlKI/gvPj88B7eO/cmTMz595T91y/Hxjucc6cmfedGYTv+zzP93E1NTXF/dz3TZs2WQbBxx9/bO8B4txz//33uzVr1rh27drFim7mXYqOHTvauzdq1Cj36quvZp6bEEKI6kCiWwghRKvn77//NkGEeI4Ti0Q///zzT4so7r///k1EtxespSKjXhghfuPgGp988ok7/PDD3ciRI3ONn3OuWLHCBD9itnv37m748OFFocvcmCNCdJ999rHNi1O+Z2PuiOFSkWvOwwIFvPDCC00WB7gGgpLxIBC5Tgj3yV+HLeSHH35wxx13XOK1TznlFPf111+n3gvuM9dIE6KdOnWyORABnj17thswYIAbOHCgO+KII9xpp51mc+BdYB5xizANDQ22yJEm7kNGjx7ttmzZ4latWuV69uxZ3D916lRbwID27dsX79sbb7zhzj33XHfQQQfFns+L7uh9jnLddde5bdu2uSlTpri+ffu62267LfOYhRBCVAEFIYQQosqZPHkyStT+lsvmzZvtHN27d4/9ftGiRfb9pEmTyr7GypUr7Rw1NTWFhoaGQkszfPhwO//48eNb/Nxbt261c7dr165QW1tb3Lp27Wr7e/funek87du3t+P/+eefTMePGDGiMGzYsML69etzjXfBggV2nbFjx2Y6/pVXXrHjZ82a1eS7PXv2FKZNm1aor68v/PXXX4W6ujo7No7t27cXPz/00EN23OrVq+3fH330kW1JDBo0qLDffvsVtmzZkmnMQgghqgPVdAshhKgKiGSTlh2NwKZBOvBZZ51lUermsHjxYvtLejbR9FJb0hiJ1hLFnDFjhqV/tySkjr/++uvuhBNOKKZityRElYGoLqnWfnvttddsP5Fr0uB37NhhEXfS+X3ddRid9ynYRO/JHti5c2ejDARS2qmtX758uf170aJFNq8+ffqUNe4skW7GSYp479693b333tvke54p795FF12UmAkBzJmaf6LxeASE8P7179/fXXvttZZtEAclCNyXBx98MNPchBBCVAdKLxdCCFEVYKhFijZpuKQdZwGxRw3wunXr3MSJE5sYXiGSSKmOGl3xO9LREWMHHnigCcOVK1daLTWCMIm33nrLUp1JQU5i7ty5rqVBmCIaEYdLly61+Xz11VcmkLt06dKiojsJxDQiPEzLziqGN2/e7Lp162afqZnnOY0ZM8b+nad+P44sv1+yZImllVMPH63L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",
|
|
"text/plain": [
|
|
"<Figure size 1000x600 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# 计算每个算法的平均性能和平均时间\n",
|
|
"avg_colors = df_colors.mean()\n",
|
|
"avg_times = df_time.mean()\n",
|
|
"\n",
|
|
"# 中文显示\n",
|
|
"plt.rcParams['font.sans-serif'] = ['SimHei']\n",
|
|
"plt.rcParams['axes.unicode_minus'] = False\n",
|
|
"\n",
|
|
"# 创建散点图\n",
|
|
"plt.figure(figsize=(10, 6))\n",
|
|
"\n",
|
|
"# 设置坐标轴范围\n",
|
|
"x_max = max(avg_times) * 1.05 # 扩大20%\n",
|
|
"y_max = max(avg_colors) * 1.05\n",
|
|
"x_min = min(avg_times) * 0.99\n",
|
|
"y_min = min(avg_colors) * 0.99\n",
|
|
"plt.xlim(-5, 45)\n",
|
|
"plt.ylim(y_min, 84)\n",
|
|
"\n",
|
|
"# 定义不同算法的颜色和标记,确保数量足够\n",
|
|
"colors = ['red', 'blue', 'green', 'purple', 'orange', 'brown', 'pink', 'gray', 'olive', 'cyan']\n",
|
|
"markers = ['o', 's', '^', 'D', 'v', '<', '>', 'p', 'h', '8']\n",
|
|
"\n",
|
|
"# 绘制散点和标注\n",
|
|
"for i, alg in enumerate(avg_colors.index):\n",
|
|
" x = avg_times[alg]\n",
|
|
" y = avg_colors[alg]\n",
|
|
" plt.scatter(x, y,\n",
|
|
" color=colors[i % len(colors)], # 使用取模确保不会越界\n",
|
|
" marker=markers[i % len(markers)],\n",
|
|
" s=100,\n",
|
|
" label=alg)\n",
|
|
" # 为DA和EOH设置不同的标注位置\n",
|
|
" if alg in ['DSATUR', 'EoH-MCP']:\n",
|
|
" xytext = (-90, 20) # 左上方偏移\n",
|
|
" elif alg in ['FunSearch-MCP']:\n",
|
|
" xytext = (-50, 20)\n",
|
|
" else:\n",
|
|
" xytext = (20, -5) # 右上方偏移\n",
|
|
" \n",
|
|
" plt.annotate(f'({x:.2f}, {y:.2f})',\n",
|
|
" xy=(x, y),\n",
|
|
" xytext=xytext,\n",
|
|
" textcoords='offset points',\n",
|
|
" fontsize=18,\n",
|
|
" bbox=dict(facecolor='white', edgecolor='none', alpha=0.7))\n",
|
|
"\n",
|
|
"plt.xlabel('平均运行时间(秒)', fontsize=18)\n",
|
|
"plt.ylabel('平均着色数量', fontsize=18)\n",
|
|
"\n",
|
|
"# 设置刻度字体大小\n",
|
|
"plt.xticks(fontsize=14)\n",
|
|
"plt.yticks(fontsize=14)\n",
|
|
"\n",
|
|
"# 添加图例\n",
|
|
"plt.legend(fontsize=14, loc='upper right')\n",
|
|
"\n",
|
|
"plt.tight_layout()\n",
|
|
"plt.savefig('mcppareto.png',dpi=300)\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"每个实例的基本信息:\n",
|
|
" 测试实例 顶点数 边数 密度 平均度数\n",
|
|
"0 DSJC0125.1.txt 125 736 0.094968 11.776\n",
|
|
"1 DSJC0125.5.txt 125 3891 0.502065 62.256\n",
|
|
"2 DSJC0125.9.txt 125 6961 0.898194 111.376\n",
|
|
"3 DSJC0250.1.txt 250 3218 0.103390 25.744\n",
|
|
"4 DSJC0250.5.txt 250 15668 0.503390 125.344\n",
|
|
"5 DSJC0250.9.txt 250 27897 0.896289 223.176\n",
|
|
"6 DSJC0500.1.txt 500 12458 0.099864 49.832\n",
|
|
"7 DSJC0500.5.txt 500 62624 0.501996 250.496\n",
|
|
"8 DSJC0500.9.txt 500 112437 0.901299 449.748\n",
|
|
"9 DSJC1000.1.txt 1000 49629 0.099357 99.258\n",
|
|
"10 DSJC1000.5.txt 1000 249826 0.500152 499.652\n",
|
|
"11 DSJC1000.9.txt 1000 449449 0.899798 898.898\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# 统计每个实例的基本信息\n",
|
|
"instance_info = []\n",
|
|
"\n",
|
|
"for test_file in test_files:\n",
|
|
" adj_matrix = load_graph_data(test_file)\n",
|
|
" if adj_matrix is None:\n",
|
|
" continue\n",
|
|
" \n",
|
|
" n_vertices = adj_matrix.shape[0]\n",
|
|
" n_edges = np.sum(adj_matrix) // 2 # 无向图的边数\n",
|
|
" density = n_edges / (n_vertices * (n_vertices - 1) / 2) # 图的密度\n",
|
|
" avg_degree = np.sum(adj_matrix) / n_vertices # 平均度数\n",
|
|
" \n",
|
|
" instance_info.append({\n",
|
|
" '测试实例': test_file,\n",
|
|
" '顶点数': n_vertices,\n",
|
|
" '边数': n_edges,\n",
|
|
" '密度': density,\n",
|
|
" '平均度数': avg_degree\n",
|
|
" })\n",
|
|
"\n",
|
|
"# 将统计信息转换为DataFrame并打印\n",
|
|
"df_info = pd.DataFrame(instance_info)\n",
|
|
"print(\"\\n每个实例的基本信息:\")\n",
|
|
"print(df_info)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 800x600 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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AABQJBcmAwAARRIzAABAkcQMAABQJDEDAAAUScwAAABFEjMAAECRxAwAAFAkMQMAABRJzAAAAEUSMwAAQJHEDAAAUCQxAwAAFEnMAAAARRIzAABAkcQMAABQJDEDAAAUScwAAABFEjMAAECRxAwAAFAkMQMAABRJzAAAAEUSMwAAQJHEDAAAUCQxAwAAFEnMAAAARRIzAABAkcQMAABQJDEDAAAUScwAAABFEjMAAECRxAwAAFAkMQMAABRJzAAAAEUSMwAAQJHEDAAAUCQxAwAAFEnMAAAARRIzAABAkcQMAABQJDEDAAAUScwAAABFEjMAAECRxAwAAFAkMQMAABRJzAAAAEUSMwAAQJHEDAAAUCQxAwAAFEnMAAAARRIzAABAkcQMAABQJDEDAAAUScwAAABFEjMAAECRxAwAAFAkMQMAABRJzAAAAEUSMwAAQJHEDAAAUCQxAwAAFEnMAAAARRIzAABAkcQMAABQJDEDAAAUScwAAABFEjMAAECRxAwAAFAkMQMAABRJzAAAAEUSMwAAQJHEDAAAUCQxAwAAFEnMAAAARRIzAABAkcQMAABQJDEDAAAUScwAAABFEjMAAECRxAwAAFAkMQMAABRJzAAAAEUSMwAAQJHEDAAAUCQxAwAAFEnMAAAARRIzAABAkcQMAABQJDEDAAAUScwAAABFEjMAAECRxAwAAFAkMQMAABRJzAAAAEUSMwAAQJHEDAAAUCQxAwAAFEnMAAAARRIzAABAkcQMAABQJDEDAAAUScwAAABFEjMAAECRxAwAAFAkMQMAABRJzAAAAEUSMwAAQJHEDAAAUCQxAwAAFEnMAAAARRIzAABAkcQMAABQJDEDAAAUScwAAABFEjMAAECRxAwAAFAkMQMAABRJzAAAAEUSMwAAQJHEDAAAUCQxAwAAFEnMAAAAUaL/DzNA2fo2fTFIAAAAAElFTkSuQmCC",
|
|
"text/plain": [
|
|
"<Figure size 800x600 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import networkx as nx\n",
|
|
"import matplotlib.font_manager as fm\n",
|
|
"\n",
|
|
"# 设置中文字体\n",
|
|
"plt.rcParams['font.sans-serif'] = ['SimHei']\n",
|
|
"plt.rcParams['axes.unicode_minus'] = False\n",
|
|
"\n",
|
|
"# 定义节点位置和边\n",
|
|
"positions = [(0,0), (1,0), (0,1), (2,0), (1,1)] # 5个节点的位置\n",
|
|
"edges = [(0,1), (0,2), (1,2), (1,3), (2,4), (3,4)] # 节点间的连接\n",
|
|
"\n",
|
|
"# 创建图对象\n",
|
|
"G = nx.Graph()\n",
|
|
"G.add_nodes_from(range(len(positions)))\n",
|
|
"G.add_edges_from(edges)\n",
|
|
"pos = {i: positions[i] for i in range(len(positions))}\n",
|
|
"\n",
|
|
"# 绘制第一个图\n",
|
|
"plt.figure(figsize=(8, 6))\n",
|
|
"colors = ['red', 'green', 'blue', 'yellow', 'purple']\n",
|
|
"nx.draw(G, pos,\n",
|
|
" node_color=colors,\n",
|
|
" node_size=1000,\n",
|
|
" with_labels=True,\n",
|
|
" font_size=12,\n",
|
|
" font_weight='bold',\n",
|
|
" edge_color='gray',\n",
|
|
" width=1)\n",
|
|
"\n",
|
|
"# plt.title('5色着色方案', fontsize=18, fontweight='bold')\n",
|
|
"plt.axis('equal')\n",
|
|
"plt.savefig('./plot/5color.png',dpi=300)\n",
|
|
"plt.show()\n",
|
|
"\n",
|
|
"# 绘制第二个图\n",
|
|
"plt.figure(figsize=(8, 6))\n",
|
|
"colors2 = ['red', 'green', 'blue', 'blue', 'red']\n",
|
|
"nx.draw(G, pos,\n",
|
|
" node_color=colors2,\n",
|
|
" node_size=1000,\n",
|
|
" with_labels=True,\n",
|
|
" font_size=12,\n",
|
|
" font_weight='bold',\n",
|
|
" edge_color='gray',\n",
|
|
" width=1)\n",
|
|
"\n",
|
|
"# plt.title('3色着色方案', fontsize=18, fontweight='bold')\n",
|
|
"plt.axis('equal')\n",
|
|
"plt.savefig('./plot/3color.png',dpi=300)\n",
|
|
"plt.show()\n"
|
|
]
|
|
}
|
|
],
|
|
"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
|
|
}
|