有人可以帮我这个CPLEX模型吗?

时间:2019-04-11 13:11:09

标签: c recursion optimization boolean cplex

我正在尝试对树的每个部分[i] [j]的库存成本求和,具体取决于:

X={x[i][j]} 
x[i][j] = 1 if has stock at ij
x[i][j] = 0 if has no stock at

取决于一个准备时间的库存,它们所依赖的库存是否取决于以下是否有库存:

a[i][j] = t[i][j] if it's the end node
    = t[i][j] + max(s€sons of the brunch){ a[i+1][s] * (1 - x[i][s]}

好的代码编译没有任何结构错误,但是数组a和决策变量没有任何响应

//getting all the sons

range L=0..ligne;
range C=1..colone;

int sons[L][C][C];
int a[L][L];
execute
{
    for (var i in Li){
        for (var j in C){
            for (var k in C){
                if (parent[i+1][k] == j){
                   sons[i][j][k] = k;
                }else
                   sons[i][j][k] = 0;
            }
        }
        a[i][0]=0;
    }
    for (var j in C){
        for (var k in C)
            sons[ligne][j][k]=0;    
    }
 }

//the variable and the objective function and constraints
 dvar boolean x[L][Ci];

 dexpr float TotalCost = aih_cost*adup*(1.5+var_factor)*lt_factor*sum(i in L,j   in C)( unit_price[i][j]*rqtf[i][j]*x[i][j]*a[i][j] ); 

 minimize TotalCost;

 subject to {
    forall(i in Li){
        forall(j in C){     
            forall(k in C) 
            (1-x[i+1][sons[i][j][k]]) * a[i+1][sons[i][j][k]] + t_process[i][j] - a[i][j] >= 0;
        }
}        
    a[0][1]<=service_t; 
}

我希望至少有一个建议的x数组,并且准备时间为“ a”。

2 个答案:

答案 0 :(得分:2)

您的模型可能不可行。 您可以通过以下方式将名称添加到约束中:

   forall(i in Li){
        forall(j in C){     
            forall(k in C) 
            (1-x[i+1][sons[i][j][k]]) * a[i+1][sons[i][j][k]] + t_process[i][j] - a[i][j] >= 0;
        }
}        
    a[0][1]<=service_t; 

进入

forall(i in Li){
        forall(j in C){     
            forall(k in C) 
            ct1:(1-x[i+1][sons[i][j][k]]) * a[i+1][sons[i][j][k]] + t_process[i][j] - a[i][j] >= 0;
        }
}        
    ct2:a[0][1]<=service_t; 

然后您可以放松一下,对您有所帮助。

答案 1 :(得分:0)

Cplex默认情况下将求解器cplex用于线性问题和MILP。 对于我的问题,“ a”和“ x”之间的依存关系使它二次方化。

要解决此类问题,需要使用CP优化器cpo,它通常用于约束编程,但它也可以解决非线性问题。

或者,在另一种尝试中,我将问题线性化,引入了新的决策变量y = a * x,并且向模型添加了很多约束。