es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error: El modelo tiene una función objetivo no convexa:

Me gustaría resolver un problema no lineal de programación mixta entera en Python. Utilizo los códigos que ves a continuación. Estoy obteniendo este error:

Error: El modelo tiene un objetivo no convexo: x12 * distanceofclusters12 + …

¿Cómo puedo solucionar esto? Mi modelo está utilizando programación cuadrática según veo. Si el problema es causado por esto, ¿cómo puedo cambiar el método de optimización de mi modelo?

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)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que la función objetivo del modelo no es convexa, lo que significa que tiene una forma curva y no se puede resolver mediante programación lineal. En este caso, el modelo está utilizando programación cuadrática, que es adecuada para algunos problemas pero no para objetivos no convexos.

    Para solucionar este error, puedes intentar cambiar el método de optimización de programación cuadrática a programación lineal entera mixta (MILP), que puede manejar variables lineales e enteras y es adecuado para objetivos convexos y no convexos.

    Para cambiar el método de optimización, puedes modificar el constructor del modelo de la siguiente manera:

    m = Model(name='opt', solver='splex')
    

    El argumento solver='splex' especifica el solucionador que se utilizará para resolver el modelo, en este caso, el solucionador de programación lineal entera mixta CPLEX.

    También puede ser necesario modificar la función objetivo para que sea convexa, o considerar el uso de un modelo de optimización diferente si el problema es inherentemente no convexo.

    Ten en cuenta que cambiar el método de optimización puede aumentar el tiempo de cálculo y los requisitos de memoria del modelo.

Comments are closed.