如何限制变量定义域?运输问题缩减变量规模的技术问询
解决GAMS大规模网络下变量数量优化的问题
核心实现方案
在GAMS中完全可以实现只保留满足possible_edge(i,j,d)条件的变量,避免为所有(i,j,d)组合生成变量,具体有两种实用方法:
方法1:变量声明阶段直接过滤
修改变量定义语句,在声明时就附加条件$possible_edge(i,j,d),GAMS会仅为符合条件的组合创建变量,从根源上减少变量总数:
binary variable x(i,j,d)$possible_edge(i,j,d);
方法2:约束中动态过滤变量
如果需要保留全量变量的声明结构,但仅在约束逻辑中使用符合条件的变量,可以在约束定义时加入条件判断:
equation flow_constraint(i,d); flow_constraint(i,d).. sum((j)$possible_edge(i,j,d), x(i,j,d)) =e= demand(i,d);
这种方式适合需要保留变量全量结构,但实际计算只用到部分变量的场景,不过变量总数仍为全量,优先推荐方法1。
关于possible_edge参数的生成建议
结合你提到的最短路径+距离阈值逻辑,可按以下步骤生成参数:
- 通过最短路径算法计算源节点
i到所有节点j的最短距离distance(i,j); - 为每个需求
d设定距离阈值threshold(d); - 定义参数时加入双重条件判断(确保仅考虑实际存在的边):
parameter possible_edge(i,j,d); possible_edge(i,j,d) = 1$(distance(i,j) < threshold(d) and edge(i,j) = 1);
内容的提问来源于stack exchange,提问作者Rainbow
相关产品推荐
相关产品推荐

