C#,数值计算——基于模拟退火的极小化问题单纯形(下山)算法的计算方法与C#源程序

1 模拟退火

模拟退火算法其实是一个类似于仿生学的算法,模仿的就是物理退火的过程。
我们炼钢的时候,如果我们急速冷凝,这时候的状态是不稳定的,原子间杂乱无章的排序,能量很高。而如果我们让钢水慢慢冷凝,很缓慢的降温,那么这个时候的状态就是很稳定的,各个分子都趋向于自己能量最低的位置。而模拟退火算法,恰恰就是利用了物理退火这一过程的原理,求解一个优化目标(目标函数)的最小值。

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

2 模拟退火算法

模拟退火算法(Simulated Annealing,SA)最早由Metropolis等人于 1953 年提出。1983 年Kirkpatrick等人第一次使用模拟退火算法求解组合优化问题后,它就发表在了 Science 上。直到今天,它依然被广泛使用,这篇文章将详细介绍C#的代码实现。
 

3 单纯形法

单纯形法是针对求解线性规划问题的一个算法,这个名称里的'单纯形'是代数拓扑里的一个概念
实际问题当中变量x是多维的,约束条件也会比示例多的多,这就需要一个一劳永逸的算法能通过计算机来获得正解,单纯形法就是这样的一个算法。单纯形法最早由 George Dantzig于1947年提出,单纯形法对于求解线性规划问题是具有跨时代意义的,其实不仅仅是针对线性规划,对于非线性规划问题在求解的过程中也大量依赖单纯形法,George Dantzig本人也被称为'线性规划之父',他是好莱坞电影《心灵捕手》的原型。
 

4 C#源程序

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// 模拟退火下山单纯形极小化
    /// Downhill simplex minimization with simulated annealing
    /// </summary>
    public class Amebsa
    {
        public RealValueFun funk;

        public Ranq1 ran;
        private int mpts { get; set; }
        private int ndim { get; set; }
        private double[] pb { get; set; }
        private double[] y { get; set; }
        private double[,] p { get; set; }
        private double ftol { get; }
        private double yb { get; set; }
        private double tt { get; set; }

        public Amebsa(double[] point, double del, RealValueFun funkk, double ftoll)
        {
            this.funk = funkk;
            this.ran = new Ranq1(1234);
            this.ftol = ftoll;
            this.yb = double.MaxValue;
            this.ndim = point.Length;
            this.pb = new double[ndim];
            this.mpts = ndim + 1;
            this.y = new double[mpts];
            this.p = new double[mpts, ndim];
            for (int i = 0; i < mpts; i++)
            {
                for (int j = 0; j < ndim; j++)
                {
                    p[i, j] = point[j];
                }
                if (i != 0)
                {
                    p[i, i - 1] += del;
                }
            }
            inity();
        }

        public Amebsa(double[] point, double[] dels, RealValueFun funkk, double ftoll)
        {
            this.funk = funkk;
            this.ran = new Ranq1(1234);
            this.ftol = ftoll;
            this.yb = double.MaxValue;
            this.ndim = point.Length;
            this.pb = new double[ndim];
            this.mpts = ndim + 1;
            this.y = new double[mpts];
            this.p = new double[mpts, ndim];
            for (int i = 0; i < mpts; i++)
            {
                for (int j = 0; j < ndim; j++)
                {
                    p[i, j] = point[j];
                }
                if (i != 0)
                {
                    p[i, i - 1] += dels[i - 1];
                }
            }
            inity();
        }

        public Amebsa(double[,] pp, RealValueFun funkk, double ftoll)
        {
            this.funk = funkk;
            this.ran = new Ranq1(1234);
            this.ftol = ftoll;
            this.yb = double.MaxValue;
            this.ndim = pp.GetLength(1);
            this.pb = new double[ndim];
            this.mpts = pp.GetLength(0);
            this.y = new double[mpts];
            this.p = pp;

            inity();
        }

        public void inity()
        {
            double[] x = new double[ndim];
            for (int i = 0; i < mpts; i++)
            {
                for (int j = 0; j < ndim; j++)
                {
                    x[j] = p[i, j];
                }
                y[i] = funk.funk(x);
            }
        }

        public bool anneal(ref int iter, double temperature)
        {
            double[] psum = new double[ndim];
            tt = -temperature;
            get_psum(p, psum);
            for (; ; )
            {
                int ilo = 0;
                int ihi = 1;
                double ylo = y[0] + tt * Math.Log(ran.doub());
                double ynhi = ylo;
                double yhi = y[1] + tt * Math.Log(ran.doub());
                if (ylo > yhi)
                {
                    ihi = 0;
                    ilo = 1;
                    ynhi = yhi;
                    yhi = ylo;
                    ylo = ynhi;
                }
                for (int i = 3; i <= mpts; i++)
                {
                    double yt = y[i - 1] + tt * Math.Log(ran.doub());
                    if (yt <= ylo)
                    {
                        ilo = i - 1;
                        ylo = yt;
                    }
                    if (yt > yhi)
                    {
                        ynhi = yhi;
                        ihi = i - 1;
                        yhi = yt;
                    }
                    else if (yt > ynhi)
                    {
                        ynhi = yt;
                    }
                }
                double rtol = 2.0 * Math.Abs(yhi - ylo) / (Math.Abs(yhi) + Math.Abs(ylo));
                if (rtol < ftol || iter < 0)
                {
                    Globals.SWAP(ref y[0], ref y[ilo]);
                    for (int n = 0; n < ndim; n++)
                    {
                        Globals.SWAP(ref p[0, n], ref p[ilo, n]);
                    }
                    if (rtol < ftol)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                iter -= 2;
                double ytry = amotsa(p, y, psum, ihi, ref yhi, -1.0);
                if (ytry <= ylo)
                {
                    ytry = amotsa(p, y, psum, ihi, ref yhi, 2.0);
                }
                else if (ytry >= ynhi)
                {
                    double ysave = yhi;
                    ytry = amotsa(p, y, psum, ihi, ref yhi, 0.5);
                    if (ytry >= ysave)
                    {
                        for (int i = 0; i < mpts; i++)
                        {
                            if (i != ilo)
                            {
                                for (int j = 0; j < ndim; j++)
                                {
                                    psum[j] = 0.5 * (p[i, j] + p[ilo, j]);
                                    p[i, j] = psum[j];
                                }
                                y[i] = funk.funk(psum);
                            }
                        }
                        iter -= ndim;
                        get_psum(p, psum);
                    }
                }
                else
                {
                    ++iter;
                }
            }
        }

        public void get_psum(double[,] p, double[] psum)
        {
            for (int n = 0; n < ndim; n++)
            {
                double sum = 0.0;
                for (int m = 0; m < mpts; m++)
                {
                    sum += p[m, n];
                }
                psum[n] = sum;
            }
        }

        public double amotsa(double[,] p, double[] y, double[] psum, int ihi, ref double yhi, double fac)
        {
            double[] ptry = new double[ndim];
            double fac1 = (1.0 - fac) / ndim;
            double fac2 = fac1 - fac;
            for (int j = 0; j < ndim; j++)
            {
                ptry[j] = psum[j] * fac1 - p[ihi, j] * fac2;
            }
            double ytry = funk.funk(ptry);
            if (ytry <= yb)
            {
                for (int j = 0; j < ndim; j++)
                {
                    pb[j] = ptry[j];
                }
                yb = ytry;
            }
            double yflu = ytry - tt * Math.Log(ran.doub());
            if (yflu < yhi)
            {
                y[ihi] = ytry;
                yhi = yflu;
                for (int j = 0; j < ndim; j++)
                {
                    psum[j] += ptry[j] - p[ihi, j];
                    p[ihi, j] = ptry[j];
                }
            }
            return yflu;
        }
    }
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小研究 - 微服务系统服务依赖发现技术综述(一)

微服务架构得到了广泛的部署与应用, 提升了软件系统开发的效率, 降低了系统更新与维护的成本, 提高了系统的可扩展性. 但微服务变更频繁、异构融合等特点使得微服务故障频发、其故障传播快且影响大, 同时微服务间复杂的调用依赖关系或逻辑依赖关系又使得其故障难以被及时、准确…

pycharm中opencv库导入 cv2. 无函数提示跳出解决方法

pycharm中opencv库导入 cv2. 无函数提示跳出解决方法 1、找到当前解释器安装目录 例如&#xff1a; 2、进入D:\Python37\Lib\site-packages\cv2文件&#xff0c;进入cv2文件夹&#xff1a; 找到cv2.pyd, 把cv2.pyd复制一份&#xff0c;放到上层文件夹下&#xff0c;即site-p…

数据结构 | 二叉树的应用

目录 一、解析树 二、树的遍历 一、解析树 我们可以用解析树来表示现实世界中像句子或数学表达式这样的构造。 我们可以将((73)*(5-2))这样的数学表达式表示成解析树。这是完全括号表达式&#xff0c;乘法的优先级高于加法和减法&#xff0c;但因为有括号&#xff0c;所以在…

ffmpeg下载安装教程

ffmpeg官网下载地址https://ffmpeg.org/download.html 这里以windows为例,鼠标悬浮到windows图标上,再点击 Windows builds from gyan.dev 或者直接打开 https://www.gyan.dev/ffmpeg/builds/ 下载根据个人需要下载对应版本 解压下载的文件,并复制bin所在目录 新打开一个命令…

基于YOLOv7开发构建MSTAR雷达影像目标检测系统

MSTAR&#xff08;Moving and Stationary Target Acquisition and Recognition&#xff09;数据集是一个基于合成孔径雷达&#xff08;Synthetic Aperture Radar&#xff0c;SAR&#xff09;图像的目标检测和识别数据集。它是针对目标检测、机器学习和模式识别算法的研究和评估…

手把手写深度学习(20):搭建LLM大语言模型的敏感词过滤系统

前言:随着Llama 2、通义千问7B等越来越多的大语言模型开源,开发者们可以基于这些开源的模型搭建自己的对话系统、Agent等。但是因为我们的国情,需要开发者对这些模型进行一些特殊的“安全性”考虑,保证与用户的交互不会出现“有害信息”。这篇博客手把手教大家搭建一个大语…

【Vue3】动态组件

动态组件的基本使用 动态组件&#xff08;Dynamic Components&#xff09;是一种在 Vue 中根据条件或用户输入来动态渲染不同组件的技术。 在 Vue 中使用动态组件&#xff0c;可以使用 元素&#xff0c;并通过 is 特性绑定一个组件的名称或组件对象。通过在父组件中改变 is 特…

2023牛客暑期多校训练营4

Bobo String Construction 结论&#xff0c;字符串哈希 Election of the King 二分查找 Merge the squares! 递归模拟&#xff0c;辗转相除法 Quest-ce Que Cest? DP&#xff0c;前缀和优化 We are the Lights 思维&#xff0c;倒推 猜测是&#xff0c;把n个字符全填0或者1是最…

亿发江西中小型制造企业信息化建设解决方案,2023数字化转型升级

实体经济在经济中的重要性愈发凸显&#xff0c;江西省作为制造业强省&#xff0c;要实现制造业经济高质量发展&#xff0c;信息技术与制造业的深度汇合是不可或缺的关键路径。在这个制造业转型升级的浪潮中&#xff0c;中小企业成为了江西省制造业转型的焦点。让我们深入探讨一…

Redis 7.X Linux 环境安装

Redis 简介 作为一名开发人员&#xff0c;想必大家对Redis一定是耳熟能详&#xff0c;因此在此只做简单介绍。 Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value内存数据库&#xff0c;它提…

分布式 - 服务器Nginx:一小时入门系列之HTTP反向代理

文章目录 1. 正向代理和反向代理2. 配置代理服务3. proxy_pass 命令解析4. 设置代理请求headers 1. 正向代理和反向代理 正向代理是客户端通过代理服务器访问互联网资源的方式。在这种情况下&#xff0c;客户端向代理服务器发送请求&#xff0c;代理服务器再向互联网上的服务器…

抖音seo矩阵系统源代码开发搭建技术分享

抖音SEO矩阵系统是一个较为复杂的系统&#xff0c;其开发和搭建需要掌握一定的技术。以下是一些技术分享&#xff1a; 技术分享 抖音SEO矩阵系统的源代码可以使用JAVA、Python、PHP等多种语言进行开发。其中&#xff0c;JAVA语言的应用较为广泛&#xff0c;因为JAVA语言有良好…

软件架构师思维塑造

一、软件系统设计的六项原则 1、单一职责原则&#xff08;Single Responsibility Principle&#xff09; 2、开闭原则&#xff08;Open Closed Principle&#xff09; 3、里氏替换原则&#xff08;Liskov Substitution Principle&#xff09; 4、迪米特法则&#xff08;Law of …

无涯教程-Lua - nested语句函数

Lua编程语言允许在另一个循环中使用一个循环。以下部分显示了一些示例来说明这一概念。 nested loops - 语法 Lua中嵌套for循环语句的语法如下- for init,max/min value, increment dofor init,max/min value, incrementdostatement(s)endstatement(s) end Lua编程语言中的…

IMV3.0

经历了两个版本&#xff0c;基础内容在前面&#xff0c;可以使用之前的基础环境&#xff1a; v1&#xff1a; https://blog.csdn.net/wtt234/article/details/132139454 v2&#xff1a; https://blog.csdn.net/wtt234/article/details/132144907 一、代码组织结构 二、代码 2.…

下载网络文件到本地

文章目录 目录 前言 操作步骤 1.引入 2.读取出文件内容 3.筛选出URL 4.下载表情包 总结 前言 这里记录一次用代码下载网络文件的过程&#xff0c;以获取抖音表情包为例。 一、操作步骤 1.引入 首先抖音有网页版&#xff0c;用浏览器就可以观看&#xff0c;用户评论发布表情在…

Rookit系列一 【隐藏网络端口】【支持Win7 x32/x64 ~ Win10 x32/x64】

文章目录 Rookit系列一 【隐藏网络端口】【支持Win7 x32/x64 ~ Win10 x32/x64】前言探究隐藏网络端口netstat分析隐藏网络端口的原理关键数据结构隐藏网络端口源码 效果演示 Rookit系列一 【隐藏网络端口】【支持Win7 x32/x64 ~ Win10 x32/x64】 前言 Rookit是个老生常谈的话…

大学python题库及答案解析,大学python程序设计题库

本篇文章给大家谈谈大学python题库及答案解析&#xff0c;以及python期末编程题及答案&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 发表时间&#xff1a;2020-07-07 一、填空题&#xff08;15分&#xff09; 使用print()函数将多个字符串’How’、’are ’…

关于ETL的两种架构(ETL架构和ELT架构) qt

&#xfeff;ETL&#xff0c;是英文 Extract-Transform-Load 的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform&#xff09;、加载&#xff08;load&#xff09;至目的端的过程。ETL一词较常用在数据仓库&#xf…

Qt+C++实现灯带动画运动位置变换移动跑马灯图片轮播

程序示例精选 QtC实现灯带动画运动位置变换移动跑马灯图片轮播 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC实现灯带动画运动位置变换移动跑马灯图片轮播>>编写代码&…