You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Python处理极小数值?解决模拟退火中的除零错误

解决模拟退火中ZeroDivisionError的问题

你遇到的问题本质是当temperature趋近于0时,浮点数精度限制或退火逻辑导致它实际变成了0.0,触发了除零错误。即便你认为它只是接近0,但Python浮点数在极小值场景下可能被截断为0,或是你的退火调度函数最终将temperature降到了0。

针对你的代码,给出几个实用修复方案:

方案1:给temperature设置极小下限

在函数内部或传入参数前,确保temperature不会低于一个极小值(比如1e-10),既避免除零错误,也符合模拟退火后期不再接受差解的逻辑:

import math

def probability(d_new, d_old, temperature):
    delta = d_new - d_old
    # 给温度设置下限,避免趋近于0
    temp = max(temperature, 1e-10)
    if delta >= 0:
        probability = math.e ** (-delta / temp)
    else:
        probability = 1
    return probability

方案2:温度极低时直接返回0

当temperature足够小时,math.e ** (-delta/temp)的结果趋近于0,这时候直接返回0即可,无需执行计算:

import math

def probability(d_new, d_old, temperature):
    delta = d_new - d_old
    if delta < 0:
        return 1
    # 温度过低时直接返回0,不接受差解
    if temperature < 1e-10:
        return 0.0
    return math.e ** (-delta / temperature)

额外优化点

  • 你代码里重复计算了d_new - d_old,用提前定义的delta代替更高效。
  • 模拟退火的温度调度函数要注意,不要让temperature直接降到0(比如用temperature = temperature * alpha,alpha为小于1的系数),但受限于浮点数精度,最终仍可能趋近于0,所以加下限更稳妥。

Jupyter Notebooks本身不会导致这个错误,问题出在温度的处理逻辑上。

内容的提问来源于stack exchange,提问作者cookiecainsy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:38:19