Qeerrtt 2024-06-28 19:41 采纳率: 0%
浏览 4
已结题

CPLEX用OPL编写的混合整数线性优化问题。

我在进行混合线性优化问题的数学建模,利用的是CPLEX中的OPL语言编写,原数学问题很复杂,我将模型转换为编程语言后,CPLEX显示只有一处报错,但这个错误我不知道是什么原因,有没有人看一下。问题出现在工作限制那块代码。


/*********************************************
 * OPL 22.1.1.0 Model
 * Author: lz
 * Creation Date: 2024年6月28日 at 下午5:29:21
 *********************************************/
int nbMonths = 6;
range months = 1..nbMonths;
range tasks = 1..7;
range boatsTypes = 1..5; // 拖网船(1), 围网船(2), 笼捕船(3), 拖曳船(4), 加工船(5)
int boatCounts[boatsTypes] = [4, 2, 3, 1, 1]; // 各类船只数量

// 任务需求量(单位:百)
int demand[months][tasks] = [
    [500, 1000, 300, 300, 800, 200, 100],
    [600, 500, 200, 0, 400, 300, 150],
    [300, 600, 0, 0, 500, 400, 100],
    [200, 300, 400, 500, 200, 0, 100],
    [0, 100, 500, 100, 1000, 300, 0],
    [500, 500, 100, 300, 1100, 500, 60]
];

// 任务收益(单位:万元)
float revenue[tasks] = [100, 60, 80, 40, 110, 90, 30];

// 任务所需船只类型及时间(单位:小时)
float workHours[tasks][boatsTypes] = [
    [0.5, 0.1, 0.2, 0.05, 0],
    [0.7, 0.2, 0, 0.03, 0],
    [0, 0, 0.8, 0, 0.01],
    [0.3, 0, 0, 0.1, 0.05],
    [0.2, 0.6, 0, 0, 0],
    [0.5, 0, 0.6, 0.08, 0.05]
];

// 维护安排
tuple Maintenance {
    int month;
    int boatIndex;
    int boatType;
}
{ Maintenance} Maintenances = {
    {1, 1, 1}, {2, 1, 3}, {2, 2, 3}, {3, 1, 4},
    {4, 1, 2}, {5, 2, 1}, {5, 3, 3}, {6, 1, 5}, {6, 2, 3}
};

// 决策变量
dvar boolean x[months][boatsTypes][tasks]; // 第i月第j艘k类船执行m任务
dvar float+ y[months][tasks]; // 第i月任务m的实际完成量(单位:百)
dvar float+ z[months][tasks]; // 第i月任务m的超额完成量(单位:百)

// 目标函数
maximize sum(i in months, m in tasks) (revenue[m] * y[i][m]) - 5 * z[i][m];

// 约束
subject to {
   
    // 工作时间限制
   forall(j in boatsTypes, i in months) {
    
sum(m in tasks) workHours[m][j] * x[i][j][m] <= (24 * 2 * 8) * (1 - exists( t in Maintenances : t.month == i && t.boatType == j));
    
}

    // 任务需求与超额完成
    forall(i in months, m in tasks) {
        sum(j in boatsTypes) workHours[m][j] * x[i][j][m] == y[i][m] + z[i][m];
    }

    // 超额库存限制
    forall(i in months, m in tasks) {
        z[i][m] <= 100;
    }

    // 最终库存要求
    forall(m in tasks) {
        sum(i in 1..5) z[i][m] - sum(i in 2..6) z[i][m] == 50 - demand[6][m];
    }
}

execute DISPLAY_RESULTS {
    writeln("Optimal Plan Found!");
    // 可以添加代码来显示或导出解的具体细节
}

img

  • 写回答

28条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-28 19:41
    关注
    获得0.30元问题酬金

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

    从你给出的代码和问题描述来看,你的问题似乎出在工作时间限制的约束条件上。这个约束条件尝试表示的是船只在不同月份和不同维护计划下的可用时间限制。在这个约束中,存在一个语法错误和一个可能的逻辑错误。我会尝试分析并提供修复方案。

    语法错误出现在这个表达式中:exists( t in Maintenances : t.month == i && t.boatType == j)。在CPLEX的OPL语言中,你应该使用.来访问元组的属性,而不是直接使用属性名称作为条件。正确的语法应该是 t.month == i && t.boatType == j。所以,你的工作时间限制的约束应该修改为:

    forall(j in boatsTypes, i in months) {
        sum(m in tasks) workHours[m][j] * x[i][j][m] <= (24 * 2 * 8) * (1 - exists( t in Maintenances : t.month == i && t.boatIndex == j));
    }
    

    逻辑错误可能在于你尝试在工作时间限制的约束中使用船只类型的索引(j),然而这可能不是你的实际需求。由于你的船只类型和船只数量可能关联密切,可能需要重新审视这部分逻辑以更好地适应你的实际业务需求。可能需要进一步的业务逻辑理解才能准确地修正这部分。如果你能提供更多关于船只维护如何影响船只可用时间的信息,我可能能够提供更准确的帮助。不过在你给出更具体信息之前,我建议你可以首先修复语法错误并尝试重新运行模型看是否解决了问题。如果问题仍然存在,我们可以继续深入探讨业务逻辑部分的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月6日
  • 创建了问题 6月28日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?