【问题标题】:Adding two objective function with weight in CPLEX在 CPLEX 中添加两个带权重的目标函数
【发布时间】:2020-09-17 21:10:12
【问题描述】:

在我的数学模型中,我有两个目标函数,我想根据其重要性为它们分配权重并将它们加在一起作为一个目标函数。 这是我的两个目标加上权重:

IloExpr objExpression(env);
for (cc = 0; cc < NumberOfCourses; cc++)
    for (ww = 0; ww < AvailableWeeks; ww++) {
        objExpression += Weight * Diff[cc][ww]; // objective a
    }

for (cc = 0; cc < NumberOfCourses; cc++) {
    objExpression += (1 - Weight) * (M[cc] * Students[cc]); // objective b
}
IloObjective theObjective(env, objExpression, IloObjective::Minimize);
mod.add(theObjective);
objExpression.end();

我已将参数和变量设置如下:

const int NumberOfCourses = 15;
const int AvailableWeeks = 8;
const float Weight = 0.5;
double Students[NumberOfCourses];

IloNumVarArray2 Diff(env, NumberOfCourses);
for (cc = 0; cc < NumberOfCourses; cc++)
    Diff[cc] = IloNumVarArray(env, AvailableWeeks, 0.0, 8);

IloNumVarArray M(env, NumberOfCourses);

当我运行代码时,它会冻结并在第二个目标行设置断点。 另外,如果我想拥有两个独立的目标并分别获得两个目标的输出,我应该怎么做?

【问题讨论】:

  • M 是如何声明的?它为断点处的变量显示什么值?
  • 实际上我认为问题在于我如何设置变量 M[cc] 但我不知道如何修复它或查看它现在得到的值。

标签: c++ cplex


【解决方案1】:

查看IloNumVarArray(env, IloInt) 构造函数的参考文档。它说

此构造函数创建一个包含 n 个数值变量的可扩展数组 环境。最初,n 个元素是空句柄。

换句话说,新创建的数组中的所有元素都将为 NULL(请注意,这与 IloBoolVarArray 构造函数创建的数组中的所有元素都是新变量不同)。因此,M 在您的情况下是一个空句柄数组。

为了修复您的代码,您要么必须一一初始化数组的元素,要么使用初始化变量的构造函数,例如

IloNumVarArray M(env, NumberOfCourses, 0, IloInfinity);

另外,我建议您在不定义NDEBUG 的情况下以调试模式编译代码。如果您在不使用NDEBUG 的情况下进行编译,那么如果您使用空句柄,Concert 中的许多函数都会引发异常。

如果你想有单独的目标,那么你的问题就变成了一个多目标问题。您可能需要阅读用户手册中的相应章节,并参考 CPLEX 附带的 ilodiet.cpp 示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多