我正在使用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 函数传递双目标表达式数组以及权重和容差数组。
答案 0 :(得分:0)
您没有弄清楚该怎么做并不是巧合。从CPLEX 12.9开始,不支持在求解期间更新多目标模型中的目标权重。此外,使用面向对象的API(即C ++,Java,.NET),在创建目标之一后就无法对其进行修改。为了在这些API中更改多目标模型的属性,您需要首先删除原始目标,然后添加新的多目标定义(像以前一样使用IloStaticLex
)。
请参阅《 CPLEX用户手册》中Generic Callbacks上的部分,以了解此功能可以实现的所有内容。