如何从多组一维决策变量数组生成符合要求的二维数组?
解决方案
要生成符合波束通道位置和数量要求的二维数组,你需要基于每个波束的所属行、起始通道和占用通道数来判断每个二维位置是否被波束覆盖,而非仅依赖每行的波束数量。以下是修正后的CPLEX代码:
/* 需考虑以下条件: (1) 每行的波束数量 (2) 每个波束的通道数量 (3) 波束在该行的通道位置 */ int Nbeams=21; // 需分配到二维数组的波束总数 int Nchannels=16; // 列数(通道数) int Nrows=4; // 行数 int No_beams_in_each_row[1..Nrows] = [6,6,6,4]; int beam_firstchannel[1..Nbeams] = [1,3,5,7,9,15,1,3,5,7,9,15,1,3,5,7,9,15,1,5,9,13]; // 注:原变量名beam_nomusedchannel应为beam_numusedchannel(笔误),此处保留原命名 int beam_nomusedchannel[1..Nbeams] = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4]; int beam_row[1..Nbeams] = [1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4]; // 核心逻辑:判断每个行i的通道j是否被任意一个属于该行的波束覆盖 int isBeamThere[i in 1..Nrows][j in 1..Nchannels] = exists(b in 1..Nbeams) ( beam_row[b] == i && j >= beam_firstchannel[b] && j <= beam_firstchannel[b] + beam_nomusedchannel[b] - 1 ); execute { writeln("isBeamThere = "); for(var i=1; i<=Nrows; i++) { writeln(isBeamThere[i]); } }
代码说明
- 核心逻辑通过
exists函数遍历所有波束,判断当前二维位置[i][j]是否落在某个属于第i行的波束的通道范围内:beam_row[b] == i:确保波束b属于当前行ij >= beam_firstchannel[b]:通道j不小于波束b的起始通道j <= beam_firstchannel[b] + beam_nomusedchannel[b] - 1:通道j不超过波束b的结束通道(起始通道+占用通道数-1)
- 运行后输出的
isBeamThere数组将完全匹配你期望的目标结果:isBeamThere = [1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1] [1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1] [1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1] [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
内容的提问来源于stack exchange,提问作者MO MO MA
相关产品推荐
相关产品推荐

