本文主要使用LINGO程序,MATLAB可参考MATLAB解决。
目录
无向图
无向图是图论中的概念,用于描述一组对象之间的连接关系,其中边没有方向性。
在无向图中,对象通常表示为顶点(也称为节点或城市),而连接对象之间的关系则表示为边。边没有箭头或方向,因此可以在两个顶点之间双向传递。
无向图可以用数学符号表示为G = (V, E),其中 V 表示顶点的集合,E 表示边的集合。边的表示常用 (u, v) 或 {u, v} 表示,表示连接顶点 u 和 v。边的存在意味着两个相应的顶点之间存在连接关系。
例如,考虑一个简单的无向图表示四个城市 A、B、C 和 D。它们之间的连接可以表示为如下的顶点集和边集:
V = {A, B, C, D}
E = {(A, B), (A, C), (B, C), (C, D)}
在这个例子中,有四个顶点 A、B、C 和 D,它们之间存在四条边,表示各个城市之间的连接关系。
例题
例如,求v1到v11的最短路径
代码
model:
sets:
cities/1..11/;
roads(cities,cities):w,x;
endsets
data:
w=0;
enddata
calc:
w(1,2)=2;w(1,3)=8;w(1,4)=1;
w(2,3)=6;w(2,5)=1;
w(3,4)=7;w(3,5)=5;w(3,6)=1;w(3,7)=2;
w(4,7)=9;
w(5,6)=3;w(5,8)=2;w(5,9)=9;
w(6,7)=4;w(6,9)=6;
w(7,9)=3;w(7,10)=1;
w(8,9)=7;w(8,11)=9;
w(9,10)=1;w(9,11)=2;w(10,11)=4; !构造w矩阵
@for(roads(i,j):w(i,j)=w(i,j)+w(j,i)); !加和操作
@for(roads(i,j):w(i,j)=@if(w(i,j) #eq# 0, 1000,w(i,j)));!设’M‘值,这里为1000,电脑会自动跳过这条路
endcalc
n=@size(cities); !城市的个数;
min=@sum(roads:w*x);!权值乘以0-1变量
@for(cities(i)|i #ne#1 #and# i #ne# n:@sum(cities(j):x(i,j))=@sum(cities(j):x(j,i)));!确保除起始城市和目标城市之外的所有城市都只能由一个道路进入和离开。
@sum(cities(j):x(1,j))=1; !从城市1出发的路径只能选择一条
@sum(cities(j):x(j,1))=0; !不能回到顶点1;!禁止回到城市1
@sum(cities(j):x(j,n))=1; !最终目标城市n的路径只能选择一条
@for(roads:@bin(x)); !0-1变量
end
加和操作
对于无向图中的距离矩阵,通过"加和操作"指的是将对称位置上的元素进行相加的操作。
在距离矩阵中,由于无向图的特性,边的距离具有对称性。如果顶点i到顶点j的距离为d(i, j),那么顶点j到顶点i的距离必然也是d(j, i)。
为了确保距离矩阵的对称性,"加和操作"是指将距离矩阵中(i, j)位置的值与(j, i)位置的值进行相加,然后将结果更新到距离矩阵中。
具体而言,对于对称的距离矩阵,进行加和操作的形式可以表示为:
w(i, j) = w(i, j) + w(j, i)
其中,w(i, j)表示顶点i到顶点j的距离,w(j, i)表示顶点j到顶点i的距离。
通过进行加和操作,可以保持距离矩阵的对称性,确保边的距离在对称位置上是相等的。
这种操作通常用于在处理有向图的算法中,将无向图的距离矩阵与有向图的距离矩阵保持一致。对于只涉及无向图的算法,这种加和操作可能并不是必需的步骤,因为无向图的对称性已经保证了边的双向性。在该题中删去这一操作并不影响结果
有向图
可参考这篇文章解决问题,有向图无向图区别很明显,一看就能看出来,剩下的我在学学,后面再补充