当前位置: 首页 > article >正文

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.kler.cn/a/148712.html

相关文章:

  • MDK 5 各个历史版本下载地址
  • 【postman】怎么通过curl看请求报什么错
  • 用枚举算法解决LeetCode第3348题最小可整除数位乘积II
  • 【vue3中el-table表格高度自适应】
  • 基于Python 和 pyecharts 制作招聘数据可视化分析大屏
  • 家政服务小程序,家政行业数字化发展下的优势
  • c语言 / 指针错误的几种情况
  • 从 0 到 1 开发一个 node 命令行工具
  • 【Linux驱动开发】环境搭建Linux驱动开发环境
  • EDA实验-----正弦信号发生器的设计(Quartus II )
  • asp.net core HttpContextAccessor类
  • springBoot的实现原理;SpringBoot是什么;使用SpringBoot的核心功能;springBoot核心注解以及核心配置文件
  • qt QString字符串常用转换
  • Vue3指令:搜索框输入防抖实现(附源码)
  • 单片机复位电路
  • 【华为OD题库-036】跳格子2-java
  • springBoot设置多数据源
  • uniapp地图基本使用及解决添加markers不生效问题?
  • Linux shell编程学习笔记31:alias 和 unalias 操作 命令别名
  • 力扣 39. 组合总和 递归解法
  • Linux处理系统常见命令
  • [个人笔记] vCenter6.7使用自建SSL证书
  • UE5 范围内随机生成
  • 1. TiDB-Operator 备份到 Minio
  • RK3566RK3568 安卓11 在framework层进行串口通信
  • 【LeetCode】70. 爬楼梯