【问题标题】:Cplex Java add expr(sum) to objective functionCplex Java 将 expr(sum) 添加到目标函数
【发布时间】:2013-07-31 03:07:14
【问题描述】:

我有以下目标函数:

最小化所有 k (1..n) 的总和 (trueck[k] - time[k])。

我试着这样设置:

IloLinearNumExpr obj = cplex.linearNumExpr();

for(int k=0; k<grossK.length; k++){
    obj.addTerm(1.0, cplex.sum(trueck[k], cplex.negative(time[k])));
}

cplex.addMinimize(obj);

第 4 行的 eclipse 错误信息是:

"IloLinearNumExpr 类型中的方法 addTerm(double, IloNumVar) 不适用于参数 (double, IloNumExpr)"

我猜“addTerm”方法是错误的,但我找不到解决方案。 提前致谢。

【问题讨论】:

    标签: java cplex


    【解决方案1】:

    不要在addTerm 中使用cplex.sum。你只需要在你的目标函数中分离出这两个术语,因为它们都是在 k 上求和的。

    最小化总和 (trueck[k] - time[k]) 对于所有 k (1..n)

    等于 Min *sum_over_k* (trueck[k]) - *sum_over_k* (time[k])

    这样,addTerm 就可以处理了。 (下面的代码未经测试,但它让您知道应该尝试什么。)

    IloLinearNumExpr obj = cplex.linearNumExpr();
    
    for(int k=0; k<grossK.length; k++){
        obj.addTerm(1.0, trueck[k]);
        obj.addTerm(-1.0, time[k]);
    }
    
    cplex.addMinimize(obj);
    

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      addTerm 方法需要一个系数和一个变量。它不期望复杂的表达式(例如总和)或特定的数值作为第二个参数。可能是您尝试传递的内容存在逻辑问题,因此您可能需要考虑更新您的问题,详细说明您想要完成的内容,如果这不能为您解决问题。换言之,您尝试输入的术语与您使用的线性表达式不兼容。

      【讨论】:

      • 我也是这么说的。不幸的是,我没有这方面的经验。也许您可以提供一些关于如何重写方程式的见解?
      • 求解器期望的项看起来像 1.0x 而不是 1.0(f(x) - g(x))。不幸的是,我对原始海报的用例知之甚少,无法将他们的方程重写为更简单的线性方程。
      猜你喜欢
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多