有向图最短路问题的规划数学模型

这里写图片描述
约束条件的目的是:求得所有可能的从顶点1到顶点n的路径
其原理如下:
s.t.1
i=1时式子值为1:与点1相连的路径一定有一条为1,即点1一定可以走出去
i=n时式子值为-1:与点n相连的路径一定有一条为-1,即一定有路径通往点n(实际上此条件可省略,由于目标min)
i≠1,n时式子值为0,:路径可以通过约束1中创造的路径延续下去,直至点n

下面为一道最短路径的题目,将通过将上述数学表达式转化为lingo代码求解

这里写图片描述

model:
sets:
cities/A,B1,B2,C1,C2,C3,D/;!城市名称;
roads(cities,cities)/A,B1 A,B2 B1,C1 B1,C2 B1,C2
B2,C1 B2,C2 B2,C3 C1,D C2,D C3,D/:w,x;!w:两城市路径的权值,x:最短路径;
endsets

data:
    w = 2  4  3  3  1  2  3  1  1  3  4;
enddata

n=@size(cities);

min = @sum(roads(i,j):w(i,j)*x(i,j));!求道路的最小权值;
@for(roads(i,j):@bin(x(i,j)));!x的01约束,x(i,j)=1说明弧位于顶点1至顶点n的路上;

@sum(roads(i,j)|i#eq#1 : x(i,j))=1;!约束1:最短路中中间点的约束;
@for(cities(i)|i#ne#1 #and# i#ne#n:@sum(roads(i,j): x(i,j))=@sum(roads(j,i):x(j,i)));!约束3:起点的约束;

end

在上述程序中, n=@size(cities)是计
算集cities的个数,这里的计算结果是n=7, 这样编
写方法目的在于提高程序的通用性.
这里写图片描述

运行结果,知道最短路径为6;
通过x(A,B1),x(B1,C1),x(C1,D)知道最短路径A——B1———C1———D

猜你喜欢

转载自blog.csdn.net/qq_41967508/article/details/81610425