有关二进制到整数/浮点缩放比例代码的建议

时间:2018-06-29 15:38:05

标签: python scaling genetic-algorithm

概述:

我正在研究一种遗传算法,以优化精密运动系统的参数设置,并希望通过更改5个独立(但相互依赖)的参数值来最小化系统的运动时间 。我已经设置好代码以执行以下操作:

  1. 从外部数据收集中获取参数值和所产生的移动时间。
  2. 根据相应的移动时间为每个参数分配适合度值。
  3. 对于每个参数,请从以前的试验中选择最“合适”的值(“选择” )。
  4. 转换为二进制。
  5. 从0切换到1或反之亦然(“变异” )的每一位给1/100机会。
  6. 为每个参数取2个最合适的值(来自先前的测试),以随机索引分为2部分,然后切换两端(“交叉”
  7. 从二进制转换为浮点数/整数(取决于每个参数的要求)。
  8. 为下一个试验应用每个“突变”参数值。

问题:

由于每个参数值的范围都不同(例如FeedforwardAdvance的范围是0-1,而RampRate的范围是1,000-10,000),因此我需要一种将这些结果值缩放到该范围的方法。因为它是16位二进制数,所以在获取绝对值时我可以获得0-32,768的值,因此我打算创建一个仅使用y = mx + b的缩放方案,如下图所示:

Initial Scaling

与此相关的问题是,例如,如果原始值为40,则二进制值将为0000000000101000,并且为了使该值保持为该值,它需要随机突变为1111111111111111,这几乎是不可能的。

然后,我更改了方法,取而代之以对数(以2为底)进行突变前后的值的比率,如下所示: Altered Scaling

这是用于缩放的功能之一:

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

这种方法效果更好,但我仍然认为我缺少该范围内的值。我缩放的数字似乎总是在减少,我不确定为什么。

两个问题:

  1. 不是要手动进行缩放,而是有某种功能可以执行我想做的事情?
  2. 我的代码是否天生就有问题/为什么我的价值似乎一直在下降? (如果我手动乘以我的值或其他值,我可以强制使用更高的值,但是更低的值会更罕见,并且我希望整个范围随机出现)

0 个答案:

没有答案