模拟退火 python 实现
简介
一直以为是一个高深的算法,好像据说在量子计算机中可以应用。发现原理并不难
参考链接
https://blog.csdn.net/google19890102/article/details/45395257
https://blog.csdn.net/wfrainn/article/details/80303138
算法缺点
这个算法怎么感觉概率的地方基本不受控制,温度降到最后还是大量接受随机解?
模拟退火就是这样的,因为它到了最优解过后还能跳出最优解域,因此能找到别的解域的最优解的值。因此一定要记录下历史最优解。
算法流程图
code
对https://blog.csdn.net/wfrainn/article/details/80303138进行的代码更新
result
直接输出 39.72958243492729 -32148.550564632504
记录最小数值 40.033185051881034 -32154.066628802473
发现保留的最小值确实更接近最小值
code
#coding=utf-8
import numpy as np
from monituihuo import aimFunction
import math
T=1000 # initiate temperature
Tmin=10 # minimun value of terperature
x = np.random.uniform(low=0, high=100) # initiate x
k=50 # times of internal circulation
y = 0 # initiate result
t=0 # time
xmin = 100
ymin = 100 # 观察凸显给出的数值
while T>Tmin:
for i in range(k):
y=aimFunction(x)
# generate a new x in the neighboorhood of x by transform function
xNew = x + np.random.uniform(low=-0.055, high=0.055) * T
if(0<=xNew and xNew <=100):
yNew=aimFunction(xNew)
if(yNew - y <= 0):
x = xNew
if(yNew < ymin):
xmin = x
ymin = yNew
else:
#metropolis principle
p = math.exp(-(yNew-y) / T)
r = np.random.uniform(low=0, high=1)
if r < p:
x=xNew
t+=1
# print(t)
T=(1000)/(1+t)
print('直接输出',x, aimFunction(x))
print('记录最小数值',xmin, aimFunction(xmin))
#coding=utf-8
from __future__ import division # 将新版本的特性引入
import numpy as np
import matplotlib.pyplot as plt
import math
def aimFunction(x):
y=x**3-60*x**2-4*x+6
return y
x = [i/10 for i in range(1000)]
y = [0 for i in range(1000)]
for i in range(1000):
y[i] = aimFunction(x[i])
plt.plot(x,y)
# plt.show()
模拟退火 python 实现的更多相关文章
- 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径
模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...
- 模拟退火算法(1)Python 实现
1.模拟退火算法 模拟退火算法借鉴了统计物理学的思想,是一种简单.通用的启发式优化算法,并在理论上具有概率性全局优化性能,因而在科研和工程中得到了广泛的应用. 退火是金属从熔融状态缓慢冷却.最终达到能 ...
- 模拟退火算法Python编程(2)约束条件的处理
1.最优化与线性规划 最优化问题的三要素是决策变量.目标函数和约束条件. 线性规划(Linear programming),是研究线性约束条件下线性目标函数的极值问题的优化方法,常用于解决利用现有的资 ...
- 模拟退火算法Python编程(3)整数规划问题
1.整数规划问题 整数规划问题在工业.经济.国防.医疗等各行各业应用十分广泛,是指规划中的变量(全部或部分)限制为整数,属于离散优化问题(Discrete Optimization). 线性规划问题的 ...
- Python自然语言处理系列之模拟退火算法
1.基本概念 模拟退火算法(Simulated Annealing,SA)是一种模拟固体降温过程的最优化算法.其模拟的过程是首先将固体加温至某一温度,固体内部的粒子随温度上升慢慢变为无序的状态,内能增 ...
- 用 Python 通过马尔可夫随机场(MRF)与 Ising Model 进行二值图降噪
前言 这个降噪的模型来自 Christopher M. Bishop 的 Pattern Recognition And Machine Learning (就是神书 PRML……),问题是如何对一个 ...
- Python机器学习笔记 Logistic Regression
Logistic回归公式推导和代码实现 1,引言 logistic回归是机器学习中最常用最经典的分类方法之一,有人称之为逻辑回归或者逻辑斯蒂回归.虽然他称为回归模型,但是却处理的是分类问题,这主要是因 ...
- sopt:一个简单的python最优化库
引言 最近有些朋友总来问我有关遗传算法的东西,我是在大学搞数学建模的时候接触过一些最优化和进化算法方面的东西,以前也写过几篇博客记录过,比如遗传算法的C语言实现(一):以非线性函数求极值为例和 ...
- (数据科学学习手札34)多层感知机原理详解&Python与R实现
一.简介 机器学习分为很多个领域,其中的连接主义指的就是以神经元(neuron)为基本结构的各式各样的神经网络,规范的定义是:由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系 ...
- Python自然语言处理-系列一
一:python基础,自然语言概念 from nltk.book import * 1,text1.concordance("monstrous") 用语索引 2,tex ...
随机推荐
- 凯亚IOT平台在线测试MQTT接入设备
一.概述 凯亚 (Kayak)开通了MQTT端口425,以便给感兴趣的同僚进行测试,下面将在此篇文章讲解如何平台接入设备进行MQTT通信 凯亚 (Kayak) 是什么? 凯亚(Kayak)是基于.NE ...
- 【已解决】戴尔 Inspiron 5457 和 5557 启动报错:Invalid configuration information - please run SETUP program.
场景 我使用的是戴尔15-5557的笔记本电脑,在某次开机的时候系统提示:Invalid configuration information - please run SETUP program. 虽 ...
- 参考示例之“复制对象|拷贝对象|BeanUtils工具类学习”
// 设置需要拷贝的字段 Set<String> targetSet = new HashSet<>(); targetSet.addAll(Arrays .asList(&q ...
- Pandas 批量处理文本表
就是一个批量读取文件, 然后计算指标的过程. 难度到是没啥, 只是想记录一把, 毕竟这类的需求, 其实还是蛮多的. 但涉及一些数据的安全, 和指标这块也是不能透露的, 因此只能是贴上代码, 目的还是给 ...
- C#结构体布局规则
以下两个结构体,虽然字段完全一模一样,但因为Pack方式不同,导致它们实际占用内存大小是不一样的! [StructLayout(LayoutKind.Sequential,Pack =1)]//无填充 ...
- AssemblyResolve巧解未能加载文件或程序集“Newtonsoft.Json, Version=6.0.0.0的问题
问题:未能加载文件或程序集"Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aee ...
- C#数据结构及算法之链表
C# 链表 链表是节点的列表,节点包含两部分:值和链接,其中值部分用于储存数据,链接部分用于指向下一个元素的地址,是引用 类型. 单链表 public class LinkedList { priva ...
- C#之Stream和IO
C#之Stream和IO public class test { public int aa = 100; public string testStr = "test"; publ ...
- Hitachi Vantara Programming Contest 2024(AtCoder Beginner Contest 368)题解A~D
A - Cut 题意: 将数组的后k个字符移到前面 思路: 可以用rotate()函数让数组中的元素滚动旋转 rotate(v.begin(), v.begin() + n - k, v.end()) ...
- Linux Shell整理小知识
Linux Shell整理小知识 介绍两个命令 1. shopt shell option, 即shell的一些选项设置 [root@localhost ~]# shopt autocd off cd ...