c++ - 使用 CPLEX 的多目标二进制整数问题的动态权重更新
问题描述
我正在使用 IBM CPLEX v12 优化双目标问题。CPLEX 具有在两个目标函数被赋予相同优先级时混合它们的特性。然后根据最初为两个目标设置的权重求解混合目标。
我提供了一些初始权重,但是,我想在优化过程中根据找到的现有值和两个目标的界限来更新它们。为此,我正在使用 CPLEX 提供的回调。我的问题是我能够提取最初设置的权重并显示它们。我使用 IloObjective 的getWeight()函数。但是,我不知道如何更新权重,因为我找不到任何类似的setWeight()函数。
回调实现如下所示:
class weightUpdateCallack: public IloCplex::Callback::Function
{
public:
// Constructor with data
weightUpdateCallack(IloCplex cplex) : obj(cplex.getEnv())
{
obj = cplex.getObjective();
}
void updateWeights(const IloCplex::Callback::Context& context)
{
qDebug() << "-----------------Callback--------------";
qDebug() << "Name: " << obj.getName();
qDebug() << "weight 1: " << obj.getWeight(1);
qDebug() << "constant: " << obj.getConst();
}
virtual void invoke (const IloCplex::Callback::Context& context);
private:
IloObjective obj;
};
void weightUpdateCallack::invoke(const IloCplex::Callback::Context &context)
{
if(context.inCandidate())
updateWeights(context);
}
当找到候选解决方案时调用回调,如下所示:
// Use a callback function to update weights
weightUpdateCallack weightsUpdate(cplex);
cplex.use(&weightsUpdate, IloCplex::Callback::Context::Id::Candidate);
我使用IloStaticLex函数来传递双目标表达式数组以及权重和容差数组。
解决方案
您没有弄清楚如何执行此操作并非巧合。从 CPLEX 12.9 开始,不支持在求解期间更新多目标模型中目标的权重。此外,使用面向对象的 API(即 C++、Java、.NET),不可能在创建目标之一后对其进行修改。为了在这些 API 中更改多目标模型的属性,您需要首先删除原始目标,然后添加一个新的多目标定义(IloStaticLex
像以前一样使用)。
请参阅CPLEX 用户手册中有关通用回调的部分,以了解使用此功能可能实现的所有内容。
推荐阅读
- json - 在@ResponseBody spring注解中返回json响应
- powershell - 执行后不释放批处理脚本
- javascript - javascript 从两个匹配列的数组对象中获取不匹配的数据,其中一列包含管道分隔记录
- c++ - 'std::function 之间的转换
'到'双(*)(双)' - javascript - KnockoutJS 和 PubSub 更新视图之间的可观察数组
- java - 错误:无法使用 Google Cloud StorageOptions for SignUrl 加载 PDF 文档
- ios - 子类中的 UIView 作为 @IBOutlet 而在超类中是实例属性,而不是插座
- javascript - AngularJS 绑定问题
- powerbi - Alteryx 一个很好的 ETL 工具
- javascript - 隐藏一个
- 当点击另一个