如何在Mosel中声明分属不同承运商的车辆集合?
Mosel中为承运商定义独立车辆集合的实现方案
一、修正基于Record的实现方式
你原代码的错误主要来自record字段定义不合理、变量声明不匹配,以及决策变量维度引用错误,以下是修正后的实现:
错误原因解析
vehicle_data里的Carrier字段无需定义为array(CARRIERS) of string,每个record应对应单个承运商,直接用string类型即可CARRIER声明为单个vehicle_data变量无法存储所有承运商的车辆信息,需改为array(CARRIERS) of vehicle_data- 决策变量不能直接引用
CARRIER.Vehicles(单个实例的范围),需针对每个承运商f引用其专属的车辆范围
修正后的代码
declarations CUSTOMERS: range CARRIERS: set of string ! 重新定义record:每个实例对应单个承运商的车辆信息 vehicle_data = public record Carrier: string ! 单个承运商标识 Vehicles: range ! 该承运商的车辆编号范围 end-record ! 声明存储所有承运商车辆信息的数组 CARRIER_VEHICLES: array(CARRIERS) of vehicle_data DEMAND: array(CUSTOMERS) of integer COSTS: array(CUSTOMERS, CARRIERS) of integer ! 决策变量:针对每个承运商f、其车辆k、客户i定义 x_fik: dynamic array(f in CARRIERS, k in CARRIER_VEHICLES(f).Vehicles, i in CUSTOMERS) of mpvar ! 含义:承运商f的车辆k是否前往客户i(1=是,0=否) y_fk: dynamic array(f in CARRIERS, k in CARRIER_VEHICLES(f).Vehicles) of mpvar ! 含义:承运商f的车辆k是否被使用(1=是,0=否) FILENAME = "Data_Model_3.dat" end-declarations initializations from FILENAME CUSTOMERS CARRIERS CARRIER_VEHICLES DEMAND COSTS end-initializations
二、基于集合数组的实现方案(推荐)
你提出的VEHICLES: array(CARRIERS) of set of integer方案完全可行,且更简洁直观,适合这种"每个承运商对应独立车辆集合"的场景,具体实现如下:
代码示例
declarations CUSTOMERS: range CARRIERS: set of string ! 每个承运商对应一组车辆编号集合 VEHICLES: array(CARRIERS) of set of integer DEMAND: array(CUSTOMERS) of integer COSTS: array(CUSTOMERS, CARRIERS) of integer ! 决策变量:直接引用每个承运商的车辆集合 x_fik: dynamic array(f in CARRIERS, k in VEHICLES(f), i in CUSTOMERS) of mpvar y_fk: dynamic array(f in CARRIERS, k in VEHICLES(f)) of mpvar FILENAME = "Data_Model_3.dat" end-declarations initializations from FILENAME CUSTOMERS CARRIERS VEHICLES DEMAND COSTS end-initializations
这种方式无需额外定义record,直接通过数组关联承运商与车辆集合,代码更简洁,数据初始化也更方便。
内容的提问来源于stack exchange,提问作者Roxana
相关产品推荐
相关产品推荐

