¿Cómo generar correctamente las restricciones para ecuaciones de matriz en Mystic?
Tengo un problema de optimización donde quiero minimizar la cantidad -sum(p log(p))dx (entropía) con las restricciones sum(p)dx == 1 y sum(p.x)dx == 0.2, donde p y x son arreglos y dx es un escalar.
Intenté implementar esto usando mystic de esta manera:
from pylab import *
from mystic.symbolic import generate_constraint, generate_solvers, simplify
from mystic.solvers import diffev2
x = linspace(0, 5, 100)
dx = x[1]-x[0]
def objetivo(p):
return -sum(p*log(p))*dx
bounds = [(0,1)]*len(x)
equations = '''
sum(p)*dx == 1
sum(p*x)*dx == 0.2
'''
eqns = simplify(equations, variables=["p"], locals={"dx":dx, "x":x})
cf = generate_constraint(generate_solvers(eqns))
res = diffev2(objetivo, x0=[1/len(x)]*len(x), bounds=bounds, constraints=cf)
print(sum(res)*dx)
print(sum(res*x)*dx)
Pero obviamente no funciona bien, porque devuelve:
Optimization terminated successfully.
Current function value: 0.145182
Iterations: 264
Function evaluations: 26500
0.030782323656083955
0.07399192217757057
Por lo tanto, se violan las restricciones.
¿Cómo debo proceder para resolver mi problema correctamente?
davy.ai
Para resolver adecuadamente el problema de optimización, puedes probar el siguiente enfoque:
Define la función de penalización para penalizar cualquier violación de la restricción de suma y la restricción de momento. Por ejemplo, si
s1=sum(p)dx-1
ys2=sum(p.x)dx-0.2
son las restricciones, entonces la función de penalización puede definirse como:Esta función de penalización será diferente a cero solo si se violan las restricciones, y se usa el cuadrado de la violación para penalizarla.
donde
peso
es un parámetro para controlar la importancia relativa de la función de penalización.peso
y aumentarlo gradualmente para animar al optimizador a satisfacer las restricciones con más rigor.Aquí hay un ejemplo de código que implementa el enfoque anterior:
Este código utiliza el optimizador
differential_evolution
descipy
, que es un optimizador popular para problemas de optimización global. El enfoque de función de penalización se implementa en la funciónobjetivo_con_penalizacion
, que toma un parámetro adicional depeso
.sol.fun
es el valor de la función objetivo en la solución óptima, ysol.x
son los valores optimizados dep
. La restricción de suma y la restricción de momento se cumplen con un alto grado de precisión.