如何在AMPL中为变量参数设置“不等于”条件?
解决AMPL中定义m≠n的转移变量W[m,n]的语法问题
看起来你在AMPL里定义转移变量时,因为m≠n的条件写法不对导致语法错误,我来帮你梳理正确的实现方式:
核心问题:AMPL的索引条件语法规则
AMPL里对集合索引的过滤条件需要用**竖线|**来引出,而不是逗号分隔,同时不等号的正确写法是!=(<>也支持,但!=更直观)。你之前的错误大多是把条件放在逗号后面,或者语法格式不符合AMPL的要求。
方法一:先定义过滤后的配对集合(推荐)
这种方式更清晰,尤其当你需要多次使用m≠n的配对时:
# 定义位置集合 set M := 1 2 3; # 定义所有m≠n的(m,n)配对集合 set TRANS_PAIRS := {m in M, n in M | m != n}; # 基于过滤后的集合定义变量W,可根据需求添加变量约束(比如非负) var W{(m,n) in TRANS_PAIRS} >= 0; # 目标函数中直接使用该集合求和 minimize total_cost: sum{(m,n) in TRANS_PAIRS} cost[m,n] * W[m,n];
方法二:直接在变量/求和中添加过滤条件
如果不想单独定义集合,也可以直接在变量定义或求和语句里用|指定条件:
set M := 1 2 3; # 直接在变量定义时过滤m≠n var W{m in M, n in M | m != n} >= 0; # 求和时的正确写法(用|引出条件) minimize total_cost: sum{m in M, n in M | m != n} cost[m,n] * W[m,n];
为什么你之前的写法报错?
比如你写的sum{m in M, n in N, m <> n}W[m,n];,AMPL会把m <> n当成第三个索引集合,而不是对前面索引的过滤条件,自然会报语法错误。必须用|来明确这是对索引的过滤规则。
用上面的方法定义后,W[m,m]这类变量根本不会被创建,也就不会出现在你的模型里,既符合“m与n之间的转移不能是同一位置”的业务逻辑,又能保证模型运行结果正确。
内容的提问来源于stack exchange,提问作者Nedved Kan
相关产品推荐
相关产品推荐

