Scipy Differential Evolution with integers

a 夏天 提交于 2019-12-23 12:49:33

问题


I'm trying to run an optimization with scipy.optimize.differential_evolution. The code calls for bounds for each variable in x. But I want to a solution where parts of x must be integers, while others can range freely as floats. The relevant part of my code looks like

    bounds = [(0,3),(0,3),(0,3),???,???]
    result = differential_evolution(func, bounds)

What do I replace the ???'s with to force those variables to be ints in a given range?


回答1:


As noted in the comments there isn't direct support for a "integer constraint".

You could however minimize a modified objective function, e.g.:

def func1(x):
    return func(x) + K * (x[3] - round(x[3]))**2

and this will force x[3] towards an integer value (unfortunately you have to tune the K parameter).

An alternative is to round (some of) the real-valued parameters before evaluating the objective function:

def func1(x):
    z = x;
    z[3] = round(z[3])
    return func(z)

Both are common techniques to approach a discrete optimization problem using Differential Evolution and they work quite well.




回答2:


Differential evolution can support integer constraint but the current scipy implementation would need to be changed.

From the scipy source code it appears that their DE is based Storn, R and Price, K, Differential Evolution - a Simple and Efficient Heuristic for Global Optimization over Continuous Spaces, Journal of Global Optimization, 1997

However there has been progress in this field as pointed out by this review paper Recent advances in differential evolution – An updated survey

There are a few papers which introduce changes to the algorithm so that it can handle ints. I have not had time to look at all the options but perhaps this paper could help.

An Improved Differential Evolution Algorithm for Mixed Integer Programming Problems



来源:https://stackoverflow.com/questions/35494782/scipy-differential-evolution-with-integers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!