`
hz_chenwenbiao
  • 浏览: 1007685 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

模拟退火算法总结(含例子)(转)

阅读更多

一.模拟退火算法概述

  模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。根据Metropolis准则,粒子在温度T时趋于平衡的概率为e-ΔE/(kT),其中E为温度T时的内能,ΔE为其改变量,k为Boltzmann常数。用固体退火模拟组合优化问题,将内能E模拟为目标函数值f,温度T演化成控制参数t,即得到解组合优化问题的模拟退火算法:由初始解i和控制参数初值t开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解,这是基于蒙特卡罗迭代求解法的一种启发式随机搜索过程。退火过程由冷却进度表(Cooling Schedule)控制,包括控制参数的初值t及其衰减因子Δt、每个t值时的迭代次数L和停止条件S。

二.流程图

伪码描述:  
Simulated-Annealing()  
Create initial solution S  
repeat  
    for i=1 to iteration-length do  
        Generate a random transition from S to Si  
        If ( C(S) <= C(Si) ) then  
            S=Si  
        else if( exp(C(S)-C(Si))/kt > random[0,1) ) then  
            S=Si  
    Reduce Temperature t  
until ( no change in C(S) )  
  
C(S): Cost or Loss function of Solution S  
 三.旅行商问题上的应用

    旅行商问题就是指旅行商按一定的顺序访问N个城市的每个城市,使得每个城市都能被访问且仅能被访问一次,最后回到起点,而使花费的代价最小。本例中从第0个城市开始然后回到原点.

示例代码:

/** 
 *  
 */  
package anneal.tsp;  
  
import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileReader;  
import java.io.IOException;  
import java.util.Arrays;  
import java.util.Random;  
  
/** 
 * @author Dukie 下午02:22:13 2010 
 *  
 */  
public class Anneal {  
  
    private  static double[][] city;  
    private  static int[] currPath;  
    private  static int[] bestPath;  
    private  static double shortesDistance;  
    private  static int numOfCity = 20;  
    //trace item  
    private static int iterator = 0;  
  
    public void printInfo() {  
        System.out.println("bestPath: " + Arrays.toString(bestPath));  
        System.out.println("shortest distance: " + shortesDistance);  
        System.out.println("iterator times: " + iterator);  
    }  
  
    private void init() throws IOException {  
        city = new double[numOfCity][numOfCity];  
        currPath = new int[numOfCity];  
        bestPath = new int[numOfCity];  
        shortesDistance = 0;  
        loadCity();  
        int lenth = currPath.length;  
        for (int i = 0; i < lenth; i++) {  
            currPath[i] = i;  
        }  
    }  
  
    private void loadCity() throws IOException {  
        //DistanceMatrix.csv" a file stores the distance info.  
        File file = new File("E:\\TSP\\DistanceMatrix.csv");  
        inputGraph(file, city);  
    }  
  
    private void inputGraph(File file, double[][] city) throws IOException {  
        BufferedReader in = new BufferedReader(new FileReader(file));  
        String str = "";  
        int length = 0;  
        while ((str = in.readLine()) != null) {  
            str = str.replaceAll(", ", ",");  
            String[] line = str.split(",");  
            for (int j = 0; j < numOfCity; j++)  
                // ten cities  
                city[length][j] = Double.parseDouble(line[j]);  
            length++;  
        }  
    }  
  
    /** 
     * key function 
     * @throws IOException 
     */  
    public void anneal() throws IOException {  
  
        double temperature = 10000.0D;  
        double deltaDistance = 0.0D;  
        double coolingRate = 0.9999;  
        double absoluteTemperature = 0.00001;  
  
        init();  
  
        double distance = getToatalDistance(currPath);  
  
        int[] nextPath;   
        Random random = new Random();  
        while (temperature > absoluteTemperature) {  
            nextPath = generateNextPath();  
            deltaDistance = getToatalDistance(nextPath) - distance;  
  
            if ((deltaDistance < 0)  
                    || (distance > 0 &&   
                          Math.exp(-deltaDistance / temperature) > random.nextDouble())) {  
                currPath = Arrays.copyOf(nextPath, nextPath.length);  
                distance = deltaDistance + distance;  
            }  
  
            temperature *= coolingRate;  
            iterator++;  
            System.out.println("iterator: " + iterator + " path: " + Arrays.toString(currPath));  
        }  
        shortesDistance = distance;  
        System.arraycopy(currPath, 0, bestPath, 0, currPath.length);  
  
    }  
  
    /** 
     * calculate total distance 
     * @param currPath 
     * @return 
     */  
    private double getToatalDistance(int[] currPath) {  
        int length = currPath.length;  
        double totalDistance = 0.0D;  
        for (int i = 0; i < length - 1; i++) {  
            totalDistance += city[currPath[i]][currPath[i + 1]];  
        }  
        totalDistance += city[currPath[length - 1]][0];  
  
        return totalDistance;  
    }  
  
    /** 
     * swap two elements in the old array to genreate new array 
     * @return 
     */  
    private int[] generateNextPath() {  
        int[] nextPath = Arrays.copyOf(currPath, currPath.length);  
        Random random = new Random();  
        int length = nextPath.length;  
        int fistIndex = random.nextInt(length - 1) + 1;  
        int secIndex = random.nextInt(length - 1) + 1;  
        while (fistIndex == secIndex) {  
            secIndex = random.nextInt(length - 1) + 1;  
        }  
        int tmp = nextPath[fistIndex];  
        nextPath[fistIndex] = currPath[secIndex];  
        nextPath[secIndex] = tmp;  
  
        return nextPath;  
    }  
  
}  

 20个城市测试数据:

0, 11893, 14633, 10172, 8078, 12843, 10079, 14395, 8056, 14232, 11714, 9309, 12517, 11574, 9720, 13727, 13852, 14330, 10660, 8138  
11893, 0, 10568, 9031, 11050, 9039, 10622, 14138, 8738, 9122, 8817, 13099, 9984, 13063, 11546, 11379, 8850, 14111, 13775, 8073  
14633, 10568, 0, 14174, 13338, 12629, 14418, 10391, 14444, 12956, 14040, 12835, 13486, 14249, 14039, 8186, 14730, 8886, 12862, 12365  
10172, 9031, 14174, 0, 9422, 11814, 14133, 11645, 10495, 13099, 14712, 14988, 11662, 14561, 13350, 10781, 14886, 11549, 13044, 11194  
8078, 11050, 13338, 9422, 0, 9868, 11492, 12416, 14672, 12894, 11181, 14310, 9231, 12697, 12617, 8856, 11850, 13302, 12558, 11165  
12843, 9039, 12629, 11814, 9868, 0, 10069, 10605, 8799, 9295, 14078, 12349, 14367, 9501, 11379, 13431, 10723, 8845, 10427, 14821  
10079, 10622, 14418, 14133, 11492, 10069, 0, 12734, 8656, 13830, 12681, 13165, 11583, 8610, 9202, 9838, 10755, 10674, 13881, 13024  
14395, 14138, 10391, 11645, 12416, 10605, 12734, 0, 11980, 13753, 11174, 14603, 13478, 12543, 12974, 11059, 8799, 11781, 13797, 9287  
8056, 8738, 14444, 10495, 14672, 8799, 8656, 11980, 0, 11108, 8725, 11253, 12277, 13086, 9476, 12513, 9597, 11850, 13866, 8605  
14232, 9122, 12956, 13099, 12894, 9295, 13830, 13753, 11108, 0, 14301, 8065, 13706, 9212, 8301, 8258, 14817, 9277, 12742, 14550  
11714, 8817, 14040, 14712, 11181, 14078, 12681, 11174, 8725, 14301, 0, 8133, 13841, 9062, 10704, 13366, 13779, 13710, 12832, 12812  
9309, 13099, 12835, 14988, 14310, 12349, 13165, 14603, 11253, 8065, 8133, 0, 8079, 9554, 9760, 11617, 10566, 9382, 12105, 11755  
12517, 9984, 13486, 11662, 9231, 14367, 11583, 13478, 12277, 13706, 13841, 8079, 0, 9991, 14717, 13082, 11787, 14614, 11698, 10970  
11574, 13063, 14249, 14561, 12697, 9501, 8610, 12543, 13086, 9212, 9062, 9554, 9991, 0, 14363, 8175, 12309, 9042, 11251, 9250  
9720, 11546, 14039, 13350, 12617, 11379, 9202, 12974, 9476, 8301, 10704, 9760, 14717, 14363, 0, 12291, 12173, 10971, 9000, 9868  
13727, 11379, 8186, 10781, 8856, 13431, 9838, 11059, 12513, 8258, 13366, 11617, 13082, 8175, 12291, 0, 14291, 12915, 9583, 9671  
13852, 8850, 14730, 14886, 11850, 10723, 10755, 8799, 9597, 14817, 13779, 10566, 11787, 12309, 12173, 14291, 0, 13657, 8621, 9089  
14330, 14111, 8886, 11549, 13302, 8845, 10674, 11781, 11850, 9277, 13710, 9382, 14614, 9042, 10971, 12915, 13657, 0, 9709, 10960  
10660, 13775, 12862, 13044, 12558, 10427, 13881, 13797, 13866, 12742, 12832, 12105, 11698, 11251, 9000, 9583, 8621, 9709, 0, 13131  
8138, 8073, 12365, 11194, 11165, 14821, 13024, 9287, 8605, 14550, 12812, 11755, 10970, 9250, 9868, 9671, 9089, 10960, 13131, 0  
 在我机上对20个顸城市进行测试后,效果比较好. 对10城市时,在几秒钟来就达到全局最优解.

注意:模拟退火算法与初始值无关,算法求得的解与初始解状态S(是算法迭代的起点)无关;模拟退火算法具有渐近收敛性,已在理论上被证明是一种以概率l 收敛于全局最优解的全局优化算法;模拟退火算法具有并行性。

 

 

分享到:
评论
1 楼 hy1235366 2017-03-27  
能够随便也发一下,你退火算法程序使用的DistanceMatrix.csv的文件吗?谢谢!

相关推荐

    关于模拟退火算法的例子

    总结,模拟退火算法是一种有效的全局优化工具,通过引入随机性避免陷入局部最优。MATLAB作为强大的计算平台,为实现和调试算法提供了便利。理解其工作原理并掌握MATLAB代码实现,有助于我们在实际问题中灵活应用模拟...

    模拟退火算法源程序

    本段代码展示了如何使用模拟退火算法解决TSP问题,并给出了一个具体的例子——找到连接中国31个省会城市的最短路径。 #### 四、代码解析 1. **函数定义**: ```matlab function [MinD,BestPath]=MainAneal...

    模拟退火算法举例

    模拟退火算法是一种启发式搜索方法,源自固体物理中的退火过程,被广泛应用于解决优化问题,特别是组合优化问题。MATLAB作为一种强大的数值计算环境,是实现模拟退火算法的理想平台。下面,我们将深入探讨模拟退火...

    模拟退火算法matlab代码.docx

    下面详细介绍如何使用MATLAB编写模拟退火算法,并通过一个具体的例子来演示其应用过程。 ##### 1. 算法实现代码解析 给定的MATLAB代码实现了模拟退火算法的基本框架。其主要参数包括: - `objective`: 目标函数,...

    模拟退火算法解决0—-1背包问题

    根据提供的代码示例,我们可以将模拟退火算法应用于0-1背包问题的过程总结如下: 1. **初始化**:首先初始化问题参数,包括物品的数量、每个物品的重量和价值,以及背包的容量等。然后设置初始解 \( x \),并设定...

    模拟退火算法matlab代码.pdf

    ### 模拟退火算法详解及其MATLAB实现 #### 一、模拟退火算法的基本原理 模拟退火算法(Simulated Annealing, SA)是一种启发式全局优化方法,旨在寻找复杂问题的近似最优解。它源于物理学中的退火过程,在这一过程...

    模拟退火算法MATLAB实现 function sa-minimize

    ### 模拟退火算法MATLAB实现详解 #### 一、引言 模拟退火算法是一种启发式全局优化方法,广泛应用于寻找复杂问题的近似最优解。它模仿了固体物质退火的过程,在数学和物理领域都有重要的应用价值。本文将详细介绍...

    旅行商问题(TSP)经典的组合优化穷举法、动态规划、贪婪算法、模拟退火算法、遗传算法

    模拟退火算法是一种启发式搜索方法,它借鉴了物理中的退火过程。该算法允许在某些情况下接受劣解,从而避免陷入局部最优。通过逐渐降低“温度”参数,最终可以收敛到一个较好的解。模拟退火算法在处理较大规模的TSP...

    模拟退火法解TSP的matlab程序

    ### 模拟退火算法简介 模拟退火(Simulated Annealing,简称SA)是一种启发式全局优化方法,灵感来源于固体物质的退火过程。在物理学中,退火是指通过加热物质使其达到较高的能量状态,然后缓慢冷却以减少其内部的...

    第23章 现代优化算法.pdf

    为了更好地理解模拟退火算法的工作原理,我们可以考虑一个简单的例子——一维函数的最小化问题。假设我们需要找到函数\( f(x) = x^2 \)的最小值。 1. **初始化**:设定初始温度\( T_0 = 1000 \),初始解\( x^{(0)} ...

    浅谈随机化思想在几何问题中的应用1

    本文将深入探讨两种在信息学竞赛中常用的随机几何算法——随机增量法和模拟退火算法,并与传统的几何算法进行对比,揭示随机化思想的优势。 首先,让我们对随机算法的基本概念进行简要介绍。随机算法是一种在执行...

    1074365821676817第17章 智能算法.zip

    figure17_2.png和figure17_2_2.png可能是对某一种智能算法的分步解析,比如遗传算法或模拟退火算法。这些图通常会展示算法的核心步骤,如选择、交叉和变异(对于遗传算法),或者温度下降和接受准则(对于模拟退火)...

    遗传算法的应用举例(关于遗传算法的具体介绍)

    与模拟退火算法的结果进行对比后发现,虽然两种方法都能得到较为满意的结果,但遗传算法在解决大规模旅行商问题时表现出了更好的性能。 #### 四、总结 通过上述介绍可以看出,遗传算法作为一种强大的优化技术,在...

    数学建模 最优解 最小距离 flord 算法

    在实际应用中,可能需要结合其他算法或模型,如Prim算法、遗传算法或模拟退火算法,以更全面地考虑各种因素,优化交通网络设计。此外,还需要考虑交通规划的动态性,随着时间的推移,交通需求和城市发展的变化可能...

    k-means算法源代码

    提到"面向对象的模拟退火编程技术.cpp",这可能是一个将模拟退火算法与面向对象编程相结合的例子。模拟退火是一种全局优化技术,常用于解决组合优化问题,它基于物理中的退火过程模拟搜索解空间。在k-means中,模拟...

    算法课 旅行商问题

    5. **其他解法**:尽管穷举法在小规模问题中可行,但对于大规模的旅行商问题,人们通常会采用近似算法,如贪婪算法、遗传算法、模拟退火算法或禁忌搜索等,这些方法可以在有限的时间内找到接近最优解的解决方案。...

    算法大全部分附MATLAB代码

    3. 模拟退火、遗传算法等全局优化方法:这些在MATLAB中都有对应的工具箱,便于实现复杂的优化问题。 四、算法在数学建模中的作用 在数模竞赛中,算法是解决问题的关键工具。例如,线性规划可以帮助解决资源分配问题...

    算法导论中文版第二版(书+课后习题答案)

    3. 模拟退火和遗传算法:属于启发式搜索,常用于求解NP难问题。 五、算法实践与应用 书中还涵盖了如何使用伪代码和实际编程语言(如C++或Java)来实现算法,以及如何利用计算机辅助验证算法的正确性。 课后习题...

    自适应对数双搜索人工蜂群策略异源图像配准.docx

    此外,还有利用力矩主轴和模拟退火算法、生物地理学优化算法等进行图像配准的例子。 本文提出的新方法——ALD-ABC算法,它结合了自适应对数收敛双搜索策略,旨在增强局部搜索能力和全局优化性能。算法的关键在于...

    Google计算思维2-2-1算法探究

    - **算法**: 常见的求解方法包括贪心算法、遗传算法、模拟退火算法等。 #### 图论最短路径问题 - **定义**: 在给定的图中找到两个顶点之间的最短路径。 - **算法**: Dijkstra 算法、Floyd-Warshall 算法、Bellman-...

Global site tag (gtag.js) - Google Analytics