ABAP 遗传算法求解

server/2024/10/11 11:20:45/

        本文无文本解析,结尾处有简单装箱问题的示例,该算法收敛结果较慢,仅供ABAP爱好者参考,实践,实际应用建议使用线性规划。可直接复制后在系统中使用。

对象自定义逻辑版本-截图

对象自定义逻辑版本-对象描述
INIT    Instance Method    Public                                       初始化 
ADD_VAR    Instance Method    Public                                       添加变量
GET_RESULT    Instance Method    Public                                       获取最佳结果 
GET_RECORD    Instance Method    Public                                       获取过程记录
CALCU_FITNESS    Instance Method    Protected                                       适应度计算 
ELIMINATE    Instance Method    Protected                                       淘汰个体
GEN_INI_ETHNICGROUPS    Instance Method    Private                                       生成初始化族群 
CALCULAT_RATE    Instance Method    Private                                       计算概率
UNIT_VAR    Instance Method    Private                                       变异
UNIT_CROSS    Instance Method    Private                                       交叉
RANDOW    Instance Method    Private                                       随机数 
CHECK_GEN_VALID    Instance Method    Private                                       检查是否满足条件 
GEN_UNIT    Instance Method    Private                                       生成单个染色体 
ITERATION    Instance Method    Private                                       迭代繁衍群体VARIATION    Instance Attribute    Protected    Type    FTVV_PART_DEFAULT_PROBABILITY    变异率 
CROSS    Instance Attribute    Protected    Type    FTVV_PART_DEFAULT_PROBABILITY    交叉率 
M    Instance Attribute    Protected    Type    INT4    种群大小
T    Instance Attribute    Protected    Type    INT4    最大迭代次数 
GO_GENTIC_CUS    Instance Attribute    Protected    Type Ref To    ZIF_GENTIC_CUS    Genetic CUS
VARS    Instance Attribute    Private    Type    TT_VAR    涉及变量
ALLGROUPS    Instance Attribute    Private    Type    TT_ALLGROUPS    迭代记录
ETHNICGROUPS    Instance Attribute    Private    Type    TT_ETHNICGROUPS    种群
CURR_T    Instance Attribute    Private    Type    INT4    当前迭代代数
RANDOM_UP    Instance Attribute    Private    Type    I    随机数最大尝试次数 
INDEX    Instance Attribute    Private    Type    INT4    个体编号
对象自定义逻辑版本-类源代码
class ZCL_GENETIC definitionpubliccreate public .public section.types:BEGIN OF ty_allgroups,t       TYPE i,index   TYPE i,units   TYPE chip_property_tab,fitness TYPE ftvv_part_default_probability,END OF ty_allgroups .types:tt_allgroups TYPE TABLE OF ty_allgroups .methods INITimporting!IV_VARIATION type FTVV_PART_DEFAULT_PROBABILITY default '0.05'!IV_CROSS type FTVV_PART_DEFAULT_PROBABILITY default '0.8'!IV_M type INT4 default 50!IV_T type INT4 default 50!IV_RANDOM_UP type I default 100!IO_GENETIC_CUS type ref to ZIF_GENTIC_CUS .methods ADD_VARimporting!NAME type STRING!LOW type I!HIGH type I .methods GET_RESULTreturningvalue(RT_UNITS) type CHIP_PROPERTY_TAB .methods GET_RECORDexportingvalue(ET_REC) type ZCL_GENETIC_BASE=>TT_ALLGROUPS .
protected section.types:BEGIN OF ty_var,name TYPE string,low  TYPE i,high TYPE i,END OF ty_var .types:tt_var TYPE TABLE OF ty_var .types:BEGIN OF ty_ethnicgroups,index   TYPE i,units   TYPE chip_property_tab,fitness TYPE ftvv_part_default_probability,END OF ty_ethnicgroups .types:tt_ethnicgroups TYPE TABLE OF ty_ethnicgroups .data VARIATION type FTVV_PART_DEFAULT_PROBABILITY . " 变异概率data CROSS type FTVV_PART_DEFAULT_PROBABILITY . " 交叉概率data M type INT4 . " 初始种群大小data T type INT4 . " 最大迭代次数data GO_GENTIC_CUS type ref to ZIF_GENTIC_CUS .methods CALCU_FITNESSimportingvalue(UNITS) type CHIP_PROPERTY_TABreturningvalue(FITNESS) type FTVV_PART_DEFAULT_PROBABILITY .methods ELIMINATE .
private section.data VARS type TT_VAR ." 染色体data ALLGROUPS type TT_ALLGROUPS ." 所有迭代记录data ETHNICGROUPS type TT_ETHNICGROUPS ."种群data CURR_T type INT4 ." 当前迭代次数data RANDOM_UP type I ." 随机数重试最大次数data INDEX type INT4 . " 个体IDmethods GEN_INI_ETHNICGROUPS .methods CALCULAT_RATEreturningvalue(RATE) type PAPLI .methods UNIT_VARchanging!UNITS type CHIP_PROPERTY_TAB .methods UNIT_CROSSimporting!UNITS_FA type CHIP_PROPERTY_TAB!UNITS_MO type CHIP_PROPERTY_TABreturningvalue(UNITS) type CHIP_PROPERTY_TAB .methods RANDOWimporting!LOW type I!HIGH type Ireturningvalue(VALUE) type I .methods CHECK_GEN_VALIDimporting!UNITS type CHIP_PROPERTY_TABreturningvalue(RV_BOOL) type CHAR1 .methods GEN_UNITreturningvalue(UNITS) type CHIP_PROPERTY_TAB .methods ITERATION .
ENDCLASS.CLASS ZCL_GENETIC IMPLEMENTATION.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GENETIC->ADD_VAR
* +-------------------------------------------------------------------------------------------------+
* | [--->] NAME                           TYPE        STRING
* | [--->] LOW                            TYPE        I
* | [--->] HIGH                           TYPE        I
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD ADD_VAR.APPEND VALUE #( name = to_upper( name ) low = low high = high ) TO vars.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_GENETIC->CALCULAT_RATE
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RATE                           TYPE        PAPLI
* +--------------------------------------------------------------------------------------</SIGNATURE>method CALCULAT_RATE.rate = randow( low = 1 high = 1000 ) / 1000.endmethod.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Protected Method ZCL_GENETIC->CALCU_FITNESS
* +-------------------------------------------------------------------------------------------------+
* | [--->] UNITS                          TYPE        CHIP_PROPERTY_TAB
* | [<-()] FITNESS                        TYPE        FTVV_PART_DEFAULT_PROBABILITY
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD CALCU_FITNESS.go_gentic_cus->calcu_fitness( EXPORTING units = units CHANGING fitness = fitness ).ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_GENETIC->CHECK_GEN_VALID
* +-------------------------------------------------------------------------------------------------+
* | [--->] UNITS                          TYPE        CHIP_PROPERTY_TAB
* | [<-()] RV_BOOL                        TYPE        CHAR1
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD check_gen_valid.rv_bool = abap_true.go_gentic_cus->check_gen_valid( EXPORTING units = units CHANGING cv_bool = rv_bool ).ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Protected Method ZCL_GENETIC->ELIMINATE
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD ELIMINATE.DATA: lv_count TYPE i,lv_o     TYPE p LENGTH 15,lv_rate  TYPE ftvv_part_default_probability.DATA: lt_ethnicgroups LIKE ethnicgroups,ls_ethnicgroups LIKE LINE OF ethnicgroups.DO random_up TIMES.lt_ethnicgroups = ethnicgroups.DESCRIBE TABLE lt_ethnicgroups LINES lv_count.IF ( lv_count - m ) / m <= 1 / 10.EXIT.ENDIF.lv_o = lv_count * lv_count + lv_count.SORT lt_ethnicgroups BY fitness DESCENDING .LOOP AT lt_ethnicgroups INTO ls_ethnicgroups.lv_rate = sy-tabix * sy-tabix / lv_o.IF lv_rate < ( 1 / 200 ).lv_rate = ( 1 / 200 ).ENDIF.IF calculat_rate( ) <= lv_rate.DELETE ethnicgroups WHERE index = ls_ethnicgroups-index.ENDIF.ENDLOOP.ENDDO.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_GENETIC->GEN_INI_ETHNICGROUPS
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD GEN_INI_ETHNICGROUPS.DATA: ls_ethnicgroup LIKE LINE OF ethnicgroups.DO m * 2 TIMES.ls_ethnicgroup-units = gen_unit( ).IF ls_ethnicgroup-units IS NOT INITIAL.ls_ethnicgroup-index = index.index = index + 1.APPEND ls_ethnicgroup TO ethnicgroups.ENDIF.IF lines( ethnicgroups ) >= m.EXIT.ENDIF.ENDDO.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_GENETIC->GEN_UNIT
* +-------------------------------------------------------------------------------------------------+
* | [<-()] UNITS                          TYPE        CHIP_PROPERTY_TAB
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD GEN_UNIT.DATA: ls_unit LIKE LINE OF units,lt_unit LIKE  units,ls_var  LIKE LINE OF vars.DO random_up TIMES.CLEAR lt_unit.LOOP AT vars INTO ls_var.ls_unit-name  = ls_var-name.ls_unit-value = randow( low = ls_var-low high = ls_var-high ).APPEND ls_unit TO lt_unit.ENDLOOP.IF check_gen_valid( lt_unit ).EXIT.ENDIF.CLEAR lt_unit.ENDDO.units = lt_unit.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GENETIC->GET_RECORD
* +-------------------------------------------------------------------------------------------------+
* | [<---] ET_REC                         TYPE        ZCL_GENETIC_BASE=>TT_ALLGROUPS
* +--------------------------------------------------------------------------------------</SIGNATURE>method GET_RECORD.et_rec = allgroups.endmethod.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GENETIC->GET_RESULT
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RT_UNITS                       TYPE        CHIP_PROPERTY_TAB
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD GET_RESULT.DATA: lt_ethnicgroups LIKE ethnicgroups,lv_index        TYPE i.gen_ini_ethnicgroups( ).DO t TIMES.iteration( ).eliminate( )." 判定是否收敛lt_ethnicgroups = ethnicgroups.SORT lt_ethnicgroups BY fitness DESCENDING.lv_index = lines( lt_ethnicgroups ) / 2.IF lv_index >= 1 AND lt_ethnicgroups[ 1 ]-fitness = lt_ethnicgroups[ lv_index ]-fitness.EXIT.ENDIF.IF curr_t > t.EXIT.ENDIF.ENDDO.IF ethnicgroups IS NOT INITIAL.SORT ethnicgroups BY fitness DESCENDING.rt_units = ethnicgroups[ 1 ]-units.ENDIF.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GENETIC->INIT
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_VARIATION                   TYPE        FTVV_PART_DEFAULT_PROBABILITY (default ='0.05')
* | [--->] IV_CROSS                       TYPE        FTVV_PART_DEFAULT_PROBABILITY (default ='0.8')
* | [--->] IV_M                           TYPE        INT4 (default =50)
* | [--->] IV_T                           TYPE        INT4 (default =50)
* | [--->] IV_RANDOM_UP                   TYPE        I (default =100)
* | [--->] IO_GENETIC_CUS                 TYPE REF TO ZIF_GENTIC_CUS
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD INIT.
*----------------------------------------------------------------------*
* variation: 变异率 0.01-0.1之间,变异率高可能导致收敛过快
* cross: 交叉率 0.6-0.9之间,交叉率越高范围越广
* m: 种群大小,20-200之间
* t: 最大迭代次数
* random_up: 随机时的重试上限
*----------------------------------------------------------------------*variation = iv_variation .cross     = iv_cross     .m         = iv_m         .t         = iv_t         .random_up = iv_random_up .go_gentic_cus = io_genetic_cus.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_GENETIC->ITERATION
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD ITERATION.DATA: lv_fitnessall TYPE p LENGTH 15 DECIMALS 5,lv_rate       TYPE umls1.DATA: ls_ethnicgroups LIKE LINE OF ethnicgroups,lt_enthicgroups LIKE ethnicgroups,ls_allgroups    LIKE LINE OF allgroups,lt_allgroups    LIKE allgroups,lt_units_ch     TYPE chip_property_tab,lt_units_fa     TYPE chip_property_tab,lt_units_mo     TYPE chip_property_tab.LOOP AT ethnicgroups INTO ls_ethnicgroups.IF ls_ethnicgroups-fitness IS INITIAL.ls_ethnicgroups-fitness = calcu_fitness( ls_ethnicgroups-units ).MODIFY ethnicgroups FROM ls_ethnicgroups.ENDIF.lv_fitnessall =  lv_fitnessall + ls_ethnicgroups-fitness.ENDLOOP." 交叉DO m * 2 TIMES.LOOP AT ethnicgroups INTO ls_ethnicgroups.lv_rate = ls_ethnicgroups-fitness / lv_fitnessall * cross.IF lv_rate = 0.lv_rate = '0.01'.ENDIF.IF calculat_rate( ) <= lv_rate.IF lt_units_fa IS INITIAL.lt_units_fa = ls_ethnicgroups-units.ELSE.lt_units_mo = ls_ethnicgroups-units.ENDIF.ENDIF.IF lt_units_fa IS NOT INITIAL AND lt_units_mo IS NOT INITIAL AND lt_units_mo <> lt_units_fa.EXIT.ENDIF.ENDLOOP.IF lt_units_fa IS NOT INITIAL AND lt_units_mo IS NOT INITIAL.lt_units_ch = unit_cross( units_fa = lt_units_fa units_mo = lt_units_mo ).IF lt_units_ch IS NOT INITIAL.CLEAR ls_ethnicgroups.ls_ethnicgroups-units = lt_units_ch.ls_ethnicgroups-index = index.index = index + 1.APPEND ls_ethnicgroups TO lt_enthicgroups.ENDIF.CLEAR:lt_units_fa,lt_units_mo,lt_units_ch.ENDIF.ENDDO." 变异LOOP AT ethnicgroups INTO ls_ethnicgroups.IF calculat_rate( ) <= variation.unit_var( CHANGING units = ls_ethnicgroups-units ).ls_ethnicgroups-fitness = calcu_fitness( ls_ethnicgroups-units ).ENDIF.MODIFY ethnicgroups FROM ls_ethnicgroups.ENDLOOP.LOOP AT lt_enthicgroups INTO ls_ethnicgroups.IF calculat_rate( ) <= variation.unit_var( CHANGING units = ls_ethnicgroups-units ).ENDIF.ls_ethnicgroups-fitness = calcu_fitness( ls_ethnicgroups-units ).MODIFY lt_enthicgroups FROM ls_ethnicgroups.ENDLOOP." 记录CLEAR lt_allgroups.MOVE-CORRESPONDING ethnicgroups TO lt_allgroups.ls_allgroups-t = curr_t.MODIFY lt_allgroups FROM ls_allgroups TRANSPORTING t WHERE units IS NOT INITIAL.APPEND LINES OF lt_allgroups TO allgroups.curr_t = curr_t + 1.CLEAR lt_allgroups.MOVE-CORRESPONDING lt_enthicgroups TO lt_allgroups.ls_allgroups-t = curr_t.MODIFY lt_allgroups FROM ls_allgroups TRANSPORTING t WHERE units IS NOT INITIAL.APPEND LINES OF lt_allgroups TO allgroups.APPEND LINES OF lt_enthicgroups TO ethnicgroups.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_GENETIC->RANDOW
* +-------------------------------------------------------------------------------------------------+
* | [--->] LOW                            TYPE        I
* | [--->] HIGH                           TYPE        I
* | [<-()] VALUE                          TYPE        I
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD RANDOW.DATA: lo_random    TYPE REF TO cl_abap_random,lv_seed      TYPE i,lv_range_num TYPE i.lv_seed = cl_abap_random=>seed( ).lo_random = cl_abap_random=>create( seed = lv_seed ).lv_range_num = lo_random->intinrange( low = low high = high ).value = lv_range_num.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_GENETIC->UNIT_CROSS
* +-------------------------------------------------------------------------------------------------+
* | [--->] UNITS_FA                       TYPE        CHIP_PROPERTY_TAB
* | [--->] UNITS_MO                       TYPE        CHIP_PROPERTY_TAB
* | [<-()] UNITS                          TYPE        CHIP_PROPERTY_TAB
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD unit_cross.DATA: ls_unit    LIKE LINE OF units,ls_unit_fa LIKE LINE OF units,ls_unit_mo LIKE LINE OF units,ls_var     LIKE LINE OF vars,lv_low     TYPE i,lv_high    TYPE i." 数值运算由于限制无法使用二进制交叉,使用中间数模拟交叉结果DO random_up * 2 TIMES.LOOP AT units_fa INTO ls_unit_fa.READ TABLE units_mo INTO ls_unit_mo WITH KEY name = ls_unit_fa-name.READ TABLE vars INTO ls_var WITH KEY name = ls_unit_fa-name.lv_low = ls_unit_fa-value.IF lv_low > ls_unit_mo-value.lv_low  = ls_unit_mo-value.lv_high = ls_unit_fa-value.ELSE.lv_high = ls_unit_mo-value.ENDIF.IF calculat_rate( ) < '0.5'.lv_low = lv_low * 2 - lv_high.IF lv_low < 0 .lv_low = 0.ENDIF.ELSE.lv_high = lv_high * 2 - lv_low.ENDIF.IF lv_low < ls_var-low.lv_low = ls_var-low.ENDIF.IF lv_high > ls_var-high.lv_high = ls_var-high.ENDIF.ls_unit-value = randow( low = lv_low high = lv_high ).ls_unit-name = ls_unit_fa-name.APPEND ls_unit TO units.CLEAR: ls_unit_mo, ls_unit_fa.ENDLOOP.IF check_gen_valid( units ).EXIT.ENDIF.CLEAR units.ENDDO.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_GENETIC->UNIT_VAR
* +-------------------------------------------------------------------------------------------------+
* | [<-->] UNITS                          TYPE        CHIP_PROPERTY_TAB
* +--------------------------------------------------------------------------------------</SIGNATURE>METHOD unit_var.DATA: ls_unit  LIKE LINE OF units,lt_units LIKE units,ls_var   LIKE LINE OF vars,lv_ind   TYPE sy-index,lv_count TYPE i.lv_count = lines( units ).lv_ind = randow( low = 1 high = lv_count ).lt_units = units.READ TABLE units INTO ls_unit INDEX lv_ind.IF sy-subrc = 0.READ TABLE vars INTO ls_var WITH KEY name = ls_unit-name.IF sy-subrc = 0.DO random_up TIMES.ls_unit-value = randow( low = ls_var-low high = ls_var-high ).IF check_gen_valid( units ).EXIT.ENDIF.CLEAR units.ENDDO.ENDIF.ENDIF.IF units IS INITIAL.units = lt_units.ENDIF.ENDMETHOD.
ENDCLASS.
对象自定义逻辑版本-接口

 对象自定义逻辑版本-示例1源代码

*----------------------------------------------------------------------*
* 已知
*     0 <= X1 <= 80
*     0 <= X2 <= 40
*     0 <= X3 <= 25
*     15*X1+40*X2+80*X3<=3000
* 求最大值
*     X1*20+30*X2+50*X3
* 备注
*     X1,X2,X3均为整数,如小数可将限制扩大对应倍数
*----------------------------------------------------------------------*CLASS lcl_genetic DEFINITION FINAL  .PUBLIC SECTION.INTERFACES zif_gentic_cus .PROTECTED SECTION.PRIVATE SECTION.
ENDCLASS.CLASS lcl_genetic IMPLEMENTATION.METHOD zif_gentic_cus~check_gen_valid.DATA: lv_sum TYPE i.LOOP AT units INTO DATA(ls_unit).CASE ls_unit-name.WHEN 'X1'.lv_sum = lv_sum + 15 * ls_unit-value.WHEN 'X2'.lv_sum = lv_sum + 40 * ls_unit-value.WHEN 'X3'.lv_sum = lv_sum + 80 * ls_unit-value.WHEN OTHERS.ENDCASE.ENDLOOP.IF lv_sum > 3000.cv_bool = ''.ELSE.cv_bool = 'X'.ENDIF.ENDMETHOD.METHOD zif_gentic_cus~calcu_fitness.DATA: lv_sum TYPE i.LOOP AT units INTO DATA(ls_unit).CASE ls_unit-name.WHEN 'X1'.lv_sum = lv_sum + 20 * ls_unit-value.WHEN 'X2'.lv_sum = lv_sum + 30 * ls_unit-value.WHEN 'X3'.lv_sum = lv_sum + 50 * ls_unit-value.WHEN OTHERS.ENDCASE.ENDLOOP.fitness = lv_sum / 10000.ENDMETHOD.ENDCLASS.DATA: lo_g    TYPE REF TO zcl_genetic,lo_gc   TYPE REF TO lcl_genetic,lt_recs TYPE zcl_genetic_base=>tt_allgroups.START-OF-SELECTION.CREATE OBJECT lo_g TYPE zcl_genetic.CREATE OBJECT lo_gc.lo_g->init( EXPORTING iv_variation = '0.05'iv_cross = '0.8'iv_m = '50'iv_t = '100'iv_random_up = '100'io_genetic_cus = lo_gc).lo_g->add_var( name = 'X1' low = 0 high = 80 ).lo_g->add_var( name = 'X2' low = 0 high = 40 ).lo_g->add_var( name = 'X3' low = 0 high = 25 ).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).WRITE:/ ls_unit-name, ':' ,ls_unit-value.ENDLOOP.WRITE:/ '迭代过程'.SORT lt_recs BY t index.LOOP AT lt_recs INTO DATA(ls_rec).WRITE:/ '代数:',ls_rec-t,'  适应度:' ,ls_rec-fitness, '  值:'.LOOP AT ls_rec-units INTO ls_unit.WRITE:ls_unit-name, '-' ,ls_unit-value , ';'.ENDLOOP.ENDLOOP.

简单装箱问题实践
*----------------------------------------------------------------------*
* 简化装箱单面填充
* 箱 单面80 * 50
* 物料A 30 10 10    共100个
* 物料B  20 10  5   共200个
* 6种摆放方式
* 1 长宽高
* 2 长高宽
* 3 高长宽
* 4 高宽长
* 5 宽高长
* 6 宽长高
* 预置 3个箱子
*----------------------------------------------------------------------*
DATA: boxx TYPE i VALUE '80',boxy TYPE i VALUE '60',ax   TYPE i VALUE '30',ay   TYPE i VALUE '10',az   TYPE i VALUE '100',bx   TYPE i VALUE '20',by   TYPE i VALUE '10',bz   TYPE i VALUE '5',amax TYPE i VALUE '100',bmax TYPE i VALUE '200'.CLASS lcl_genetic DEFINITION FINAL  .PUBLIC SECTION.INTERFACES zif_gentic_cus .PROTECTED SECTION.PRIVATE SECTION.
ENDCLASS.CLASS lcl_genetic IMPLEMENTATION.METHOD zif_gentic_cus~check_gen_valid.DATA: lv_sumx TYPE i,lv_sumy TYPE i,lv_sumz TYPE i.LOOP AT units INTO DATA(ls_unit_gr) GROUP BY COND string(  WHEN strlen( ls_unit_gr-name ) > 3 THEN ls_unit_gr-name+2(1) ELSE '' ).LOOP AT GROUP ls_unit_gr INTO DATA(ls_unit).CASE ls_unit-name+0(2).WHEN 'A1'.lv_sumx = lv_sumx + ax * ls_unit-value.lv_sumy = lv_sumy + ay * ls_unit-value.lv_sumz = lv_sumz + ay * ls_unit-value.WHEN 'A2'.lv_sumx = lv_sumx + ax * ls_unit-value.lv_sumz = lv_sumz + az * ls_unit-value.lv_sumy = lv_sumy + ay * ls_unit-value.WHEN 'A3'.lv_sumz = lv_sumz + az * ls_unit-value.lv_sumx = lv_sumx + ax * ls_unit-value.lv_sumy = lv_sumy + ay * ls_unit-value.WHEN 'A4'.lv_sumz = lv_sumz + az * ls_unit-value.lv_sumy = lv_sumy + ay * ls_unit-value.lv_sumx = lv_sumx + ax * ls_unit-value.WHEN 'A5'.lv_sumy = lv_sumy + ay * ls_unit-value.lv_sumz = lv_sumz + az * ls_unit-value.lv_sumx = lv_sumx + ax * ls_unit-value.WHEN 'A6'.lv_sumy = lv_sumy + ay * ls_unit-value.lv_sumx = lv_sumx + ax * ls_unit-value.lv_sumz = lv_sumz + az * ls_unit-value.WHEN 'B1'.lv_sumx = lv_sumx + bx * ls_unit-value.lv_sumy = lv_sumy + by * ls_unit-value.lv_sumz = lv_sumz + by * ls_unit-value.WHEN 'B2'.lv_sumx = lv_sumx + bx * ls_unit-value.lv_sumz = lv_sumz + bz * ls_unit-value.lv_sumy = lv_sumy + by * ls_unit-value.WHEN 'B3'.lv_sumz = lv_sumz + bz * ls_unit-value.lv_sumx = lv_sumx + bx * ls_unit-value.lv_sumy = lv_sumy + by * ls_unit-value.WHEN 'B4'.lv_sumz = lv_sumz + bz * ls_unit-value.lv_sumy = lv_sumy + by * ls_unit-value.lv_sumx = lv_sumx + bx * ls_unit-value.WHEN 'B5'.lv_sumy = lv_sumy + by * ls_unit-value.lv_sumz = lv_sumz + bz * ls_unit-value.lv_sumx = lv_sumx + bx * ls_unit-value.WHEN 'B6'.lv_sumy = lv_sumy + by * ls_unit-value.lv_sumx = lv_sumx + bx * ls_unit-value.lv_sumz = lv_sumz + bz * ls_unit-value.WHEN OTHERS.ENDCASE.ENDLOOP.IF lv_sumx > 80 OR lv_sumy > 60 OR lv_sumy > 50.cv_bool = ''.ELSE.cv_bool = 'X'.ENDIF.ENDLOOP.ENDMETHOD.METHOD zif_gentic_cus~calcu_fitness.DATA: lv_sum  TYPE i,lv_suma TYPE i,lv_r    TYPE i.LOOP AT units INTO DATA(ls_unit_gr) GROUP BY ( name+2(1) = ls_unit_gr-name+2(1) ).lv_r = ls_unit_gr-name+2(1).CLEAR lv_suma.LOOP AT GROUP ls_unit_gr INTO DATA(ls_unit).lv_suma = lv_suma + ls_unit-value.ENDLOOP.lv_sum = lv_sum + lv_suma * lv_r.ENDLOOP.fitness = lv_sum / 10000.ENDMETHOD.ENDCLASS.DATA: lo_g    TYPE REF TO zcl_genetic,lo_gc   TYPE REF TO lcl_genetic,lt_recs TYPE zcl_genetic_base=>tt_allgroups.START-OF-SELECTION.CREATE OBJECT lo_g TYPE zcl_genetic.CREATE OBJECT lo_gc.lo_g->init( EXPORTING iv_variation = '0.05'iv_cross = '0.8'iv_m = '50'iv_t = '100'iv_random_up = '100'io_genetic_cus = lo_gc).lo_g->add_var( name = 'A11' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ax ) * ( boxy DIV ay )  ) ).lo_g->add_var( name = 'A21' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ax ) * ( boxy DIV az )  ) ).lo_g->add_var( name = 'A31' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV az ) * ( boxy DIV ax )  ) ).lo_g->add_var( name = 'A41' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV az ) * ( boxy DIV ay )  ) ).lo_g->add_var( name = 'A51' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ay ) * ( boxy DIV az )  ) ).lo_g->add_var( name = 'A61' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ay ) * ( boxy DIV ax )  ) ).lo_g->add_var( name = 'B11' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bx ) * ( boxy DIV by )  ) ).lo_g->add_var( name = 'B21' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bx ) * ( boxy DIV bz )  ) ).lo_g->add_var( name = 'B31' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bz ) * ( boxy DIV bx )  ) ).lo_g->add_var( name = 'B41' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bz ) * ( boxy DIV by )  ) ).lo_g->add_var( name = 'B51' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV by ) * ( boxy DIV bz )  ) ).lo_g->add_var( name = 'B61' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV by ) * ( boxy DIV bx )  ) ).lo_g->add_var( name = 'A12' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ax ) * ( boxy DIV ay )  ) ).lo_g->add_var( name = 'A22' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ax ) * ( boxy DIV az )  ) ).lo_g->add_var( name = 'A32' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV az ) * ( boxy DIV ax )  ) ).lo_g->add_var( name = 'A42' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV az ) * ( boxy DIV ay )  ) ).lo_g->add_var( name = 'A52' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ay ) * ( boxy DIV az )  ) ).lo_g->add_var( name = 'A62' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ay ) * ( boxy DIV ax )  ) ).lo_g->add_var( name = 'B12' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bx ) * ( boxy DIV by )  ) ).lo_g->add_var( name = 'B22' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bx ) * ( boxy DIV bz )  ) ).lo_g->add_var( name = 'B32' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bz ) * ( boxy DIV bx )  ) ).lo_g->add_var( name = 'B42' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bz ) * ( boxy DIV by )  ) ).lo_g->add_var( name = 'B52' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV by ) * ( boxy DIV bz )  ) ).lo_g->add_var( name = 'B62' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV by ) * ( boxy DIV bx )  ) ).lo_g->add_var( name = 'A13' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ax ) * ( boxy DIV ay )  ) ).lo_g->add_var( name = 'A23' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ax ) * ( boxy DIV az )  ) ).lo_g->add_var( name = 'A33' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV az ) * ( boxy DIV ax )  ) ).lo_g->add_var( name = 'A43' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV az ) * ( boxy DIV ay )  ) ).lo_g->add_var( name = 'A53' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ay ) * ( boxy DIV az )  ) ).lo_g->add_var( name = 'A63' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ay ) * ( boxy DIV ax )  ) ).lo_g->add_var( name = 'B13' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bx ) * ( boxy DIV by )  ) ).lo_g->add_var( name = 'B23' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bx ) * ( boxy DIV bz )  ) ).lo_g->add_var( name = 'B33' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bz ) * ( boxy DIV bx )  ) ).lo_g->add_var( name = 'B43' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bz ) * ( boxy DIV by )  ) ).lo_g->add_var( name = 'B53' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV by ) * ( boxy DIV bz )  ) ).lo_g->add_var( name = 'B63' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV by ) * ( boxy DIV bx )  ) ).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).WRITE:/ ls_unit-name, ':' ,ls_unit-value.ENDLOOP.WRITE:/ '迭代过程'.SORT lt_recs BY t index.LOOP AT lt_recs INTO DATA(ls_rec).WRITE:/ '代数:',ls_rec-t,'  适应度:' ,ls_rec-fitness, '  值:'.LOOP AT ls_rec-units INTO ls_unit.WRITE:ls_unit-name, '-' ,ls_unit-value , ';'.ENDLOOP.ENDLOOP.

http://www.ppmy.cn/server/16238.html

相关文章

MySQL|数据库|MySQL数据库的Sleep进程过多的处理方式

前言&#xff1a; MySQL数据库是和其它的关系型数据库基本一样&#xff0c;开箱了就能用&#xff0c;但性能方面还需要仔细的配置&#xff0c;最后才能完全的发挥它的性能&#xff0c;也需要相关服务的开发遵循数据库的开发规范&#xff0c;例如&#xff0c;减少大事务&#x…

web案例

一、结合抽奖案例完成随机点名程序&#xff0c;要求如下: 1.点击点名按钮&#xff0c;名字界面随机显示&#xff0c;按钮文字由点名变为停止 2.再次点击点名按钮&#xff0c;显示当前被点名学生姓名&#xff0c;按钮文字由停止变为点名 3.样式请参考css及html自由发挥完成。 二…

题解:P9426 [蓝桥杯 2023 国 B] 抓娃娃

思路 1.其实题目保证了 max ⁡ r i − l i ≤ min ⁡ R i − L i \max{r_i − l_i} \le \min{R_i − L_i} maxri​−li​≤minRi​−Li​&#xff0c;那么如果占了一半的话&#xff0c;那么肯定包含了中点&#xff0c;做一个前缀和就好了。 2.因为涉及了小数&#xff0c;给每…

Oceanbase体验之(二)Oceanbase集群的搭建(社区版4.2.2)

资源规划 3台observer CPU:4C及以上 内存&#xff1a;32G及以上 硬盘操作系统500G 存储盘1T及以上 虚拟机可以直接划分&#xff0c;物理机需要提前规划好资源 一、上传oceanbase安装包 登录ocp选择软件包管理 上传Oceanbase软件包&#xff08;软件包获取路径 官网免费下载社…

数组、链表、集合、table、map、二叉树、索引、数据库

数据结构&#xff1a;帮助数据快速读写的一种结构模型&#xff0c;数据库是 系统文件索引&#xff08;索引是各种数据结构提高数据检索以平衡数据读写速度&#xff0c;系统文件是存储用户真正的数据&#xff0c;比如业务表数据、文件、图片等等&#xff09; 1.数组&#xff1a…

eNSP学习——静态路由及默认路由基本配置

目录 知识背景 实验目的 实验步骤 实验内容 实验拓扑 实验编址 实验前期准备 实验步骤 1、基本配置&#xff08;按照实验编址设置好对应的IP地址&#xff09; 2、是实现主机之间的通信 3、实现全网全通来增强网络的可靠性 4、使用默认路由实现简单的网络优化 需要各…

第六章 字符串及正则表达式

第六章 字符串及正则表达式 字符串的常用方法 字符串是Python中的不可变数据类型&#xff0c;在Python中一切皆对象&#xff0c;字符串对象本身就有一些常用的方法。 字符串的常用操作&#xff1a; 方法名描述说明str.lower()将str字符串全部转成小写字母&#xff0c;结果为…

【网络编程】网络编程概念 | TCP和UDP的区别 | UDP数据报套接字编程 | Socket

文章目录 网络编程一、什么是网络编程1.TCP和UDP的区别 二、UDP数据报套接字编程DatagramSocketDatagramPacket回显服务器&#xff08;echo server&#xff09; 网络编程 一、什么是网络编程 通过网络&#xff0c;让两个主机之间能够进行通信。基于通信来完成一定的功能。 ​…