• 2.算法-Python模拟退火算法实例


    题记 

            下面是python编写的模拟退火算法实例,包括全过程和解析。

    编写main.py文件

             main.py文件如下:

    import math
    import random
    
    # 初始解:算法从问题的解空间中随机选择一个初始解作为当前解。
    # 目标函数:算法需要优化的目标函数定义了解的质量。算法的目标是最小化或最大化这个函数。
    # 温度:模拟退火算法引入了一个控制搜索过程的温度参数。温度高时,算法更容易接受比当前解质量差的解;温度逐渐降低,接受劣质解的概率也逐渐减小。
    # 邻域操作:算法通过在当前解的邻域中进行随机扰动来生成新的解。邻域操作的设计通常依赖于具体问题。
    # 能量差:新解和当前解之间的目标函数值差异被称为能量差。如果新解更优(即目标函数值更小或更大,取决于问题类型),则新解被接受。如果新解劣于当前解,有一定概率接受新解,这个概率由温度和能量差共同决定。
    # 降温策略:温度随着迭代逐渐降低,冷却过程的速率由降温策略(通常是指数衰减)决定。随着温度的降低,算法在接受劣质解的概率减小,搜索逐渐趋向于收敛。
    # 停止准则:算法根据一定的停止准则(例如达到最大迭代次数、温度降低到某个阈值等)确定何时停止搜索并返回当前解作为最终结果。
    
    # 目标函数(这里以一个简单的二次函数为例)
    def objective_function(x):
        return x**2
    
    # 模拟退火算法,主体
    def simulated_annealing(max_iterations, initial_temperature, cooling_rate):
        # 选择初始解,从-10,10
        current_solution = random.uniform(-10, 10)
        # 初始解的目标函数值,作为当前解的能量
        current_energy = objective_function(current_solution)
        # 这个循环用于迭代模拟退火算法,参数为迭代次数
        for i in range(max_iterations):
            # 计算当前温度,温度随着迭代逐渐降低,由初始温度initial_temperature按照指数衰减(以cooling_rate为衰减率)。
            temperature = initial_temperature * math.exp(-cooling_rate * i)
    
            # 生成新解,通过在当前解的基础上加上一个[-1, 1]范围内的随机数
            new_solution = current_solution + random.uniform(-1, 1)
            new_energy = objective_function(new_solution)
    
            # 计算能量差
            energy_difference = new_energy - current_energy
    
            # 如果新解更优或者以一定概率接受劣解,这是模拟退火算法的关键部分,允许算法在一定程度上接受劣质解,以避免陷入局部最优解,e的x次方
            # 从[0.0,1.0)
            if energy_difference < 0 or random.random() < math.exp(-energy_difference / temperature):
                #更新解和能量
                current_solution = new_solution
                current_energy = new_energy
    
        return current_solution, current_energy
    
    # 参数设置
    max_iterations = 10000  # 迭代次数
    initial_temperature = 100  # 初始温度
    cooling_rate = 0.01  # 降温速率
    
    # 运行模拟退火算法
    best_solution, best_energy = simulated_annealing(max_iterations, initial_temperature, cooling_rate)
    
    print("最优解:", best_solution)
    print("最优解的目标函数值:", best_energy)
    
    1. import math
    2. import random
    3. # 初始解:算法从问题的解空间中随机选择一个初始解作为当前解。
    4. # 目标函数:算法需要优化的目标函数定义了解的质量。算法的目标是最小化或最大化这个函数。
    5. # 温度:模拟退火算法引入了一个控制搜索过程的温度参数。温度高时,算法更容易接受比当前解质量差的解;温度逐渐降低,接受劣质解的概率也逐渐减小。
    6. # 邻域操作:算法通过在当前解的邻域中进行随机扰动来生成新的解。邻域操作的设计通常依赖于具体问题。
    7. # 能量差:新解和当前解之间的目标函数值差异被称为能量差。如果新解更优(即目标函数值更小或更大,取决于问题类型),则新解被接受。如果新解劣于当前解,有一定概率接受新解,这个概率由温度和能量差共同决定。
    8. # 降温策略:温度随着迭代逐渐降低,冷却过程的速率由降温策略(通常是指数衰减)决定。随着温度的降低,算法在接受劣质解的概率减小,搜索逐渐趋向于收敛。
    9. # 停止准则:算法根据一定的停止准则(例如达到最大迭代次数、温度降低到某个阈值等)确定何时停止搜索并返回当前解作为最终结果。
    10. # 目标函数(这里以一个简单的二次函数为例)
    11. def objective_function(x):
    12. return x**2
    13. # 模拟退火算法,主体
    14. def simulated_annealing(max_iterations, initial_temperature, cooling_rate):
    15. # 选择初始解,从-10,10
    16. current_solution = random.uniform(-10, 10)
    17. # 初始解的目标函数值,作为当前解的能量
    18. current_energy = objective_function(current_solution)
    19. # 这个循环用于迭代模拟退火算法,参数为迭代次数
    20. for i in range(max_iterations):
    21. # 计算当前温度,温度随着迭代逐渐降低,由初始温度initial_temperature按照指数衰减(以cooling_rate为衰减率)。
    22. temperature = initial_temperature * math.exp(-cooling_rate * i)
    23. # 生成新解,通过在当前解的基础上加上一个[-1, 1]范围内的随机数
    24. new_solution = current_solution + random.uniform(-1, 1)
    25. new_energy = objective_function(new_solution)
    26. # 计算能量差
    27. energy_difference = new_energy - current_energy
    28. # 如果新解更优或者以一定概率接受劣解,这是模拟退火算法的关键部分,允许算法在一定程度上接受劣质解,以避免陷入局部最优解,e的x次方
    29. # 从[0.0,1.0)
    30. if energy_difference < 0 or random.random() < math.exp(-energy_difference / temperature):
    31. #更新解和能量
    32. current_solution = new_solution
    33. current_energy = new_energy
    34. return current_solution, current_energy
    35. # 参数设置
    36. max_iterations = 10000 # 迭代次数
    37. initial_temperature = 100 # 初始温度
    38. cooling_rate = 0.01 # 降温速率
    39. # 运行模拟退火算法
    40. best_solution, best_energy = simulated_annealing(max_iterations, initial_temperature, cooling_rate)
    41. print("最优解:", best_solution)
    42. print("最优解的目标函数值:", best_energy)

    执行程序 

             python main.py

    展示图 

    后记

            觉得有用可以点赞或收藏!

  • 相关阅读:
    Request_共享数据(域对象) [JavaWeb][Servlet]
    【MySQL高级】MySQL的优化
    JavaSe-JAVA的多态
    python 操作 excel
    Pytorch 中使用 Tensorborad 的技巧
    excel 如何自动调整行间距 vba
    Linux /dev目录详解和Linux系统各个目录的作用
    SSM框架原理【超级详细】
    h5钉钉导航栏实时更新(跟踪标题)标题
    读书笔记:程序员的思维修炼:开发认知潜能的九堂课
  • 原文地址:https://blog.csdn.net/m0_70819559/article/details/133844514