uniqlo201 2024-01-29 13:49 采纳率: 16.7%
浏览 16
已结题

lingo求解报错请看看原因

lingo规划问题代码,请看看下面这段代码表达上是否存在问题,为什么会报这个错呢?

SETS:
I /1..36/: x, y, z, w, v, vjx;
ENDSETS


DATA:
v = 1000000,2000000,3000000,4000000,5000000,6000000,7000000,8000000,9000000, 1000000,2000000,3000000,4000000,5000000,6000000,7000000,8000000,9000000, 1000000,2000000,3000000,4000000,5000000,6000000,7000000,8000000,9000000, 1000000,2000000,3000000,4000000,5000000,6000000,7000000,8000000,9000000;
vjx = 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9;
vy = 1000000;
vz = 2000000;
vw = 3000000;
ENDDATA

MAX = @SUM(I: x(I) * vjx(I)) + vy * @SUM(I: y(I)) + vz * @SUM(I: z(I)) + vw * @SUM(I: w(I));

@FOR(I:
   x(I) + y(I) + z(I) + w(I) = 1;
   y(I)=@IF(v(I)#ge#0.5,0,1-x(I)-z(I)-w(I));
   z(I)=@IF(v(I)#ge#0.4,0,1-x(I)-y(I)-w(I));
   w(I)=@IF(v(I)#ge#0.2,0,1-x(I)-y(I)-z(I));
   x(I) + y(I) + z(I) + w(I) <= 1;  
);

@SUM(I: x(I)) >= @SUM(I: y(I));
@SUM(I: x(I)) >= @SUM(I: z(I));
@SUM(I: x(I)) >= @SUM(I: w(I));
@SUM(I: z(I)) * 40 <= 410;

@for(I:@bin(x));
@for(I:@bin(y));
@for(I:@bin(z));
@for(I:@bin(w));

报错内容:

--------------------------------------------------------------------------------
 [Error Code:  221]

  Text handle limit exceeded -- expression is too complex.

  The error occurred on or near the following line:
     15]MAX = @SUM(I: x(I) * vjx(I)) + vy * @SUM(I: y(I)) + vz * @SUM(


--------------------------------------------------------------------------------

  • 写回答

18条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-01-29 13:49
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    在您提供的Lingo代码中,错误信息指出“Text handle limit exceeded -- expression is too complex”,这表示Lingo无法处理当前表达式,因为它过于复杂。在Lingo中,对于大型模型和复杂的表达式,可能会遇到这样的限制。

    问题出在第15行的优化目标函数(MAX)定义部分,由于I集合的大小是36,这意味着Lingo需要处理大量的二元变量和求和操作,这可能导致了文本句柄的限制被超出。

    为了简化模型并尝试解决这个问题,您可以考虑以下几个可能的解决办法:

    1. 检查数据是否重复输入,例如v数组明显有多余的数据重复,应确保每个元素只出现一次。
    2. 尝试将复杂的逻辑约束分解成更简单的形式,避免在一个表达式中嵌套过多的条件语句。
    3. 对于大型求和,如果可以的话,尝试重新组织模型结构或对模型进行分块处理。

    修正后的代码如下(去除了重复数据,并调整了约束条件):

    SETS:
    I /1..36/: x, y, z, w, vjx;
    
    ENDSETS
    
    DATA:
    v /1..36/ = 1000000, 2000000, ..., 9000000; // 确保这里只有36个不重复的数值
    vjx /1..36/ = 0.1, 0.2, ..., 0.9;
    vy = 1000000;
    vz = 2000000;
    vw = 3000000;
    ENDDATA
    
    MAX = @SUM(I: x(I) * vjx(I)) + vy * @SUM(I: y(I)) + vz * @SUM(I: z(I)) + vw * @SUM(I: w(I));
    
    @FOR(I:
       x(I) + y(I) + z(I) + w(I) = 1;
       y(I) = IF(v(I) >= 0.5 THEN 0 ELSE 1 - x(I) - z(I) - w(I));
       z(I) = IF(v(I) >= 0.4 THEN 0 ELSE 1 - x(I) - y(I) - w(I));
       w(I) = IF(v(I) >= 0.2 THEN 0 ELSE 1 - x(I) - y(I) - z(I));
    );
    
    @SUM(I: x(I)) >= @SUM(I: y(I));
    @SUM(I: x(I)) >= @SUM(I: z(I));
    @SUM(I: x(I)) >= @SUM(I: w(I));
    @SUM(I: z(I)) * 40 <= 410;
    
    @FOR(I:
        @BIN(x(I));
        @BIN(y(I));
        @BIN(z(I));
        @BIN(w(I));
    );
    

    请注意,Lingo语法中没有#ge#这样的符号,我已将其替换为>=。同时,请确保上述的...部分代表正确填充剩余的数值以构成36个唯一值。

    尽管如此,若问题依然存在,可能需要进一步简化模型或者联系Lindo API技术支持寻求帮助,看看是否有针对大型复杂模型的解决方案。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月6日
  • 创建了问题 1月29日