模拟退火算法Python实现
- 瞎BB
- 代码
- 导入库以及参数设置
- 目标函数
- 主函数
瞎BB
代码
导入库以及参数设置
            
              
                import
              
               matplotlib
              
                .
              
              pyplot 
              
                as
              
               plt
              
                import
              
               math
              
                import
              
               random
T_init 
              
                =
              
              
                100
              
              
                # 初始最大温度
              
              
alpha 
              
                =
              
              
                0.95
              
              
                # 降温系数
              
              
T_min 
              
                =
              
              
                1e
              
              
                -
              
              
                3
              
              
                # 最小温度,即退出循环条件
              
            
          
          目标函数
            
              
                def
              
              
                obj
              
              
                (
              
              x
              
                )
              
              
                :
              
              
    y 
              
                =
              
              
                10
              
              
                *
              
               math
              
                .
              
              sin
              
                (
              
              
                5
              
              
                *
              
               x
              
                )
              
              
                +
              
              
                7
              
              
                *
              
               math
              
                .
              
              cos
              
                (
              
              
                4
              
              
                *
              
               x
              
                )
              
              
                return
              
              
                -
              
              y
            
          
          主函数
            
              
                def
              
              
                SA
              
              
                (
              
              T_init
              
                ,
              
              alpha
              
                ,
              
              T_min
              
                )
              
              
                :
              
              
    T 
              
                =
              
               T_init
    x_new 
              
                =
              
               random
              
                .
              
              random
              
                (
              
              
                )
              
              
                *
              
              
                10
              
              
                #初解
              
              
    x_current 
              
                =
              
               x_new
    y_current 
              
                =
              
              
                float
              
              
                (
              
              
                'inf'
              
              
                )
              
              
    x_best 
              
                =
              
               x_new
    y_best 
              
                =
              
              
                float
              
              
                (
              
              
                'inf'
              
              
                )
              
              
                while
              
               T 
              
                >
              
               T_min
              
                :
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                100
              
              
                )
              
              
                :
              
              
            delta_x 
              
                =
              
               random
              
                .
              
              random
              
                (
              
              
                )
              
              
                -
              
              
                0.5
              
              
                # 自变量变化后仍要求在[0,10]之间
              
              
                if
              
              
                0
              
              
                <
              
              
                (
              
              x_new 
              
                +
              
               delta_x
              
                )
              
              
                <
              
              
                10
              
              
                :
              
              
                x_new 
              
                =
              
               x_new 
              
                +
              
               delta_x
            
              
                else
              
              
                :
              
              
                x_new 
              
                =
              
               x_new 
              
                -
              
               delta_x
            y_new 
              
                =
              
               obj
              
                (
              
              x_new
              
                )
              
              
                if
              
              
                (
              
              y_new
              
                <
              
              y_current
              
                )
              
              
                :
              
              
                y_current
              
                =
              
              y_new
                x_current
              
                =
              
              x_new
                
              
                if
              
              
                (
              
              y_new
              
                <
              
              y_best
              
                )
              
              
                :
              
              
                    y_best
              
                =
              
              y_new
                    x_best
              
                =
              
              x_new
            
              
                else
              
              
                :
              
              
                if
              
               random
              
                .
              
              random
              
                (
              
              
                )
              
              
                <
              
               math
              
                .
              
              exp
              
                (
              
              
                -
              
              
                (
              
              y_new 
              
                -
              
               y_current
              
                )
              
              
                /
              
               T
              
                )
              
              
                :
              
              
                    y_current
              
                =
              
              y_new
                    x_current
              
                =
              
              x_new
                
              
                else
              
              
                :
              
              
                    x_new
              
                =
              
              x_current
        T 
              
                *=
              
               alpha
    
              
                print
              
              
                (
              
              
                '最优解'
              
              
                ,
              
              x_best
              
                ,
              
              obj
              
                (
              
              x_best
              
                )
              
              
                )
              
              
SA
              
                (
              
              T_init
              
                ,
              
              alpha
              
                ,
              
              T_min
              
                )
              
            
          
        


 
					 
					