1

I would like to solve a mix-integer nonlinear programming problem in phyton. I use the codes you see in below. I'm taking this error:

Error: Model has non-convex objective: x_1_2 * distanceofclusters_1_2 + ...

How can I fix this? My model is using quadratic programming as I see. If the problem is caused by this, how can I changed my optimization model's method?

    from docplex.mp.model import Model
    m = Model(name='opt')
    cx = m.continuous_var_list(n+1,name="cx", lb=0)
    cy = m.continuous_var_list(n+1,name="cy", lb=0)
    x = m.binary_var_matrix(n+1,n+1, name="x")
    y = m.binary_var_matrix(n+1,a+1, name="y")
    dis = m.continuous_var_matrix(n+1,a+1, name="distanceofindividual", lb=0)
    dist = m.continuous_var_matrix(n+1,n+1, name="distanceofclusters", lb=0)
    #m.add_constraint(sum(x[i, j] for i in C for j in C if i!=j)>=5, ctname="const1")
    m.set_objective("min", sum(x[i,j]*dist[i,j] for i in C for j in C if i!=j)+sum(y[i,aa]*dis[i,aa] for i in C for aa in V))
    m.add_constraints(dis[i,aa]== m.abs(px[aa]-cx[i]) + m.abs(py[aa]-cy[i]) for i in C for aa in V)
    m.add_constraints(dist[i,aa]== m.abs(cx[aa]-cx[i]) + m.abs(cy[aa]-cy[i]) for i in C for aa in C)
    m.add_constraints(m.sum(x[i,j] for i in C if i!=j)==1 for j in C)
Ebru Pekel
  • 11
  • 1

1 Answers1

0

What you can do is turn your quadratic objective into a linear objective.

For instance you can write

from docplex.mp.model import Model
mdl = Model(name='mutiply binary by decision variable')

b = mdl.binary_var(name='b')
x = mdl.integer_var(name='x',lb=0,ub=10)

bx= mdl.integer_var(name='bx')

mdl.maximize(x)

mdl.add(bx<=7)

mdl.add(mdl.if_then((b==0),(bx==0)))
mdl.add(mdl.if_then((b==1),(bx==x)))

mdl.solve()

decisionVars=[b,x]

for v in decisionVars:
    print(v.name," = ",v.solution_value)

if you need to multiply decision variable b and x

Alex Fleischer
  • 9,276
  • 2
  • 12
  • 15