You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从多组一维决策变量数组生成符合要求的二维数组?

解决方案

要生成符合波束通道位置和数量要求的二维数组,你需要基于每个波束的所属行、起始通道和占用通道数来判断每个二维位置是否被波束覆盖,而非仅依赖每行的波束数量。以下是修正后的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行的波束的通道范围内:
    1. beam_row[b] == i:确保波束b属于当前行i
    2. j >= beam_firstchannel[b]:通道j不小于波束b的起始通道
    3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:45:53