【问题标题】:Implemetation of BAT algorithm in ScalaBAT算法在Scala中的实现
【发布时间】:2019-06-02 11:16:53
【问题描述】:

我在Scala中实现了BAT算法(我对函数式编程风格很感兴趣)。BAT算法涉及的步骤是

BAT算法的参数是

  • x : BAT的位置

我的代码工作正常,没有任何错误,但它的输出不是所需的,因为指定迭代后 BAT 的位置没有变化。我想知道代码哪里出了问题。我的代码如下。 我还想删除 while 循环,使代码在风格上变得纯函数式。

【问题讨论】:

  • 只有我一个没听说过“BAT算法”吗?谷歌搜索找到数百万个对"Bat algorithm" 的引用,但即使在搜索之后,我仍然不知道“BAT”算法应该是什么?另外,您确定该问题不属于 Code Review Stack Exchange 吗?
  • @AndreyTyukin 简单地说,BAT 是一种基于 BAT 回声定位行为开发的元启发式优化技术
  • 您是否尝试过使用调试器并单步执行您的代码?答案对你来说可能变得显而易见。如果您没有使用 IDE(例如 Intelli-J),那就买一个吧!你的生活会轻松很多。
  • @GMc 我已经在使用 Intelli-J ,也可以调试代码但可以找到错误

标签: scala functional-programming


【解决方案1】:

我不知道为什么会这样,但是当单步执行您的程序时,这些代码行会将您的位置重置为原始值:

        if(math.random > j.PulseRate  ){
          j.position = j.BestPosition + (Bandwidth * sum / N) //sum/d is mean of Loudness , where N is number of BAT's
        }

如果您将这段代码注释掉,那么您的位置就会发生变化。由于我不是蝙蝠专家,我不知道更改是否正确,但他们确实会更改。

希望这足以正确调试您的算法。

【讨论】:

  • 但是这个条件是必须要申请的
  • 也许是这样,但这就是重置您的价值观的原因。我无法为您调试您的程序。我有,但可能不应该有,隔离一个有问题的区域。您需要弄清楚为什么该计算会重置您的位置值。再次调试器会有所帮助;或者干脆打印出所有的值,看看发生了什么。
  • 我将再次使用调试器来检查值。还有一个问题是这段代码是纯函数式的吗?第二个是如何替换while循环以实现并行性?
猜你喜欢
  • 2021-07-03
  • 2023-03-30
  • 2016-05-06
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 2022-06-14
相关资源
最近更新 更多