上一篇:【数学建模 matlab 实验报告5】最短路问题作业
目录
实验报告
作业 1 **:**利用MATLAB计算下图的最小生成树(提示:利用minspantree函数)。

截图:

代码:
Matlab
% 定义图的边和权重
s = [1,1,2,2,3,3,4,5,5,6]; % 边的起点
t = [2,6,6,3,7,4,7,6,7,7]; % 边的终点
weights = [2,4,5,4,7,8,8,3,7,6]; % 边的权重
% 创建图
G = graph(s, t, weights);
% 计算最小生成树
T = minspantree(G);
% 绘制最小生成树
plot(T, 'EdgeLabel', T.Edges.Weight)
作业 2 **:**计算下图的最佳欧拉巡回。

手工计算:

作业 3 **:**利用二边逐次修正法求解TSP问题,距离矩阵D如下:

截图:

代码:
Matlab
% D是距离矩阵,其中D(i, j)是从城市i到城市j的距离
D = [inf 34 2 50 59;
34 inf 36 68 67;
2 36 inf 51 60;
50 68 51 inf 13;
59 67 60 13 inf];
% 初始化路径和最小距离
n = size(D, 1); % 城市数量
path = 1:n; % 初始路径
minDistance = sum(D(sub2ind(size(D), path, [path(2:end), path(1)])));
% 标记是否发生改进
improvement = true;
while improvement
improvement = false;
for i = 2:n-2
for j = i+1:n-1
newPath = path;
% 交换路径中的两个段
newPath(i:j) = path(j:-1:i);
newDistance = sum(D(sub2ind(size(D), newPath, [newPath(2:end), newPath(1)])));
% 检查是否有改进
if newDistance < minDistance
path = newPath;
minDistance = newDistance;
improvement = true;
end
end
end
end
% 输出最终的路径和距离
disp('最优路径:');
disp(path);
disp('最小距离:');
disp(minDistance);
作业 4 **(选做):**尝试MATLAB编程实现二边逐次修正算法,并计算如下31个城市的TSP问题,城市坐标如下。
C=
1304 2312; 3639 1315; 4177 2244; 3712 1399; 3488 1535; 3326 1556; 3238 1229; 4196 1044; 4312 790; 4386 570; 3007 1970; 2562 1756; 2788 1491; 2381 1676; 1332 695; 3715 1678; 3918 2179; 4061 2370; 3780 2212; 3676 2578; 4029 2838; 4263 2931; 3429 1908; 3507 2376; 394 2643; 3439 3201; 2935 3240; 3140 3550; 2545 2357; 2778 2826; 2370 2975\]; 截图:  代码: ```Matlab C = [1304 2312; 3639 1315; 4177 2244; 3712 1399; 3488 1535; 3326 1556; 3238 1229; 4196 1044; 4312 790; 4386 570; 3007 1970; 2562 1756; 2788 1491; 2381 1676; 1332 695; 3715 1678; 3918 2179; 4061 2370; 3780 2212; 3676 2578; 4029 2838; 4263 2931; 3429 1908; 3507 2376; 394 2643; 3439 3201; 2935 3240; 3140 3550; 2545 2357; 2778 2826; 2370 2975]; % 计算距离矩阵 n = size(C, 1); D = zeros(n, n); for i = 1:n for j = 1:n D(i, j) = sqrt((C(i, 1) - C(j, 1))^2 + (C(i, 2) - C(j, 2))^2); end end % 初始化路径和最小距离 path = 1:n; minDistance = sum(D(sub2ind(size(D), path, [path(2:end), path(1)]))); % 标记是否发生改进 improvement = true; while improvement improvement = false; for i = 2:n-2 for j = i+1:n-1 newPath = path; newPath(i:j) = path(j:-1:i); % 交换路径中的两个段 newDistance = sum(D(sub2ind(size(D), newPath, [newPath(2:end), newPath(1)]))); if newDistance < minDistance path = newPath; minDistance = newDistance; improvement = true; end end end end % 输出最终的路径和距离 fprintf('最优路径:\n'); disp(path); fprintf('最小距离: %f\n', minDistance); ``` ## 实验心得 通过本次行遍性问题实验,我系统学习了最小生成树、欧拉巡回、旅行商问题(TSP)等核心知识点,结合 MATLAB 编程实现了相关算法,不仅深化了对图论理论知识的理解,更掌握了理论结合实践解决实际优化问题的方法,收获颇丰。 实验的第一部分是最小生成树的求解,这是我首次借助 MATLAB 的`minspantree`函数处理图优化问题。在学习过程中,我明确了最小生成树的核心定义 ------ 在连通加权无向图中,连接所有顶点且总权重最小的无环子图,它广泛应用于通信网络搭建、交通路线规划等场景。通过定义图的起点、终点和权重矩阵,调用函数快速生成最小生成树并可视化展示,我直观感受到了算法的高效性。这个过程让我认识到,专业工具能大幅简化复杂计算,同时也让我理解了最小生成树在保证连通性的前提下实现成本最优的核心价值。 作业二的最佳欧拉巡回手工计算,让我夯实了欧拉回路的基础理论。我牢记了无向图存在欧拉回路的充要条件:连通且所有顶点度数均为偶数。手工计算需要逐一验证顶点度数、规划巡回路线,这个过程虽然繁琐,却让我彻底理解了欧拉巡回 "一笔画" 的本质,弥补了纯理论学习的抽象感。对比编程求解,我体会到手工推导是理解算法逻辑的基础,只有吃透原理,才能更好地运用工具解决问题。 旅行商问题是本次实验的重点,二边逐次修正法的编程实现让我收获最大。TSP 是经典的组合优化难题,核心是寻找遍历所有顶点并返回起点的最短闭合路径。在实现算法时,我首先完成了距离矩阵的构建,对于坐标型城市数据,通过欧几里得距离公式计算城市间距离;对于直接给出的距离矩阵,直接初始化路径。二边逐次修正法的核心是通过反转路径片段,不断优化路径长度,直到无法改进为止。编写代码的过程中,我遇到了路径索引处理、距离计算错误等问题,通过调试修正,我掌握了 MATLAB 矩阵索引、循环结构的使用技巧,也深刻理解了启发式算法在求解 NP 难问题时的实用性 ------ 虽然无法保证绝对最优,但能高效得到近似最优解。 选做的 31 个城市 TSP 问题求解,是对编程能力和算法理解的综合考验。大规模数据下,算法的迭代效率、代码的健壮性都面临挑战。通过优化代码逻辑、循环结构,成功求解出最优路径和最短距离,让我体会到算法在大规模实际问题中的应用价值,也认识到优化算法对于处理复杂工程问题的重要性。 本次实验让我实现了从理论到实践的跨越。我不仅巩固了图论中行遍性问题的核心知识,熟练掌握了 MATLAB 处理图优化问题的方法,更培养了分析问题、调试代码、解决实际优化问题的能力。同时,我也认识到不同算法的适用场景:最小生成树解决连通性优化问题,欧拉巡回解决遍历性路径问题,TSP 算法解决全局最优路径问题。 此次实验也让我明白,数学建模与算法编程是解决实际问题的核心工具。未来学习中,我会继续加强算法理论学习,提升编程实践能力,将图论知识与更多实际应用场景结合,用专业知识解决更复杂的工程优化问题。