如何在CPLEX中定义门集合的收货门与发货门子集
在CPLEX中定义收货门和发货门子集的方法
基于你提供的初始代码,以下是几种在CPLEX OPL中定义收货门集合Din和发货门集合Dout的常用方式,两种子集均为总门集合Doors的子集:
方式一:显式列举子集元素
适合子集元素固定、数量较少的场景,直接指定属于Din或Dout的门编号:
int numDoors=5; range Doors=1..numDoors; // 收货门子集Din,指定门1、3 {int} Din = {1, 3}; // 发货门子集Dout,指定门2、4、5 {int} Dout = {2, 4, 5};
方式二:通过过滤规则定义子集
如果子集划分有统一规则(比如编号奇偶、属性特征),用过滤表达式自动生成子集,灵活性更强:
int numDoors=5; range Doors=1..numDoors; // 收货门:编号为奇数的门 {int} Din = {d in Doors | d mod 2 == 1}; // 发货门:编号为偶数的门 {int} Dout = {d in Doors | d mod 2 == 0};
如果需要确保Dout是Doors中排除Din的部分,也可以直接写:
{int} Dout = Doors \ Din;
方式三:用布尔参数标记生成子集
适合需要动态调整子集的场景,先定义每个门的归属标记,再基于标记生成子集:
int numDoors=5; range Doors=1..numDoors; // 标记每个门是否为收货门(1=是,0=否) int isIn[Doors] = [1, 0, 1, 0, 0]; // 标记每个门是否为发货门(1=是,0=否) int isOut[Doors] = [0, 1, 0, 1, 1]; // 根据标记生成子集 {int} Din = {d in Doors | isIn[d] == 1}; {int} Dout = {d in Doors | isOut[d] == 1};
内容的提问来源于stack exchange,提问作者Kang Dong Ho
相关产品推荐
相关产品推荐

