ABAP算法 模拟退火

模拟退火算法

        算法原理及概念本文仅结合实现过程做简述

        模拟退火算法是一种解决优化问题的算法。通过模拟固体退火过程中的原子热运动来寻找全局最优解。在求解复杂问题时,模拟退火算法可以跳出局部最优解获取全局最优解。

        模拟退火算法包含退火过程和Metropolis算法两个部分,体现在外循环和内循环中,外循环就是退火过程,将固体从较高的温度按照降温系数k使温度按照一定的比例下降,当达到终止温度tn时,退火过程结束。内循环为在固定温度下,不断迭代寻求当前温度下能量的最低值,Metropolis 算法可以使得结果跳出局部最优值。

模拟退火基本参数:

        T:初始温度,较大值

        K:降温系数

        TN:终止温度

        L:内循环迭代次数

概述图

        算法求解过程中主要的两个重要数据,扰动量的多少以及新解接受概率,由于这两个参数依托于实际计算场景,因此使用两个参数控制

        FLOAT:用来控制扰动量的范围,最大为1

        R:新解保留概率,R值越大,新解保留概率越大,主要目的是平衡能量差过大或过小导致的概率失衡

处理方法及属性

代码地址:https://download.csdn.net/download/xiefireworks/88576481

示例

Demo代码 
CLASS lcl_obj DEFINITION FINAL  .PUBLIC SECTION.INTERFACES zif_annealing_c .PROTECTED SECTION.PRIVATE SECTION.
ENDCLASS.CLASS lcl_obj IMPLEMENTATION.METHOD zif_annealing_c~check_valid.DATA: lv_sum TYPE i.ENDMETHOD.METHOD zif_annealing_c~calcu_target_value.DATA: lv_sum TYPE i.DATA: lv_x1 TYPE ftvv_part_default_probability.DATA: lv_x2 TYPE ftvv_part_default_probability.LOOP AT units INTO DATA(ls_unit).CASE ls_unit-name.WHEN 'X1'.lv_x1 = ls_unit-value / 10000 - 5.lv_sum = lv_sum + 20 * ls_unit-value.WHEN 'X2'.lv_x2 = ls_unit-value / 10000 - 5.lv_sum = lv_sum + 30 * ls_unit-value.WHEN 'X3'.lv_sum = lv_sum + 50 * ls_unit-value.WHEN OTHERS.ENDCASE.ENDLOOP.*    target_value = 4000 - lv_sum.target_value = 4 * lv_x1 * lv_x1 - 21 / 10 * ipow( base = lv_x1 exp = 4 ) + ipow( base = lv_x1 exp = 6 ) / 3+ lv_x1 * lv_x2 - 4 * ipow( base = lv_x2 exp = 2 ) + 4 * ipow( base = lv_x2 exp = 4 ).ENDMETHOD.ENDCLASS.DATA: lo_g    TYPE REF TO zcl_annealing,lo_gc   TYPE REF TO lcl_obj,lt_recs TYPE zcl_annealing=>tt_allgroups.START-OF-SELECTION.CREATE OBJECT lo_g TYPE zcl_annealing.CREATE OBJECT lo_gc.lo_g->init( EXPORTING iv_k          = '0.998'iv_l          = '1000'iv_t          = '1000'iv_tn         = '10'iv_random_up  = '100'iv_r          = '0.00005'iv_float      = '0.2'io_annealing  = lo_gc).lo_g->add_var( name = 'X1' low = 0 high = 100000 ).lo_g->add_var( name = 'X2' low = 0 high = 100000 ).DATA(lt_unit) = lo_g->get_result( ).lo_g->get_record( IMPORTING et_rec = lt_recs ).WRITE:/ '最优解'.LOOP AT lt_unit INTO DATA(ls_unit).DATA value TYPE ftvv_part_default_probability.value = ls_unit-value / 10000 - '5.0000'.WRITE:/ ls_unit-name, ':' ,value.ENDLOOP.WRITE:/ '迭代过程'.SORT lt_recs BY target DESCENDING t.LOOP AT lt_recs INTO DATA(ls_rec).WRITE:/ '温度:',ls_rec-t,'  目标值:' ,ls_rec-target, '  值:'.LOOP AT ls_rec-units INTO ls_unit.WRITE:ls_unit-name, '-' ,ls_unit-value , ';'.ENDLOOP.ENDLOOP.
运行结果

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

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

相关文章

舞蹈店管理系统服务预约会员小程序效果如何

舞蹈的作用很广,也有大量求学者,每个城市也有大小各异的舞蹈品牌店,他们承接商演、也会教学员、宣传拓展生意等,因此近些年来,随着互联网深入及短视频,舞蹈业市场规模也在增加。 而在门店经营中&#xff0…

Java中关于ArrayList集合的练习题

目录 题目内容​编辑 完整源码 题目内容 根据下图所示数据,定义学生类Student,设置对应的字段并进行封装在Test中,定义ArrayList集合 ,将上述学生对象实例化,并放入集合,定义方法t1,参数为学生类集合&am…

js数组map()的用法

JavaScript Array map() 方法 先说说这个方法浏览器的支持: 支持五大主流的浏览器, 特别注意:IE 9 以下的浏览器不支持,只支持IE 9以上的版本的浏览器 特别注意:IE 9 以下的浏览器不支持,只支持IE 9以上的…

从零开始的c语言日记day37——数组指针练习

一、 取地址数组储存在了*p里,里面储存的是整个数组的地址但本质也是第一个元素的地址解引用后1为4个字节所以就可以打印数组了。但一般不用这种方法 这样更方便一些 打印多维数组 如果不用这样传参,用指针传参怎么做呢? Main里函数的arr表示…

QT基础实践之简易计算器

文章目录 简易计算器源码分享演示图第一步 界面设计第二步 设置槽第三步 计算功能实现 简易计算器 源码分享 链接:https://pan.baidu.com/s/1Jn5fJLYOZUq77eNJ916Kig 提取码:qwer 演示图 第一步 界面设计 这里直接用了ui界面,如果想要自己…

TiDB 7.x 源码编译之 TiDB Server 篇,及新特性详解

本文将介绍如何编译 TiDB Server 源码。以及阐释 TiDB Server 7.x 的部分新特性。 TiDB v7.5.0 LTS 计划于 2023 年 11 月正式 Release,目前代码虽未冻结,但已经可以看到 Alpha 版本的 Code 了,本文代码将以 v7.5.0-alpha 为基准。 TiDB Se…

filebeat 日志收集工具

elk:filebeat日志收集工具和logstash相同。 filebeat是一个轻量级的日志收集工具,所使用的系统资源比logstash部署和启动时使用的资源要小的多。 filebeat可以运行在非Java环境。他可以代理logtash在非java环境上收集日志。 filebeat无法实现数据的过…

设计师福利!2024在线图标设计网站推荐,不容错过的宝藏!

在当今竞争激烈的商业环境中,公司或个人品牌的视觉识别元素已经成为区分你和竞争对手的关键因素之一。一个独特而引人注目的标志可以深深扎根于人们的心中,并在消费者心中建立一个强烈的品牌印象。如果你正在寻找合适的工具来创建或改进你的标志&#xf…

WIFI HaLow技术引领智能互联,打破通信限制

在过去十年里,WIFI技术已在家庭和企业中建立起了庞大的网络,连接了数十亿智能互联设备,促进了信息的迅速传递。然而,当前的WIFI标准存在一些挑战,包括协议范围的限制和整体功能的受限,导致在较远距离进行通…

02-鸿蒙学习之4.0todoList练习

02-鸿蒙学习之4.0todoList练习 代码 /*** 1:组件必须使用Component装饰* 2.Entry 装饰哪个组件,哪个组件就呈现在页面上* 3.被Entry 装饰的入口组件。build()必须有且仅有一个根 ** 容器 ** 组件* 其他的自定义组件,build() 中…

C++学习——类和对象(上)

C学习——类和对象 一、面向对象和面向过程的初步认识二、什么是类 一、面向对象和面向过程的初步认识 我们之前学习了C语言,我们知道 ① C语言:C语言是一门面向过程的语言,关注的是过程,分析出求解问题的步骤,通过函…

Anakki个人网站持续更新中

Anakki-World github: GitHub - Anyuei/anakki 欢迎注册,成为我的盆友

Android Bitmap保存成至手机图片文件,Kotlin

Android Bitmap保存成至手机图片文件,Kotlin fun saveBitmap(name: String?, bm: Bitmap) {val savePath Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString()if (!Files.exists(Paths.get(savePath))) {Log.d("保存文…

用通俗的方式讲解Transformer:从Word2Vec、Seq2Seq逐步理解到GPT、BERT

直到今天早上,刷到CSDN一篇讲BERT的文章,号称一文读懂,我读下来之后,假定我是初学者,读不懂。 关于BERT的笔记,其实一两年前就想写了,迟迟没动笔的原因是国内外已经有很多不错的资料&#xff0…

Appium自动化如果出现报错怎么办?这么做确实解决问题

解决通过appium的inspector功能无法启动app的原因 在打开appium-desktop程序,点击inspector功能,填写app的配置信息,启动服务提示如下: 报错信息: An unknown server-side error occurred while processing the com…

【ShardingSphere专题】SpringBoot整合ShardingSphere(一、数据分片入门及实验)

目录 前言阅读对象笔记正文一、ShardingSphere介绍1.1 ShardingSphere-JDBC:代码级别1.2 ShardingSphere-Proxy:应用级别1.3 横向对比图 二、ShardingSphere之——数据分片2.1 基本介绍2.2 分片的形式2.2.1 垂直分片2.2.2 水平分片 2.3 数据分片核心概念…

数据库应用:MongoDB 库与集合管理

目录 一、理论 1.MongoDB用户管理 2.MogoDB库管理 3.MogoDB集合管理 二、实验 1.MongoDB用户管理 2.MogoDB库管理 3.MogoDB集合管理 三、问题 1.不显示新创建的数据库 2.插入数据报错 3.删除指定数据库报错 一、理论 1.MongoDB用户管理 (1) 内置角色 数据库用户…

11.28 知识回顾(Web框架、路由控制、视图层)

一、 web 框架 1.1 web框架是什么? 别人帮咱们写了一些基础代码------》我们只需要在固定的位置写固定的代码--》就能实现一个web应用 Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多…

2020年6月9日 Go生态洞察:VS Code Go扩展加入Go项目

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

unity学习笔记10

一、生命周期函数 1.Awake() 调用时间:对象被激活或创建时。 用途:通常用于初始化对象的状态,获取组件引用或执行其他在脚本生命周期早期需要完成的任务。 2.OnEnable(): 调用时间:对象激活时,包括对象被创建和Se…