IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 进化算法/模拟退火 -> 正文阅读

[人工智能]进化算法/模拟退火

原理

简介

爬山算法:

  • 总是将当前位置高度和前后位置高度对比,如果当前位置高度比前后位置都高,那么就认为到达了最优位置,然而他山更比此山高,这个位置很可能只是局部最优(一座小山)
  • 好比你来到了世界上最矮的山-静山之巅,左右四顾已经没有比静山之巅更高的地方
  • 静山位于山东寿光市西南8公里,孙家集街道云马家庄之间,海拔高度0.6米
    在这里插入图片描述

进一步:

  • 如果你站在静山之巅能够随性远行,离开局部最优,你会发现山东还有泰山,中国还有珠穆朗玛峰
  • 模拟退火算法内部就含有这种随机性,在某一温度下的迭代过程中,分子的能量可能比上次迭代时能量高,但仍有一定概率接收这次迭代的结果,从而跳出局部最优,走向全局最优

模拟退火算法:

  • 来自于金属高温冶炼过程中,分子能量随着温度降低而降低的过程,分子的随机移动范围也随着温度降低而减少,分子的移动具有随机性,最终温度降到一定程度,分子随机移动范围减少到一定程度,分子能量降到一定程度
  • 由于分子移动的随机性,使得分子到达局部最优能量后,仍然能够有一定概率跳出局部最优,最终达到全局最优

分子扰动

已知:

  • 温度越高分子随机移动的范围越大
  • 位于绝对0度-273.15度时,分子停止移动
    y r a n g e = k ? T + b ? 代 入 0 = k ? ( ? 273.15 ) + b y r a n g e = k ( 273.15 + T ) y_{range}=k\cdot T+b \stackrel{代入0=k \cdot (-273.15)+b}{\Longrightarrow} y_{range}=k(273.15+T) yrange?=k?T+b?0=k?(?273.15)+b?yrange?=k(273.15+T)
  • k k k控制移动范围
  • T T T当前温度

代码

步骤

  1. 初始温度;初始化种群,初始化分子(个数,多维能量);计算初始能量
  2. 两层循环,外层控制温度,内层控制此温度下的迭代次数; 邻域内随机扰动x,产生新解(温度越高,分子运动的范围越大,-273.15是绝对0度,分子不再运动),再计算新能量
  3. 判断新能量<原能量,采纳新能量分子(新解);新能量>原能量使用metropolis principle采纳新能量分子(新解)
  4. 记录每个温度每次内部迭代下的最小能量和最小能量分子
import math
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

matplotlib.rcParams['font.family'] = 'STSong'
matplotlib.rcParams['font.size'] = 10


def Energy_F1(x):
    """
    能量函数
    目标函数值作为E(energy),fitness
    求目标函数最小值,因此E越小越好
    :param x: 解
    :return:
    """
    return np.sum(x ** 2)


class SimulatedAnnealing(object):
    """
    模拟退火
    """

    def __init__(self, inner_iter_num, E_end, x_min, x_max, NP, D, T0, T_end, tr, kr):
        """
        初始化
        :param inner_iter_num: 每个T温度下的迭代次数,内部迭代次数
        :param E_end: 截止能量,截止适应度
        :param x_min: 下边界
        :param x_max: 上边界
        :param NP(number population): 种群大小
        :param D(dimension): 解的维度
        :param T0: temperature0, 初始温度
        :param T_end: 截止温度
        :param tr: 温度下降速率
        :param kr: 分子扰动率,控制分子移动范围,与T0和绝对0度-273.15度有关
        """
        # 截止条件
        self.inner_iter_num = inner_iter_num
        self.E_end = E_end
        # 目标空间
        self.x_min = x_min
        self.x_max = x_max
        # 求解者
        self.NP = NP
        self.D = D
        # 算法参数
        self.T0 = T0
        self.T_end = T_end
        self.tr = tr
        self.kr = kr

    def cooling(self):
        """
        降温过程
        :return: E_list,元素{(T,i):E}={(当前温度,当前温度下迭代次数):当前最小能量}
        """
        # 记录
        idx_min = None
        E_dict = {}
        # 1. 初始温度,初始化种群,初始化分子(个数,多维能量)
        T = self.T0
        # x.shape=(NP,D)
        x = np.random.uniform(self.x_min, self.x_max, (self.NP, self.D))
        # 初始能量,所有列按行取
        Es = [Energy_F1(one) for one in x[..., :]]
        while T > self.T_end:
            # inner_iter_num 内部迭代次数
            for num in range(self.inner_iter_num):
                # 邻域内随机扰动x,产生新解
                # 温度越高,分子运动的范围越大,-273.15是绝对0度,分子不再运动
                k = np.random.rand() * self.kr
                y_range = k * (273.15 + T);
                x_new = x + np.random.uniform(-y_range, y_range, (self.NP, self.D))
                # 保证在解空间内
                for m in range(self.NP):
                    for n in range(self.D):
                        while x_new[m, n] < self.x_min or x_new[m, n] > self.x_max:
                            x_new[m, n] = x[m, n] + np.random.uniform(-0.055, 0.055) * T
                # 分子移动后新的能量
                E_news = [Energy_F1(one) for one in x_new[..., :]]
                for m in range(self.NP):
                    if E_news[m] < Es[m]:
                        x[m, :] = x_new[m, :]
                    else:
                        # metropolis principle
                        p = math.exp(-(E_news[m] - Es[m]) / T)
                        # r属于[0,1)
                        r = np.random.rand()
                        if r < p:
                            x[m, :] = x_new[m, :]
                    # 记录新的能量
                    Es[m] = E_news[m]
                # 记录每次迭代的最小能量
                E_min = min(Es)
                idx_min = Es.index(E_min)
                E_dict[(T, num)] = E_min
                print("温度T=", T, " 内部迭代次数=", num + 1, " 能量=", E_min)
                # 达到截止能量退出
                if E_min < self.E_end:
                    return x[idx_min, :], E_dict
            # 温度
            T = self.tr * T
        pass
        return x[idx_min, :], E_dict

    def show(self, x_best, E_dict):
        """
        展示
        :param x_best: 最优解
        :param E_dict: 最低能量数组
        :return:
        """
        print("最优分子:", str(x_best))
        print("最优解:", str(list(E_dict.values())[-1]))

        plt.title("迭代过程")
        plt.xlabel("迭代次数")
        plt.ylabel("能量E")
        x = range(1, len(E_dict) + 1)
        y = list(E_dict.values())
        plt.plot(x, y, label="SA")
        plt.legend()
        plt.show()


if __name__ == '__main__':
    sa = SimulatedAnnealing(10, 1e-4, -30, 30, 50, 20, 1000, 10, 0.9, 0.001)
    x_best, E_dict = sa.cooling()
    sa.show(x_best, E_dict)
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:47:25  更:2022-03-13 21:50:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 16:09:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码