我有一个非线性最小化问题,该问题将连续和二进制变量的组合作为输入。将其视为阀门的网络流问题,可以控制吞吐量,并用泵来改变方向。
自然,quot简约的配方可能是:
arg( min( f(x1,y2,y3) )) s.t.
x1 in [0,1] //a continuous variable
y2,y3 in {0,1} //two binary variables
目标函数是确定性的,但解决方案昂贵。如果我离开二进制变量,Scipy的差分进化算法原来是我问题的有用解决方案方法(收敛的速度比盆地跳跃更快(。
已经有一些证据表明将整数变量纳入基于差异进化的最小化问题。建议的方法将y2,y3变成连续变量x2,x3 in [0,1],然后修改目标函数如下:
(i) f(x1, round(x2), round(x3))
(ii) f(x1,x2,x3) + K( (x2-round(x2))^2 + (x3-round(x3))^2 )
with K a tuning parameter
三分之一且可能是幼稚的方法是将二进制变量组合到[0,1]中的单个连续变量z 中,从而减少优化变量的数量。
例如,
if z<0.25: y2=y3=0
elif z<0.5: y2=1, y3=0
elif z<0.75: y2=0, y3=1
else: y2=y3=1.
应该首选上述哪一个,为什么?我很想知道如何以智能的方式将二进制变量集成到连续的差分进化算法(例如Scipy's(中。
ps。我知道有一些文献提出了专门的混合成员进化算法。目前,我想呆在Scipy中。
我很想知道如何将二进制变量整合到连续的差分进化算法
中
wrapdisc
是一个软件包,它是一个薄包装器,可让您与具有各种scipy.optimize
优化器的浮子优化二进制变量。它的读数中有一个用法示例。有了它,您根本不必调整目标功能。
从v2.0.0开始,它具有两个可能的二进制编码:
-
ChoiceVar
:这使用一速最大编码。两个浮子用于表示二进制变量。 -
GridVar
:这使用舍入。一个浮点用于表示二进制变量。
尽管这两种变量都没有用于二进制,但它们都可以支持它。平均而言,GridVar
所需的功能评估较少,因为它使用的浮点少于ChoiceVar
。
释放Scipy 1.9时,differential_evolution
函数将获得一个integrality
参数,该参数将允许用户指示应将哪些参数视为整数。对于二进制选择,将使用(0,1(的界限用于整数参数。