我有一个非线性最小化问题,它将连续变量和二进制变量的组合作为输入。把它想象成一个网络流量问题,阀门可以控制吞吐量,泵可以改变方向。
一个“自然的”简约的表述可能是:
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
第三种,可能是幼稚的方法是将二进制变量组合成单个连续变量 z \in [0,1],从而减少优化变量的数量。
例如,
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 的)中。
PS。我知道有一些文献提出了专门的混合整数进化算法。现在,我想和 Scipy 呆在一起。