概述:
我正在研究一种遗传算法,以优化精密运动系统的参数设置,并希望通过更改5个独立(但相互依赖)的参数值来最小化系统的运动时间 。我已经设置好代码以执行以下操作:
问题:
由于每个参数值的范围都不同(例如FeedforwardAdvance的范围是0-1,而RampRate的范围是1,000-10,000),因此我需要一种将这些结果值缩放到该范围的方法。因为它是16位二进制数,所以在获取绝对值时我可以获得0-32,768的值,因此我打算创建一个仅使用y = mx + b
的缩放方案,如下图所示:
与此相关的问题是,例如,如果原始值为40,则二进制值将为0000000000101000,并且为了使该值保持为该值,它需要随机突变为1111111111111111,这几乎是不可能的。
然后,我更改了方法,取而代之以对数(以2为底)进行突变前后的值的比率,如下所示:
这是用于缩放的功能之一:
minAff = 0
maxAff = 6000
def Aff_scale(Aff_Value, beforeMutation):
Aff_Value = float(Aff_Value)
try:
xValue = abs(math.log(Aff_Value/beforeMutation, 2))
except ValueError:
xValue = 0.25*mid_Aff
slope = (maxAff - minAff)/32.0
Actual_Aff = slope*xValue + minAff
if Actual_Aff > maxAff:
Actual_Aff = maxAff
Actual_Aff = int(math.ceil(Actual_Aff/1.0))
return Actual_Aff
这种方法效果更好,但我仍然认为我缺少该范围内的值。我缩放的数字似乎总是在减少,我不确定为什么。
两个问题: