Dijkstra算法(二)

本文接续上篇博客,展示lingo解法。https://www.cnblogs.com/a-runner/p/14305431.html

语法介绍

1.@if(logical_condition,true_result,false_result)

@if函数将评价一个逻辑表达式logical_condition,如果为真,返回true_ result,否则返回false_result。

2.  逻辑运算符

在LINGO中,逻辑运算符主要用于集循环函数的条件表达式中,来控制在函数中哪些集成员被包含,哪些被排斥。在创建稀疏集时用在成员资格过滤器中。

LINGO具有9种逻辑运算符:

#not#  否定该操作数的逻辑值,#not#是一个一元运算符

#eq#  若两个运算数相等,则为true;否则为flase

#ne#    若两个运算符不相等,则为true;否则为flase

#gt#    若左边的运算符严格大于右边的运算符,则为true;否则为flase

#ge#   若左边的运算符大于或等于右边的运算符,则为true;否则为flase

#lt#   若左边的运算符严格小于右边的运算符,则为true;否则为flase

#le#   若左边的运算符小于或等于右边的运算符,则为true;否则为flase

#and#  仅当两个参数都为true时,结果为true;否则为flase

#or#    仅当两个参数都为false时,结果为false;否则为true

这些运算符的优先级由高到低为:

高  #not#

    #eq#  #ne#  #gt#  #ge#  #lt#  #le#

低  #and#  #or#

3. 变量界定函数

实现对变量取值范围的附加限制,共4种:

@bin(x)        限制x为0或1

@bnd(L,x,U)    限制L≤x≤U

@free(x)       取消对变量x的默认下界为0的限制,即x可以取任意实数

@gin(x)        限制x为整数

在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+∞。@free取消了默认的下界为0的限制,使变量也可以取负值。@bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束。

Lingo:

该程序事求从c1到c5之间的最短路径:得出答案为70

model:
sets:
cities/1..5/;
roads(cities,cities):w,x;
endsets

data:
w=0;
enddata
calc:
w(1,3)=40;W(1,2)=120;
w(2,5)=20;w(2,4)=40;
w(3,4)=20;w(3,5)=30;

@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)));
endcalc

n=@size(cities); 
min=@sum(roads:w*x);
@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;
@sum(cities(j):x(j,1))=0;
@sum(cities(j):x(j,n))=1;
end

 

 

 

   

 

 得知最短路径长度为70;1-》3-》5.

posted @ 2021-01-21 00:02  为红颜  阅读(225)  评论(0编辑  收藏  举报