Netlogo 模拟退火

发布于 2025-01-20 11:59:20 字数 2084 浏览 5 评论 0原文

早上或下午好,

我今天在这里,因为我一直在试图编写有关Netlogo物种的模拟退火算法。 我试图使用SA的物种具有自己的二进制组,该集合是一个16位数字集,从开始时随机分组,集合中的每个数字代表一个动作/增强,例如,16位数中的第一个位置集合是 + 2速增强。 但是,我已经用这种算法来回回去,但运气不多,目前,我将模拟温度设置为10,我试图随着时间的推移,即使在每个过程中,我都在尝试降低温度我预测的所有物种的最佳配置将全部打开,但我想真正看到这种情况。

但是,发生的是算法直接跳到温度0,我可以理解为什么是,但我不知道随着时间的推移降低温度的更好方法。另外,我正在尝试评估健身分数,如果比以前的分数更好,那么保持更好的分数,但这也是一个问题。

我不知道这个问题还是问题是可以理解的,但是如果不是可以理解的,请提出任何有助于您了解我当前问题的问题。

谢谢

内森·唐,

这是我目前拥有的

  ask fish 810 [
    actions ; Actions have been defined where i have corresponded each value as an action 
    set color red
    set tempreture 10




set tempreture tempreture * (1 - cooling_rate / 100)

      if tempreture = 10 [
        set binary replace-item random 16 binary random 2
        ;set tempreture tempreture - 1
      ]
      if tempreture = 9 [
        set binary replace-item random 14 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 8 [
        set binary replace-item random 12 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 7 [
        set binary replace-item random 10 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 6 [
        set binary replace-item random 8 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 5 [
        set binary replace-item random 6 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 4 [
        set binary replace-item random 4 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 3 [
        set binary replace-item random 3 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 2 [
        set binary replace-item random 2 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 1 [
        set binary replace-item random 1 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 0 [
        Show fitness_score
      stop
      
    ]


    ]


  show tempreture

 ; tick


end```

Good morning or Afternoon

I am here today as I have been trying to write my own simulated annealing algorithm regarding a species in Netlogo.
The species I am trying to use an SA on has its own binary set which is a 16 digits binary set that is randomized from the start, each number in the set represents an action/enhancement, for example, the first placement in the 16 digit set is a + 2-speed enhancement.
However I have been back and forth with this algorithm and have not had much luck, currently, I have set the temperature of the simulation to 10 and i have tried to decrease the temperature over time and even on each procedure, I am trying to find the optimal configuration of the species which I predict will be all 1s turned on but I want to actually see that happen.

What is happening though is the algorithm jumps straight to temperature 0, I can understand why that is but I don't know a better way to decrement the temperature over time. Also, I am trying to evaluate the fitness score and if it is better than the previous score then keep the better one but this has also been quite a problem.

I don't know whether this question or problem is understandable but if it is not please ask any questions which might help you understand my current issue.

Thanks

Nathan Don

This is what I have currently

  ask fish 810 [
    actions ; Actions have been defined where i have corresponded each value as an action 
    set color red
    set tempreture 10




set tempreture tempreture * (1 - cooling_rate / 100)

      if tempreture = 10 [
        set binary replace-item random 16 binary random 2
        ;set tempreture tempreture - 1
      ]
      if tempreture = 9 [
        set binary replace-item random 14 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 8 [
        set binary replace-item random 12 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 7 [
        set binary replace-item random 10 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 6 [
        set binary replace-item random 8 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 5 [
        set binary replace-item random 6 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 4 [
        set binary replace-item random 4 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 3 [
        set binary replace-item random 3 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 2 [
        set binary replace-item random 2 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 1 [
        set binary replace-item random 1 binary random 2
      ;set tempreture tempreture - 1
      ]
      if tempreture = 0 [
        Show fitness_score
      stop
      
    ]


    ]


  show tempreture

 ; tick


end```

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜还是长夜 2025-01-27 11:59:20

从我的看来,这只是一个拼写错误。
您将温度设置为10,但是在其余代码中,您使用的是tempreture

编辑:
我在代码中发现的还有一些问题:

  • 您从温度开始,并立即减少。这意味着如果tempreture = 10 条件

    ,就无法实现

  • 每次鱼执行此过程时,tempreture都会恢复到10。 。

  • 您每次都会让温度通过一个派系,但是二进制组的变化只有在温度达到整数时才会发生。也许您想在传递里程碑时触发条件,而不仅仅是到达它的准确时?沿着这些线可以适用于此

     让以前的tempreture tempreture
    
    设置tempreture tempreture *(1 -cooling_rate / 100)
    
    如果以前的故事> 10和tempreture< = 10 [
      设置二进制替换项目随机16二进制随机2
    这是给出的
    如果以前的故事> 9和tempreture< = 9 [
      设置二进制替换项目随机14二进制随机2
    这是给出的
     

From what I see, it is simply a spelling error.
You set temperature to 10 but in the rest of your code you are using tempreture.

Edit:
Some more problems I found with the code:

  • You start with temperature at 10 and immediately let it decrease. That means that it would be impossible to ever fulfill the if tempreture = 10 condition

  • Every time the fish executes this procedure, tempreture is set back to 10. That means you will never reach the lower ones.

  • You let the temperature by a certain faction each time but the changes to your binary set only happen when temperature reaches a whole number. Maybe you want to trigger the condition when the milestone is passed, not just when it is reached exactly? Something along these lines would work for that

    let previous-tempreture tempreture
    
    set tempreture tempreture * (1 - cooling_rate / 100)
    
    if previous-tempreture > 10 and tempreture <= 10 [
      set binary replace-item random 16 binary random 2
    ]
    if previous-tempreture > 9 and tempreture <= 9 [
      set binary replace-item random 14 binary random 2
    ]
    
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文