Optimization 如何在AMPL中定义一组路径或一组链接序列?

Optimization 如何在AMPL中定义一组路径或一组链接序列?,optimization,graph,modeling,linear-programming,ampl,Optimization,Graph,Modeling,Linear Programming,Ampl,我试图定义一个结构来捕获如下内容: set NODES := A B C; set LINKS := (A,B) (B,C); set PATHS := ((A,B)) ((A,B), (B,C)) ((B,C)); 节点是一个集合。链接是一组节点对 我很难将路径定义为一组链接序列。我在AMPL图示例中没有看到任何显式使用路径的解决方案,我想知道是否有一种简单的方法来构造它们 以下是my.mod文件中的定义: set NODES; set

我试图定义一个结构来捕获如下内容:

set NODES := A B C;
set LINKS := (A,B) (B,C);
set PATHS := ((A,B)) 
             ((A,B), (B,C))
             ((B,C));
节点是一个集合。链接是一组节点对

我很难将路径定义为一组链接序列。我在AMPL图示例中没有看到任何显式使用路径的解决方案,我想知道是否有一种简单的方法来构造它们

以下是my.mod文件中的定义:

set NODES; 
set LINKS within (NODES cross NODES);
set PATHS # ??? ;

请提供帮助。

鉴于您的路径没有重复的节点,我能想到的最自然的定义路径的方法是将路径定义为有序节点集的集合

reset;
model;
set NODES;
set LINKS within {NODES,NODES};

param n_paths;
set PATHS{1..n_paths} within NODES ordered;

# Optional: identify all of the links implied by these paths, so we can
# check that they are in fact within LINKS. 

param longest_path_length := max{i in 1..n_paths} card(PATHS[i]);
set LINKS_IMPLIED_BY_PATHS within LINKS := setof{
      i in 1..n_paths, 
      j in 1..(longest_path_length-1): j < card(PATHS[i])
    } (member(j,PATHS[i]),member(j+1,PATHS[i]))
    ;

data;
set NODES := A B C;
set LINKS := (A,B) (B,C);

param n_paths := 3;
set PATHS[1] := A B;
set PATHS[2] := A B C;
set PATHS[3] := B C;

display LINKS_IMPLIED_BY_PATHS;
# if we include a path like C A, we will get an error here because ("C","A") 
# is not within LINKS.
# It should be possible to do this more tidily with a check statement but
# for the moment the syntax escapes me.
# Note that this error will ONLY appear at the point where we try to
# do something with LINKS_IMPLIED_BY_PATHS; it's not calculated or checked
# until then. 
复位;
模型
设置节点;
在{NODES,NODES}内设置链接;
参数n_路径;
在有序节点内设置路径{1..n_path};
#可选:标识这些路径隐含的所有链接,以便
#检查它们是否在链接中。
param longest_path_length:=max{i in 1..n_path}卡(路径[i]);
设置链接中的路径所隐含的链接:=setof{
我在1..n_路径中,
j in 1..(最长路径长度-1):j

这并不是您所要求的,因为它将路径定义为节点序列而不是链接,但这是我能得到的最接近的路径

只是想澄清一下,你在这里使用的是严格意义上的图论意义上的“路径”吗?(即无法重新访问任何节点)?是的,这是正确的。我有另一个进程为我查找路径,我想将该结果作为AMPL的输入。