首页 > 解决方案 > 使用 element() 函数将决策变量与 docplex python 相加

问题描述

我是 docplex 的新手,我正在尝试用 python 来解决放置问题,我想用 cplex 来解决它,但是当我试图将它复制到 python API 时,我得到了乘法错误。我正在使用 CpoModel 因为我有非线性目标函数来最小化。

我的代码:

from docplex.cp.model import CpoModel

B = [9,7,4]
k=3
W = [2,5,4]
V = [1,6,4]
P = [5,2,1]
N = len(B)
UV = 10
Ni = [1.168,12.818,8]

mdl = CpoModel()

set_task = list(range(0, N, 1))

set_agent = list(range(0, N, 1))

Xij_list = [[mdl.integer_var(min=0, max=1, name=f'X_{i}_{j}' ) for j in set_agent] for i in
                 set_task]

for i in set_task:
      Xj_list = [Xij_list[i][j] for j in set_agent]
      mdl.add(mdl.sum(Xj_list) == 1)

for j in set_agent:
      Xj_list = [Xij_list[i][j] for i in set_task]
      mdl.add(mdl.sum(Xj_list) == 1)

c1 = 0
for i in set_task:
    for j in set_agent:
        c1 = c1 + P[i]*B[j]*mdl.element(Xij_list,[i,j])

c2 = 0
for i in set_task:
    for j in set_agent:
        c2 = c2 + Ni[j]*pow(P[i],1/(k+1))*mdl.element(Xij_list,[i,j])

z = c1 + pow(UV, -k)*pow(c2,k+1)
mdl.add( mdl.minimize(z))
           
msol = mdl.solve()

当我尝试运行代码时,在以下部分中出现错误-

mdl.element(Xij_list,[i,j])

我还尝试了Xij_list[i,j]错误注释。可以请人帮助我做错了什么吗?

原始的 cplex 代码(工作正常!)

using CP;
 
int N =3;

range task = 1..N; 

range agent = 1..N; 

dvar boolean x[task][agent];

int B[agent] = [9,7,4];

int W[agent] = [2,5,4];

int V[agent] = [1,6,4];

int P[task] = [5,2,1];

int K = 3;

float UV = 10;

float Ni[j in agent] = pow(W[j]*V[j],(K/(K+1)));

dexpr float c2 =  sum(i in task, j in agent) Ni[j]*pow(P[i],1/(K+1))*x[i,j];

dexpr float c1 = sum(i in task, j in agent)  P[i]*B[j]*x[i,j];

dexpr float z = c1 +  pow(UV,-K)*pow(c2,K+1);

minimize z;

subject to {

forall (i in task)
    sum(j in agent) x[i,j]==1;

   forall ( j in agent)
    sum(i in task) x[i,j]==1;
}

标签: pythoncplexnonlinear-optimizationdocplex

解决方案


推荐阅读