此片文章主要参考CSDN博主里头的一篇文章, 将自己的理解写下来,以方便后期的查阅。

一、C++ 实现

1. 已知平面上若干点坐标(xi, yi), 求平面上一点p(x, y) , 到这些点的总距离最小。

思路: 取所有点的均值为目标点。计算全部点与目标点求差值的和,将目标点以一定系数朝着总和的方向移动,得到新的目标点。

 // 求最小距离
// 限制条件: 1 <= n <= 100, 0<= xi, yi <= 1e4
#include<iostream>
#include<cstdio>
#include<cdtdlib>
#include<cmatch> using namespace std; struct Pt{
double x, y;
}P[] double sqr(double x) {
return x*x
} // get distance between two point
double dist(Pt a, Pt b)
{
return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y));
} double get_sum(Pt p0, int n)
{
double ret = ;
for(int i = ; i < n; ++i)
ret += dist(p0, p[i]); int main
{
// 设置初始化点数据
// p[n] = { ... ,..., ....}
// 取所有点的平均位置,作为最近点的位置
double x0=, y0 =;
for(int i = ; i < n; ++i)
{
x0 += p[i].x;
y0 += p[i].y;
}
x0 /= n;
y0 /= n; double ans = get_sum((pt){x0, y0}, n); // 当前 目标值
double temp = le5; // 初始化温度, 根据需要设定 while(temp > 0.02) // 0.02 为温度的下限, 若温度为 temp 达到下限, 则停止搜索
{
double x = , y = ;
for(int i = ; i < n; ++i) { // 获取步长的规则根据要求设定
x += (p[i].x - x0) / dist((Pt){x0, y0}, p[i]);
y += (p[i].x - y0) / dist((Pt){x0, y0}, p[i]);
}
// 变化后,新的目标值
// 此处变化的系数应该是逐渐减小的, temp 逐渐减小,符合要求
double tmp = get_sum((Pt){x0 + x * temp, y0 + y * temp}, n); // 进行判断
if(temp < ans)
{
ans = temp;
x0 += x * temp;
y0 += y * temp;
}
// 退火算法的精髓 : 当不满足移动条件时, 也按照一定的概率进行移动
// 注意 : 移动的概率应该逐渐减小
// e n次幂, n 应该小于0
// 假设 random() 的作用 : 产生 0- 1 之间的随机数
else if(Math.exp((ans - temp) / temp) > random())
{
ans = temp;
x0 += x * temp;
y0 += y * temp;
}
temp *= 0.98; // 0.98 为降火速率(范围为0~1, 数字越大,得到的全局最优解概率越高,运行时间越长)
}
printf("The minimal dist is : ");
printf("%.0f\n", ans);
}

二、C# 实现代码

已知空间上若干点(xi, yi, zi), 求空间上包含这些点的最小球半径 R, 以及球心坐标。

思路:球心与这些点的最大距离为半径, 球心与最大距离点生成向量,将球心朝着该向量方向移动若干距离,再计算半径的变化。

 namespace Test_BST
{
public class Program
{
static void Main(string[] args)
{
// 初始化输入点
List<Point> originPoints = new List<Point>() { ............};
double radius = AnnealAlgorithm(originPoints);
} private struct Point
{
public double x;
public double y;
public double z;
} // square of a number
private static double Sqr(double x) { return x * x; } // 两点之间的距离
private static double Dist(Point A, Point B)
{
return Math.Sqrt(Sqr(A.x - B.x) + Sqr(A.y - B.y) + Sqr(A.z - B.z));
} // 求最大半径
private static double GetMaxRadius(Point p0, List<Point> pts)
{
double maxRadius = ;
foreach (var point in pts)
{
double radius = Dist(p0, point);
maxRadius = radius > maxRadius ? radius : maxRadius;
} return maxRadius;
} private static double AnnealAlgorithm(List<Point> originPts)
{
Point center = new Point();
center.x = ;
center.y = ;
center.z = ; // 将初始化中心点设置为所有点的代数平均位置
foreach (var pt in originPts)
{
center.x += pt.x;
center.y += pt.y;
center.z += pt.z;
}
center.x /= originPts.Count;
center.y /= originPts.Count;
center.z /= originPts.Count; double temp = 1e3; // 初始温度
double coolingFactor = 0.98; // 降温因子
double ans = GetMaxRadius(center, originPts); // 当前最小半径
var random = new Random(); while (temp > 1e-)
{
Point newCenter = new Point();
double max_r = ;
// 找到与当前中心点距离最远的点,将中心向着改点移动
for (int i = ; i < originPts.Count; i++)
{
double r = Dist(center, originPts[i]);
if (r > max_r)
{
newCenter.x = (originPts[i].x - center.x) / r;
newCenter.y = (originPts[i].y - center.y) / r;
newCenter.z = (originPts[i].z - center.z) / r;
max_r = r;
}
}
newCenter.x = center.x + newCenter.x * temp;
newCenter.y = center.y + newCenter.y * temp;
newCenter.z = center.z + newCenter.z * temp; // 移动后的最大半径
double tmp = GetMaxRadius(newCenter, originPts); if (tmp < ans)
{
center.x += newCenter.x * temp;
center.y += newCenter.y * temp;
center.z += newCenter.z * temp;
}
else if (Math.Exp((ans -tmp)/temp) > random.NextDouble() )
{
center.x += newCenter.x * temp;
center.y += newCenter.y * temp;
center.z += newCenter.z * temp;
} temp *= coolingFactor;
}
double miniRadius = GetMaxRadius(center, originPts);
Console.WriteLine("the cooridnate of the center is {0}, the radius value is {1}", center, miniRadius)); return miniRadius;
}
}
}

参考: http://blog.csdn.net/whai362/article/details/46980471#comments

模拟退火算法实例(c++ 与 c# 实现)的更多相关文章

  1. 算法实例-C#-快速排序-QuickSort

    算法实例 ##排序算法Sort## ### 快速排序QuickSort ### bing搜索结果 http://www.bing.com/knows/search?q=%E5%BF%AB%E9%80% ...

  2. 模拟退火算法-[HDU1109]

    模拟退火算法的原理模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到 ...

  3. 【高级算法】模拟退火算法解决3SAT问题(C++实现)

    转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46453761 ---------------------------------- ...

  4. 模拟退火算法(SA)求解TSP 问题(C语言实现)

    这篇文章是之前写的智能算法(遗传算法(GA).粒子群算法(PSO))的补充.其实代码我老早之前就写完了,今天恰好重新翻到了,就拿出来给大家分享一下,也当是回顾与总结了. 首先介绍一下模拟退火算法(SA ...

  5. 原创:工作指派问题解决方案---模拟退火算法C实现

    本文忽略了对于模拟退火的算法的理论讲解,读者可参考相关的博文或者其他相关资料,本文着重于算法的实现: /************************************************ ...

  6. BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】

    3680: 吊打XXX Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 3192  Solved: 1198[Sub ...

  7. Adaboost 算法实例解析

    Adaboost 算法实例解析 1 Adaboost的原理 1.1 Adaboost基本介绍 AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由 ...

  8. OI骗分神器——模拟退火算法

    前言&&为什么要学模拟退火 最近一下子学了一大堆省选算法,所以搞一个愉快一点的东西来让娱乐一下 其实是为了骗到更多的分,然后证明自己的RP. 说实话模拟退火是一个集物理与IT多方面知识 ...

  9. 模拟退火算法 R语言

    0 引言 模拟退火算法是用来解决TSP问题被提出的,用于组合优化. 1 原理 一种通用的概率算法,用来在一个打的搜索空间内寻找命题的最优解.它的原理就是通过迭代更新当前值来得到最优解.模拟退火通常使用 ...

随机推荐

  1. 数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接

    前言 DataGrip:Jet Brains出品的一款数据库管理工具(没错,是Jet Brains出品,必属精品).DataGrip整合集成了当前主流数据库(如:SQL Server, MySQL, ...

  2. 在Docker中运行asp.net core 跨平台应用程序

    概述 Docker已经热了有一两年了,而且我相信这不是一个昙花一现的技术,而是一个将深远影响我们日后开发和部署.运营应用系统的一种创新(很多人将其作为devops的一种非常重要的基石).学习docke ...

  3. 知乎APP---案例分析

    产品: 这次我选择用来做案例分析的是--知乎. 知乎可以说是中文互联网最大的知识社交平台,拥有认真.专业和友善的独特气氛,分享用户间彼此的专业知识.经验和见解.因而在日常生活中,我用知乎搜索答案的概率 ...

  4. Asynchronous vs synchronous client applications(MQTT)

    来自我的CSDN博客   想查看英文原文的请点击原文网址.在上两篇翻译中,Homejim我给大家分别翻译了同步客户端应用程序和异步客户端应用程序.本人对这两个的区别也有困惑,因此将paho下的这个比较 ...

  5. 青否云 - 小程序待办事项vue开源系统

    青否云最新开源系统:小程序待办事项 vue-demo 青否云 vue demo 下载地址:https://github.com/qingful/vue-demo 官网 http://cloud.qin ...

  6. 这么说吧,java线程池的实现原理其实很简单

    好处 : 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配.调优和监控,有以下好处: 1.降低资源消耗: 2.提高响应速度: 3.提高线 ...

  7. 自学Zabbix9.3 zabbix客户端自动注册

    自学Zabbix9.3 zabbix客户端自动注册 1. 概述 网络自动发现配置,只要就是zabbix server去扫描一个网段,把在线的主机添加到Host列表中.但是Active agent是主动 ...

  8. JavaScript中DOM节点层次Text类型

    文本节点 标签之间只要有一点内容都会有文本节点,包括空格 创建文本节点document.createTextNode() 可以使用 document.createTextNode 创建新文本节点 == ...

  9. 【CSS3】内联、内部、外部样式,样式优先级、层叠、继承

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. ArcGIS API for JavaScript 4.2学习笔记[26] 缓冲区分析【基于geometryEngine工具类】

    要说GIS空间分析最经典的例子,就是缓冲区分析了. 本例使用geometryEngine来绘制缓冲区环.因为官方给的例子有3D和2D场景,所以就会显得比较复杂. 当鼠标在视图上点击时,就会生成一个缓冲 ...