首页 > 其他分享 >【知识】模拟退火

【知识】模拟退火

时间:2024-12-02 20:55:31浏览次数:4  
标签:rand include cur int double 知识 模拟退火 PDD

模拟退火

概念:

  1. 温度(步长):

    • 初始温度 \(T\)

    • 终止温度

    • 衰减系数 $ 0 \sim 1$

  2. 随机选择一个点:

    \(f(新点) - f(当前点) = \Delta E\)

    • \(\Delta E < 0\) 跳到新点
    • \(\Delta E>0\) 以一定概率跳过去,概率为 \(e^{- \frac{\Delta E}{T}}\)

    过程如下图:

题型:

  • A Star not a Tree?

    模拟退火裸题,也可以用三分套三分做

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <ctime>
    
    #define x first
    #define y second
    
    using namespace std;
    
    typedef pair<double, double> PDD;
    const int N = 110;
    
    int n;
    PDD q[N];
    double ans = 1e8;
    
    double rand(double l, double r)
    {
    	return (double)rand() / RAND_MAX * (r - l) + l;
    }
    
    double get_dist(PDD a, PDD b)
    {
    	double dx = a.x - b.x;
    	double dy = a.y - b.y;
    	return sqrt(dx * dx + dy * dy);
    }
    
    double calc(PDD p)
    {
    	double res = 0;
    	for (int i = 0; i < n; i ++ )
    		res += get_dist(p, q[i]);
    	ans = min(ans, res);
    	return res;
    }
    
    void simulate_anneal()
    {
    	PDD cur(rand(0, 10000), rand(0, 10000));
    	for (double t = 1e4; t > 1e-4; t *= 0.9)
    	{
    		PDD np(rand(cur.x - t, cur.x + t), rand(cur.y - t, cur.y + t));
    		double dt = calc(np) - calc(cur);
    		if (exp(-dt / t) > rand(0, 1)) cur = np;
    	}
    }
    
    int main()
    {
    	scanf("%d", &n);
    	for (int i = 0; i < n; i ++ ) scanf("%lf%lf", &q[i].x, &q[i].y);
    
    	for (int i = 0; i < 100; i ++ ) simulate_anneal();
    	printf("%.0lf\n", ans);
    
    	return 0;
    }
    

标签:rand,include,cur,int,double,知识,模拟退火,PDD
From: https://www.cnblogs.com/fanrunze/p/18582683

相关文章

  • 基于LangChain+ChatGLM 部署本地私有化知识库
    前言随着人工智能技术的不断发展,越来越多的企业和机构开始认识到知识库的重要性。知识库不仅能够集中管理大量的信息和数据,还能通过智能检索和推理功能,为用户提供准确、高效的知识服务。前排提示,文末有大模型AGI-CSDN独家资料包哦!LangChain与ChatGLM作为当前领先的AI......
  • VUE2基础知识
    目录一、基础语法和概念1.1.模板语法1.双花括号插值2.指令v-bindv-modelv-if,v-else-if、v-elsev-showv-forv-on3.修饰符         .lazy(用于v-model):        .trim(用于v-model):        .number(用于v-model):        .stop(用于v-on):......
  • 在常见的文本处理技术中,知识图谱(KNOWLEDGE GRAPH)到底是什么?用简单的例子来理解
    知识图谱(KnowledgeGraph) 历程发展知识图谱的历程发展,可以追溯到20世纪70年代诞生的专家系统。专家系统:一个有大量的专业知识和经验的程序系统,它会根据某领域一个或多个专家提供的知识和经验,进行推理和判断(比如,医学领域等等)。就是模拟人类专家的决策过程,来解决一些比......
  • 【知识】Prufer 编码
    Prüfer序列Prufer序列可以将一个带标号\(n\)个节点的树用\([1,n]\)中的\(n-2\)个整数表示,即\(n\)个点的完全图的生成树与长度为\(n-2\),值域为\([1,n]\)的数列构成的双射。Prufer序列可以方便地解决一类树相关的计数问题,比如凯莱定理:\(n^{n-2}\)个点的完全图......
  • 【知识】图论 朱刘算法梳理
    朱刘算法:树形图的定义:以某一个点为根的有向树,被称为树形图一个有向图,满足无环且每个点的入度为\(1\)(除了根节点),被称为树形图最小树形图:对于所有树形图中,找到一个总权值和最小的树形图,被称为最小树形图。最小树形图问题本质上其实就是有向图上的最小生成树问题。......
  • 网络基础知识:交换机和路由器的工作原理,零基础入门到精通,收藏这一篇就够了
    交换机和路由器是网络核心设备,分别工作在数据链路层(第2层)和网络层(第3层)。交换机通过MAC地址学习和转发数据帧,支持VLAN划分广播域;路由器使用IP地址和路由表选择最佳路径转发数据包。交换机适用于局域网内高速转发,路由器连接不同网络。交换机和路由器是网络中的关键设备,分别......
  • C语言循环与详解操作符 基础知识大汇总(下)(保驾护航大家的C语言)(保姆级超详细解说)(应对各
    hello大家好啊,这里是星空没有雨,今天你的城市下雨了吗,今天星宇给大家带来c语言环以及操作符详解,程让我们更多的新手伙伴们更好的入门   OK,now,let'sgo1.详解操作符/与%(1)/运算符/⽤来完成除法。除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数。......
  • 小知识点
    1.位运算乘除x=x*(2^n)可以转化成x<<nx=x/(2^n)可以转化成x>>n2.Forfor(registerinti(1);i<=n;i++)3.短函数前加inline4.判断奇偶if(a%2==0)可以转化成if((a&1)==0)5.取模用&x=667%4;可以转化成x=667&(4-1);x=667%32;......
  • Java基础知识-第4章-认识Java中的数组
    【导航】1、数组概述Java中的数组可以认为是一种容器,其可以同时存放多个数据值(元素)。Java语言中提供的数组是用来存储固定大小的同类型元素。数组的特点:数组是一种引用数据类型,但是数组元素类型不限。数组当中的多个数据类型必须统一数组的长度一旦确定,在程序运行......
  • CISSP错题或模糊知识(未整理)
    我超怕的-https://www.cnblogs.com/iAmSoScArEd/p/18579786具有公共IP地址的数据包通常会被允许进入网络,因此您不应创建规则来阻止它们。具有内部源地址的数据包不应来自网络外部,因此应阻止它们进入网络。具有外部源地址的数据包永远不会在内部网络上找到,因此应阻止它们离开......