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

求助:TSP的Cuckoo Search算法中Levy Flights的Python实现(0-1范围)

问题分析

你当前的Levy Flight实现基于逆变换采样,但公式u/math.pow(1-u, 1.6)的输出范围是**(0, +∞)**,完全无法满足0-1的要求——当u接近0.9999时,1-u趋近于0,结果会急剧增大,远远超出目标区间。

解决方案

根据你的需求(生成0-1范围的Levy分布值,或适配TSP场景的Levy飞行扰动),提供两种可行实现:

方案1:基于Mantegna算法的归一化Levy飞行(推荐用于TSP扰动)

Mantegna算法是生成Levy飞行的标准方法,输出的步长符合Levy分布,再通过截断和归一化映射到0-1区间:

import math
import numpy as np
from scipy.stats import norm

def levy_flight_mantagna(beta=1.6):
    # Mantegna算法生成标准Levy分布步长,beta通常取1.5-1.6
    sigma_u = math.gamma(1 + beta) * math.sin(math.pi * beta / 2)
    sigma_u /= math.gamma((1 + beta)/2) * beta * math.pow(2, (beta - 1)/2)
    sigma_u = math.pow(sigma_u, 1/beta)
    
    u = norm.rvs(0, sigma_u)
    v = norm.rvs(0, 1)
    
    return u / math.pow(abs(v), 1/beta)

def normalized_levy_01(beta=1.6, max_step=10):
    # 将Levy步长缩放到0-1区间
    levy_step = levy_flight_mantagna(beta)
    # 截断极端值,避免归一化失效
    clipped_step = np.clip(levy_step, -max_step, max_step)
    # 线性归一化到0-1范围
    return (clipped_step + max_step) / (2 * max_step)

方案2:截断逆变换生成0-1区间Levy分布值

如果仅需要0-1区间的截断Levy分布随机数,可在原逆变换基础上增加截断和归一化:

import math
import numpy as np

def truncated_levy_01(beta=1.6):
    u = np.random.uniform(0.0001, 0.9999)
    # 原逆变换公式生成Levy值
    levy_val = u / math.pow(1 - u, 1/beta)
    # 设定截断上限(beta=1.6时,99%分位数约为20,可按需调整)
    max_val = 20
    clipped_val = np.clip(levy_val, 0, max_val)
    # 归一化到0-1
    return clipped_val / max_val
TSP场景适配提示

在TSP的布谷鸟搜索中,Levy飞行通常用于生成路径的扰动(比如交换若干城市位置、调整城市顺序),而非直接生成0-1数值。你可以用生成的Levy步长控制扰动的幅度:比如将归一化后的0-1值映射为交换城市的数量,或作为调整路径的概率阈值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:40:48