• ABAP 遗传算法求解


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

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

    对象自定义逻辑版本-对象描述
    1. INIT Instance Method Public 初始化
    2. ADD_VAR Instance Method Public 添加变量
    3. GET_RESULT Instance Method Public 获取最佳结果
    4. GET_RECORD Instance Method Public 获取过程记录
    5. CALCU_FITNESS Instance Method Protected 适应度计算
    6. ELIMINATE Instance Method Protected 淘汰个体
    7. GEN_INI_ETHNICGROUPS Instance Method Private 生成初始化族群
    8. CALCULAT_RATE Instance Method Private 计算概率
    9. UNIT_VAR Instance Method Private 变异
    10. UNIT_CROSS Instance Method Private 交叉
    11. RANDOW Instance Method Private 随机数
    12. CHECK_GEN_VALID Instance Method Private 检查是否满足条件
    13. GEN_UNIT Instance Method Private 生成单个染色体
    14. ITERATION Instance Method Private 迭代繁衍群体
    15. VARIATION Instance Attribute Protected Type FTVV_PART_DEFAULT_PROBABILITY 变异率
    16. CROSS Instance Attribute Protected Type FTVV_PART_DEFAULT_PROBABILITY 交叉率
    17. M Instance Attribute Protected Type INT4 种群大小
    18. T Instance Attribute Protected Type INT4 最大迭代次数
    19. GO_GENTIC_CUS Instance Attribute Protected Type Ref To ZIF_GENTIC_CUS Genetic CUS
    20. VARS Instance Attribute Private Type TT_VAR 涉及变量
    21. ALLGROUPS Instance Attribute Private Type TT_ALLGROUPS 迭代记录
    22. ETHNICGROUPS Instance Attribute Private Type TT_ETHNICGROUPS 种群
    23. CURR_T Instance Attribute Private Type INT4 当前迭代代数
    24. RANDOM_UP Instance Attribute Private Type I 随机数最大尝试次数
    25. INDEX Instance Attribute Private Type INT4 个体编号
    对象自定义逻辑版本-类源代码
    1. class ZCL_GENETIC definition
    2. public
    3. create public .
    4. public section.
    5. types:
    6. BEGIN OF ty_allgroups,
    7. t TYPE i,
    8. index TYPE i,
    9. units TYPE chip_property_tab,
    10. fitness TYPE ftvv_part_default_probability,
    11. END OF ty_allgroups .
    12. types:
    13. tt_allgroups TYPE TABLE OF ty_allgroups .
    14. methods INIT
    15. importing
    16. !IV_VARIATION type FTVV_PART_DEFAULT_PROBABILITY default '0.05'
    17. !IV_CROSS type FTVV_PART_DEFAULT_PROBABILITY default '0.8'
    18. !IV_M type INT4 default 50
    19. !IV_T type INT4 default 50
    20. !IV_RANDOM_UP type I default 100
    21. !IO_GENETIC_CUS type ref to ZIF_GENTIC_CUS .
    22. methods ADD_VAR
    23. importing
    24. !NAME type STRING
    25. !LOW type I
    26. !HIGH type I .
    27. methods GET_RESULT
    28. returning
    29. value(RT_UNITS) type CHIP_PROPERTY_TAB .
    30. methods GET_RECORD
    31. exporting
    32. value(ET_REC) type ZCL_GENETIC_BASE=>TT_ALLGROUPS .
    33. protected section.
    34. types:
    35. BEGIN OF ty_var,
    36. name TYPE string,
    37. low TYPE i,
    38. high TYPE i,
    39. END OF ty_var .
    40. types:
    41. tt_var TYPE TABLE OF ty_var .
    42. types:
    43. BEGIN OF ty_ethnicgroups,
    44. index TYPE i,
    45. units TYPE chip_property_tab,
    46. fitness TYPE ftvv_part_default_probability,
    47. END OF ty_ethnicgroups .
    48. types:
    49. tt_ethnicgroups TYPE TABLE OF ty_ethnicgroups .
    50. data VARIATION type FTVV_PART_DEFAULT_PROBABILITY . " 变异概率
    51. data CROSS type FTVV_PART_DEFAULT_PROBABILITY . " 交叉概率
    52. data M type INT4 . " 初始种群大小
    53. data T type INT4 . " 最大迭代次数
    54. data GO_GENTIC_CUS type ref to ZIF_GENTIC_CUS .
    55. methods CALCU_FITNESS
    56. importing
    57. value(UNITS) type CHIP_PROPERTY_TAB
    58. returning
    59. value(FITNESS) type FTVV_PART_DEFAULT_PROBABILITY .
    60. methods ELIMINATE .
    61. private section.
    62. data VARS type TT_VAR ." 染色体
    63. data ALLGROUPS type TT_ALLGROUPS ." 所有迭代记录
    64. data ETHNICGROUPS type TT_ETHNICGROUPS ."种群
    65. data CURR_T type INT4 ." 当前迭代次数
    66. data RANDOM_UP type I ." 随机数重试最大次数
    67. data INDEX type INT4 . " 个体ID
    68. methods GEN_INI_ETHNICGROUPS .
    69. methods CALCULAT_RATE
    70. returning
    71. value(RATE) type PAPLI .
    72. methods UNIT_VAR
    73. changing
    74. !UNITS type CHIP_PROPERTY_TAB .
    75. methods UNIT_CROSS
    76. importing
    77. !UNITS_FA type CHIP_PROPERTY_TAB
    78. !UNITS_MO type CHIP_PROPERTY_TAB
    79. returning
    80. value(UNITS) type CHIP_PROPERTY_TAB .
    81. methods RANDOW
    82. importing
    83. !LOW type I
    84. !HIGH type I
    85. returning
    86. value(VALUE) type I .
    87. methods CHECK_GEN_VALID
    88. importing
    89. !UNITS type CHIP_PROPERTY_TAB
    90. returning
    91. value(RV_BOOL) type CHAR1 .
    92. methods GEN_UNIT
    93. returning
    94. value(UNITS) type CHIP_PROPERTY_TAB .
    95. methods ITERATION .
    96. ENDCLASS.
    97. CLASS ZCL_GENETIC IMPLEMENTATION.
    98. * <SIGNATURE>---------------------------------------------------------------------------------------+
    99. * | Instance Public Method ZCL_GENETIC->ADD_VAR
    100. * +-------------------------------------------------------------------------------------------------+
    101. * | [--->] NAME TYPE STRING
    102. * | [--->] LOW TYPE I
    103. * | [--->] HIGH TYPE I
    104. * +--------------------------------------------------------------------------------------</SIGNATURE>
    105. METHOD ADD_VAR.
    106. APPEND VALUE #( name = to_upper( name ) low = low high = high ) TO vars.
    107. ENDMETHOD.
    108. * <SIGNATURE>---------------------------------------------------------------------------------------+
    109. * | Instance Private Method ZCL_GENETIC->CALCULAT_RATE
    110. * +-------------------------------------------------------------------------------------------------+
    111. * | [<-()] RATE TYPE PAPLI
    112. * +--------------------------------------------------------------------------------------</SIGNATURE>
    113. method CALCULAT_RATE.
    114. rate = randow( low = 1 high = 1000 ) / 1000.
    115. endmethod.
    116. * <SIGNATURE>---------------------------------------------------------------------------------------+
    117. * | Instance Protected Method ZCL_GENETIC->CALCU_FITNESS
    118. * +-------------------------------------------------------------------------------------------------+
    119. * | [--->] UNITS TYPE CHIP_PROPERTY_TAB
    120. * | [<-()] FITNESS TYPE FTVV_PART_DEFAULT_PROBABILITY
    121. * +--------------------------------------------------------------------------------------</SIGNATURE>
    122. METHOD CALCU_FITNESS.
    123. go_gentic_cus->calcu_fitness( EXPORTING units = units CHANGING fitness = fitness ).
    124. ENDMETHOD.
    125. * <SIGNATURE>---------------------------------------------------------------------------------------+
    126. * | Instance Private Method ZCL_GENETIC->CHECK_GEN_VALID
    127. * +-------------------------------------------------------------------------------------------------+
    128. * | [--->] UNITS TYPE CHIP_PROPERTY_TAB
    129. * | [<-()] RV_BOOL TYPE CHAR1
    130. * +--------------------------------------------------------------------------------------</SIGNATURE>
    131. METHOD check_gen_valid.
    132. rv_bool = abap_true.
    133. go_gentic_cus->check_gen_valid( EXPORTING units = units CHANGING cv_bool = rv_bool ).
    134. ENDMETHOD.
    135. * <SIGNATURE>---------------------------------------------------------------------------------------+
    136. * | Instance Protected Method ZCL_GENETIC->ELIMINATE
    137. * +-------------------------------------------------------------------------------------------------+
    138. * +--------------------------------------------------------------------------------------</SIGNATURE>
    139. METHOD ELIMINATE.
    140. DATA: lv_count TYPE i,
    141. lv_o TYPE p LENGTH 15,
    142. lv_rate TYPE ftvv_part_default_probability.
    143. DATA: lt_ethnicgroups LIKE ethnicgroups,
    144. ls_ethnicgroups LIKE LINE OF ethnicgroups.
    145. DO random_up TIMES.
    146. lt_ethnicgroups = ethnicgroups.
    147. DESCRIBE TABLE lt_ethnicgroups LINES lv_count.
    148. IF ( lv_count - m ) / m <= 1 / 10.
    149. EXIT.
    150. ENDIF.
    151. lv_o = lv_count * lv_count + lv_count.
    152. SORT lt_ethnicgroups BY fitness DESCENDING .
    153. LOOP AT lt_ethnicgroups INTO ls_ethnicgroups.
    154. lv_rate = sy-tabix * sy-tabix / lv_o.
    155. IF lv_rate < ( 1 / 200 ).
    156. lv_rate = ( 1 / 200 ).
    157. ENDIF.
    158. IF calculat_rate( ) <= lv_rate.
    159. DELETE ethnicgroups WHERE index = ls_ethnicgroups-index.
    160. ENDIF.
    161. ENDLOOP.
    162. ENDDO.
    163. ENDMETHOD.
    164. * <SIGNATURE>---------------------------------------------------------------------------------------+
    165. * | Instance Private Method ZCL_GENETIC->GEN_INI_ETHNICGROUPS
    166. * +-------------------------------------------------------------------------------------------------+
    167. * +--------------------------------------------------------------------------------------</SIGNATURE>
    168. METHOD GEN_INI_ETHNICGROUPS.
    169. DATA: ls_ethnicgroup LIKE LINE OF ethnicgroups.
    170. DO m * 2 TIMES.
    171. ls_ethnicgroup-units = gen_unit( ).
    172. IF ls_ethnicgroup-units IS NOT INITIAL.
    173. ls_ethnicgroup-index = index.
    174. index = index + 1.
    175. APPEND ls_ethnicgroup TO ethnicgroups.
    176. ENDIF.
    177. IF lines( ethnicgroups ) >= m.
    178. EXIT.
    179. ENDIF.
    180. ENDDO.
    181. ENDMETHOD.
    182. * <SIGNATURE>---------------------------------------------------------------------------------------+
    183. * | Instance Private Method ZCL_GENETIC->GEN_UNIT
    184. * +-------------------------------------------------------------------------------------------------+
    185. * | [<-()] UNITS TYPE CHIP_PROPERTY_TAB
    186. * +--------------------------------------------------------------------------------------</SIGNATURE>
    187. METHOD GEN_UNIT.
    188. DATA: ls_unit LIKE LINE OF units,
    189. lt_unit LIKE units,
    190. ls_var LIKE LINE OF vars.
    191. DO random_up TIMES.
    192. CLEAR lt_unit.
    193. LOOP AT vars INTO ls_var.
    194. ls_unit-name = ls_var-name.
    195. ls_unit-value = randow( low = ls_var-low high = ls_var-high ).
    196. APPEND ls_unit TO lt_unit.
    197. ENDLOOP.
    198. IF check_gen_valid( lt_unit ).
    199. EXIT.
    200. ENDIF.
    201. CLEAR lt_unit.
    202. ENDDO.
    203. units = lt_unit.
    204. ENDMETHOD.
    205. * <SIGNATURE>---------------------------------------------------------------------------------------+
    206. * | Instance Public Method ZCL_GENETIC->GET_RECORD
    207. * +-------------------------------------------------------------------------------------------------+
    208. * | [<---] ET_REC TYPE ZCL_GENETIC_BASE=>TT_ALLGROUPS
    209. * +--------------------------------------------------------------------------------------</SIGNATURE>
    210. method GET_RECORD.
    211. et_rec = allgroups.
    212. endmethod.
    213. * <SIGNATURE>---------------------------------------------------------------------------------------+
    214. * | Instance Public Method ZCL_GENETIC->GET_RESULT
    215. * +-------------------------------------------------------------------------------------------------+
    216. * | [<-()] RT_UNITS TYPE CHIP_PROPERTY_TAB
    217. * +--------------------------------------------------------------------------------------</SIGNATURE>
    218. METHOD GET_RESULT.
    219. DATA: lt_ethnicgroups LIKE ethnicgroups,
    220. lv_index TYPE i.
    221. gen_ini_ethnicgroups( ).
    222. DO t TIMES.
    223. iteration( ).
    224. eliminate( ).
    225. " 判定是否收敛
    226. lt_ethnicgroups = ethnicgroups.
    227. SORT lt_ethnicgroups BY fitness DESCENDING.
    228. lv_index = lines( lt_ethnicgroups ) / 2.
    229. IF lv_index >= 1 AND lt_ethnicgroups[ 1 ]-fitness = lt_ethnicgroups[ lv_index ]-fitness.
    230. EXIT.
    231. ENDIF.
    232. IF curr_t > t.
    233. EXIT.
    234. ENDIF.
    235. ENDDO.
    236. IF ethnicgroups IS NOT INITIAL.
    237. SORT ethnicgroups BY fitness DESCENDING.
    238. rt_units = ethnicgroups[ 1 ]-units.
    239. ENDIF.
    240. ENDMETHOD.
    241. * ---------------------------------------------------------------------------------------+
    242. * | Instance Public Method ZCL_GENETIC->INIT
    243. * +-------------------------------------------------------------------------------------------------+
    244. * | [--->] IV_VARIATION TYPE FTVV_PART_DEFAULT_PROBABILITY (default ='0.05')
    245. * | [--->] IV_CROSS TYPE FTVV_PART_DEFAULT_PROBABILITY (default ='0.8')
    246. * | [--->] IV_M TYPE INT4 (default =50)
    247. * | [--->] IV_T TYPE INT4 (default =50)
    248. * | [--->] IV_RANDOM_UP TYPE I (default =100)
    249. * | [--->] IO_GENETIC_CUS TYPE REF TO ZIF_GENTIC_CUS
    250. * +--------------------------------------------------------------------------------------
    251. METHOD INIT.
    252. *----------------------------------------------------------------------*
    253. * variation: 变异率 0.01-0.1之间,变异率高可能导致收敛过快
    254. * cross: 交叉率 0.6-0.9之间,交叉率越高范围越广
    255. * m: 种群大小,20-200之间
    256. * t: 最大迭代次数
    257. * random_up: 随机时的重试上限
    258. *----------------------------------------------------------------------*
    259. variation = iv_variation .
    260. cross = iv_cross .
    261. m = iv_m .
    262. t = iv_t .
    263. random_up = iv_random_up .
    264. go_gentic_cus = io_genetic_cus.
    265. ENDMETHOD.
    266. * ---------------------------------------------------------------------------------------+
    267. * | Instance Private Method ZCL_GENETIC->ITERATION
    268. * +-------------------------------------------------------------------------------------------------+
    269. * +--------------------------------------------------------------------------------------
    270. METHOD ITERATION.
    271. DATA: lv_fitnessall TYPE p LENGTH 15 DECIMALS 5,
    272. lv_rate TYPE umls1.
    273. DATA: ls_ethnicgroups LIKE LINE OF ethnicgroups,
    274. lt_enthicgroups LIKE ethnicgroups,
    275. ls_allgroups LIKE LINE OF allgroups,
    276. lt_allgroups LIKE allgroups,
    277. lt_units_ch TYPE chip_property_tab,
    278. lt_units_fa TYPE chip_property_tab,
    279. lt_units_mo TYPE chip_property_tab.
    280. LOOP AT ethnicgroups INTO ls_ethnicgroups.
    281. IF ls_ethnicgroups-fitness IS INITIAL.
    282. ls_ethnicgroups-fitness = calcu_fitness( ls_ethnicgroups-units ).
    283. MODIFY ethnicgroups FROM ls_ethnicgroups.
    284. ENDIF.
    285. lv_fitnessall = lv_fitnessall + ls_ethnicgroups-fitness.
    286. ENDLOOP.
    287. " 交叉
    288. DO m * 2 TIMES.
    289. LOOP AT ethnicgroups INTO ls_ethnicgroups.
    290. lv_rate = ls_ethnicgroups-fitness / lv_fitnessall * cross.
    291. IF lv_rate = 0.
    292. lv_rate = '0.01'.
    293. ENDIF.
    294. IF calculat_rate( ) <= lv_rate.
    295. IF lt_units_fa IS INITIAL.
    296. lt_units_fa = ls_ethnicgroups-units.
    297. ELSE.
    298. lt_units_mo = ls_ethnicgroups-units.
    299. ENDIF.
    300. ENDIF.
    301. IF lt_units_fa IS NOT INITIAL AND lt_units_mo IS NOT INITIAL AND lt_units_mo <> lt_units_fa.
    302. EXIT.
    303. ENDIF.
    304. ENDLOOP.
    305. IF lt_units_fa IS NOT INITIAL AND lt_units_mo IS NOT INITIAL.
    306. lt_units_ch = unit_cross( units_fa = lt_units_fa units_mo = lt_units_mo ).
    307. IF lt_units_ch IS NOT INITIAL.
    308. CLEAR ls_ethnicgroups.
    309. ls_ethnicgroups-units = lt_units_ch.
    310. ls_ethnicgroups-index = index.
    311. index = index + 1.
    312. APPEND ls_ethnicgroups TO lt_enthicgroups.
    313. ENDIF.
    314. CLEAR:lt_units_fa,lt_units_mo,lt_units_ch.
    315. ENDIF.
    316. ENDDO.
    317. " 变异
    318. LOOP AT ethnicgroups INTO ls_ethnicgroups.
    319. IF calculat_rate( ) <= variation.
    320. unit_var( CHANGING units = ls_ethnicgroups-units ).
    321. ls_ethnicgroups-fitness = calcu_fitness( ls_ethnicgroups-units ).
    322. ENDIF.
    323. MODIFY ethnicgroups FROM ls_ethnicgroups.
    324. ENDLOOP.
    325. LOOP AT lt_enthicgroups INTO ls_ethnicgroups.
    326. IF calculat_rate( ) <= variation.
    327. unit_var( CHANGING units = ls_ethnicgroups-units ).
    328. ENDIF.
    329. ls_ethnicgroups-fitness = calcu_fitness( ls_ethnicgroups-units ).
    330. MODIFY lt_enthicgroups FROM ls_ethnicgroups.
    331. ENDLOOP.
    332. " 记录
    333. CLEAR lt_allgroups.
    334. MOVE-CORRESPONDING ethnicgroups TO lt_allgroups.
    335. ls_allgroups-t = curr_t.
    336. MODIFY lt_allgroups FROM ls_allgroups TRANSPORTING t WHERE units IS NOT INITIAL.
    337. APPEND LINES OF lt_allgroups TO allgroups.
    338. curr_t = curr_t + 1.
    339. CLEAR lt_allgroups.
    340. MOVE-CORRESPONDING lt_enthicgroups TO lt_allgroups.
    341. ls_allgroups-t = curr_t.
    342. MODIFY lt_allgroups FROM ls_allgroups TRANSPORTING t WHERE units IS NOT INITIAL.
    343. APPEND LINES OF lt_allgroups TO allgroups.
    344. APPEND LINES OF lt_enthicgroups TO ethnicgroups.
    345. ENDMETHOD.
    346. * <SIGNATURE>---------------------------------------------------------------------------------------+
    347. * | Instance Private Method ZCL_GENETIC->RANDOW
    348. * +-------------------------------------------------------------------------------------------------+
    349. * | [--->] LOW TYPE I
    350. * | [--->] HIGH TYPE I
    351. * | [<-()] VALUE TYPE I
    352. * +--------------------------------------------------------------------------------------</SIGNATURE>
    353. METHOD RANDOW.
    354. DATA: lo_random TYPE REF TO cl_abap_random,
    355. lv_seed TYPE i,
    356. lv_range_num TYPE i.
    357. lv_seed = cl_abap_random=>seed( ).
    358. lo_random = cl_abap_random=>create( seed = lv_seed ).
    359. lv_range_num = lo_random->intinrange( low = low high = high ).
    360. value = lv_range_num.
    361. ENDMETHOD.
    362. * <SIGNATURE>---------------------------------------------------------------------------------------+
    363. * | Instance Private Method ZCL_GENETIC->UNIT_CROSS
    364. * +-------------------------------------------------------------------------------------------------+
    365. * | [--->] UNITS_FA TYPE CHIP_PROPERTY_TAB
    366. * | [--->] UNITS_MO TYPE CHIP_PROPERTY_TAB
    367. * | [<-()] UNITS TYPE CHIP_PROPERTY_TAB
    368. * +--------------------------------------------------------------------------------------</SIGNATURE>
    369. METHOD unit_cross.
    370. DATA: ls_unit LIKE LINE OF units,
    371. ls_unit_fa LIKE LINE OF units,
    372. ls_unit_mo LIKE LINE OF units,
    373. ls_var LIKE LINE OF vars,
    374. lv_low TYPE i,
    375. lv_high TYPE i.
    376. " 数值运算由于限制无法使用二进制交叉,使用中间数模拟交叉结果
    377. DO random_up * 2 TIMES.
    378. LOOP AT units_fa INTO ls_unit_fa.
    379. READ TABLE units_mo INTO ls_unit_mo WITH KEY name = ls_unit_fa-name.
    380. READ TABLE vars INTO ls_var WITH KEY name = ls_unit_fa-name.
    381. lv_low = ls_unit_fa-value.
    382. IF lv_low > ls_unit_mo-value.
    383. lv_low = ls_unit_mo-value.
    384. lv_high = ls_unit_fa-value.
    385. ELSE.
    386. lv_high = ls_unit_mo-value.
    387. ENDIF.
    388. IF calculat_rate( ) < '0.5'.
    389. lv_low = lv_low * 2 - lv_high.
    390. IF lv_low < 0 .
    391. lv_low = 0.
    392. ENDIF.
    393. ELSE.
    394. lv_high = lv_high * 2 - lv_low.
    395. ENDIF.
    396. IF lv_low < ls_var-low.
    397. lv_low = ls_var-low.
    398. ENDIF.
    399. IF lv_high > ls_var-high.
    400. lv_high = ls_var-high.
    401. ENDIF.
    402. ls_unit-value = randow( low = lv_low high = lv_high ).
    403. ls_unit-name = ls_unit_fa-name.
    404. APPEND ls_unit TO units.
    405. CLEAR: ls_unit_mo, ls_unit_fa.
    406. ENDLOOP.
    407. IF check_gen_valid( units ).
    408. EXIT.
    409. ENDIF.
    410. CLEAR units.
    411. ENDDO.
    412. ENDMETHOD.
    413. * ---------------------------------------------------------------------------------------+
    414. * | Instance Private Method ZCL_GENETIC->UNIT_VAR
    415. * +-------------------------------------------------------------------------------------------------+
    416. * | [<-->] UNITS TYPE CHIP_PROPERTY_TAB
    417. * +--------------------------------------------------------------------------------------
    418. METHOD unit_var.
    419. DATA: ls_unit LIKE LINE OF units,
    420. lt_units LIKE units,
    421. ls_var LIKE LINE OF vars,
    422. lv_ind TYPE sy-index,
    423. lv_count TYPE i.
    424. lv_count = lines( units ).
    425. lv_ind = randow( low = 1 high = lv_count ).
    426. lt_units = units.
    427. READ TABLE units INTO ls_unit INDEX lv_ind.
    428. IF sy-subrc = 0.
    429. READ TABLE vars INTO ls_var WITH KEY name = ls_unit-name.
    430. IF sy-subrc = 0.
    431. DO random_up TIMES.
    432. ls_unit-value = randow( low = ls_var-low high = ls_var-high ).
    433. IF check_gen_valid( units ).
    434. EXIT.
    435. ENDIF.
    436. CLEAR units.
    437. ENDDO.
    438. ENDIF.
    439. ENDIF.
    440. IF units IS INITIAL.
    441. units = lt_units.
    442. ENDIF.
    443. ENDMETHOD.
    444. ENDCLASS.
    对象自定义逻辑版本-接口

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

    1. *----------------------------------------------------------------------*
    2. * 已知
    3. * 0 <= X1 <= 80
    4. * 0 <= X2 <= 40
    5. * 0 <= X3 <= 25
    6. * 15*X1+40*X2+80*X3<=3000
    7. * 求最大值
    8. * X1*20+30*X2+50*X3
    9. * 备注
    10. * X1,X2,X3均为整数,如小数可将限制扩大对应倍数
    11. *----------------------------------------------------------------------*
    12. CLASS lcl_genetic DEFINITION FINAL .
    13. PUBLIC SECTION.
    14. INTERFACES zif_gentic_cus .
    15. PROTECTED SECTION.
    16. PRIVATE SECTION.
    17. ENDCLASS.
    18. CLASS lcl_genetic IMPLEMENTATION.
    19. METHOD zif_gentic_cus~check_gen_valid.
    20. DATA: lv_sum TYPE i.
    21. LOOP AT units INTO DATA(ls_unit).
    22. CASE ls_unit-name.
    23. WHEN 'X1'.
    24. lv_sum = lv_sum + 15 * ls_unit-value.
    25. WHEN 'X2'.
    26. lv_sum = lv_sum + 40 * ls_unit-value.
    27. WHEN 'X3'.
    28. lv_sum = lv_sum + 80 * ls_unit-value.
    29. WHEN OTHERS.
    30. ENDCASE.
    31. ENDLOOP.
    32. IF lv_sum > 3000.
    33. cv_bool = ''.
    34. ELSE.
    35. cv_bool = 'X'.
    36. ENDIF.
    37. ENDMETHOD.
    38. METHOD zif_gentic_cus~calcu_fitness.
    39. DATA: lv_sum TYPE i.
    40. LOOP AT units INTO DATA(ls_unit).
    41. CASE ls_unit-name.
    42. WHEN 'X1'.
    43. lv_sum = lv_sum + 20 * ls_unit-value.
    44. WHEN 'X2'.
    45. lv_sum = lv_sum + 30 * ls_unit-value.
    46. WHEN 'X3'.
    47. lv_sum = lv_sum + 50 * ls_unit-value.
    48. WHEN OTHERS.
    49. ENDCASE.
    50. ENDLOOP.
    51. fitness = lv_sum / 10000.
    52. ENDMETHOD.
    53. ENDCLASS.
    54. DATA: lo_g TYPE REF TO zcl_genetic,
    55. lo_gc TYPE REF TO lcl_genetic,
    56. lt_recs TYPE zcl_genetic_base=>tt_allgroups.
    57. START-OF-SELECTION.
    58. CREATE OBJECT lo_g TYPE zcl_genetic.
    59. CREATE OBJECT lo_gc.
    60. lo_g->init( EXPORTING iv_variation = '0.05'
    61. iv_cross = '0.8'
    62. iv_m = '50'
    63. iv_t = '100'
    64. iv_random_up = '100'
    65. io_genetic_cus = lo_gc
    66. ).
    67. lo_g->add_var( name = 'X1' low = 0 high = 80 ).
    68. lo_g->add_var( name = 'X2' low = 0 high = 40 ).
    69. lo_g->add_var( name = 'X3' low = 0 high = 25 ).
    70. DATA(lt_unit) = lo_g->get_result( ).
    71. lo_g->get_record( IMPORTING et_rec = lt_recs ).
    72. WRITE:/ '最优解'.
    73. LOOP AT lt_unit INTO DATA(ls_unit).
    74. WRITE:/ ls_unit-name, ':' ,ls_unit-value.
    75. ENDLOOP.
    76. WRITE:/ '迭代过程'.
    77. SORT lt_recs BY t index.
    78. LOOP AT lt_recs INTO DATA(ls_rec).
    79. WRITE:/ '代数:',ls_rec-t,' 适应度:' ,ls_rec-fitness, ' 值:'.
    80. LOOP AT ls_rec-units INTO ls_unit.
    81. WRITE:ls_unit-name, '-' ,ls_unit-value , ';'.
    82. ENDLOOP.
    83. ENDLOOP.

    简单装箱问题实践
    1. *----------------------------------------------------------------------*
    2. * 简化装箱单面填充
    3. * 箱 单面80 * 50
    4. * 物料A 30 10 10100
    5. * 物料B 20 10 5200
    6. * 6种摆放方式
    7. * 1 长宽高
    8. * 2 长高宽
    9. * 3 高长宽
    10. * 4 高宽长
    11. * 5 宽高长
    12. * 6 宽长高
    13. * 预置 3个箱子
    14. *----------------------------------------------------------------------*
    15. DATA: boxx TYPE i VALUE '80',
    16. boxy TYPE i VALUE '60',
    17. ax TYPE i VALUE '30',
    18. ay TYPE i VALUE '10',
    19. az TYPE i VALUE '100',
    20. bx TYPE i VALUE '20',
    21. by TYPE i VALUE '10',
    22. bz TYPE i VALUE '5',
    23. amax TYPE i VALUE '100',
    24. bmax TYPE i VALUE '200'.
    25. CLASS lcl_genetic DEFINITION FINAL .
    26. PUBLIC SECTION.
    27. INTERFACES zif_gentic_cus .
    28. PROTECTED SECTION.
    29. PRIVATE SECTION.
    30. ENDCLASS.
    31. CLASS lcl_genetic IMPLEMENTATION.
    32. METHOD zif_gentic_cus~check_gen_valid.
    33. DATA: lv_sumx TYPE i,
    34. lv_sumy TYPE i,
    35. lv_sumz TYPE i.
    36. 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 '' ).
    37. LOOP AT GROUP ls_unit_gr INTO DATA(ls_unit).
    38. CASE ls_unit-name+0(2).
    39. WHEN 'A1'.
    40. lv_sumx = lv_sumx + ax * ls_unit-value.
    41. lv_sumy = lv_sumy + ay * ls_unit-value.
    42. lv_sumz = lv_sumz + ay * ls_unit-value.
    43. WHEN 'A2'.
    44. lv_sumx = lv_sumx + ax * ls_unit-value.
    45. lv_sumz = lv_sumz + az * ls_unit-value.
    46. lv_sumy = lv_sumy + ay * ls_unit-value.
    47. WHEN 'A3'.
    48. lv_sumz = lv_sumz + az * ls_unit-value.
    49. lv_sumx = lv_sumx + ax * ls_unit-value.
    50. lv_sumy = lv_sumy + ay * ls_unit-value.
    51. WHEN 'A4'.
    52. lv_sumz = lv_sumz + az * ls_unit-value.
    53. lv_sumy = lv_sumy + ay * ls_unit-value.
    54. lv_sumx = lv_sumx + ax * ls_unit-value.
    55. WHEN 'A5'.
    56. lv_sumy = lv_sumy + ay * ls_unit-value.
    57. lv_sumz = lv_sumz + az * ls_unit-value.
    58. lv_sumx = lv_sumx + ax * ls_unit-value.
    59. WHEN 'A6'.
    60. lv_sumy = lv_sumy + ay * ls_unit-value.
    61. lv_sumx = lv_sumx + ax * ls_unit-value.
    62. lv_sumz = lv_sumz + az * ls_unit-value.
    63. WHEN 'B1'.
    64. lv_sumx = lv_sumx + bx * ls_unit-value.
    65. lv_sumy = lv_sumy + by * ls_unit-value.
    66. lv_sumz = lv_sumz + by * ls_unit-value.
    67. WHEN 'B2'.
    68. lv_sumx = lv_sumx + bx * ls_unit-value.
    69. lv_sumz = lv_sumz + bz * ls_unit-value.
    70. lv_sumy = lv_sumy + by * ls_unit-value.
    71. WHEN 'B3'.
    72. lv_sumz = lv_sumz + bz * ls_unit-value.
    73. lv_sumx = lv_sumx + bx * ls_unit-value.
    74. lv_sumy = lv_sumy + by * ls_unit-value.
    75. WHEN 'B4'.
    76. lv_sumz = lv_sumz + bz * ls_unit-value.
    77. lv_sumy = lv_sumy + by * ls_unit-value.
    78. lv_sumx = lv_sumx + bx * ls_unit-value.
    79. WHEN 'B5'.
    80. lv_sumy = lv_sumy + by * ls_unit-value.
    81. lv_sumz = lv_sumz + bz * ls_unit-value.
    82. lv_sumx = lv_sumx + bx * ls_unit-value.
    83. WHEN 'B6'.
    84. lv_sumy = lv_sumy + by * ls_unit-value.
    85. lv_sumx = lv_sumx + bx * ls_unit-value.
    86. lv_sumz = lv_sumz + bz * ls_unit-value.
    87. WHEN OTHERS.
    88. ENDCASE.
    89. ENDLOOP.
    90. IF lv_sumx > 80 OR lv_sumy > 60 OR lv_sumy > 50.
    91. cv_bool = ''.
    92. ELSE.
    93. cv_bool = 'X'.
    94. ENDIF.
    95. ENDLOOP.
    96. ENDMETHOD.
    97. METHOD zif_gentic_cus~calcu_fitness.
    98. DATA: lv_sum TYPE i,
    99. lv_suma TYPE i,
    100. lv_r TYPE i.
    101. LOOP AT units INTO DATA(ls_unit_gr) GROUP BY ( name+2(1) = ls_unit_gr-name+2(1) ).
    102. lv_r = ls_unit_gr-name+2(1).
    103. CLEAR lv_suma.
    104. LOOP AT GROUP ls_unit_gr INTO DATA(ls_unit).
    105. lv_suma = lv_suma + ls_unit-value.
    106. ENDLOOP.
    107. lv_sum = lv_sum + lv_suma * lv_r.
    108. ENDLOOP.
    109. fitness = lv_sum / 10000.
    110. ENDMETHOD.
    111. ENDCLASS.
    112. DATA: lo_g TYPE REF TO zcl_genetic,
    113. lo_gc TYPE REF TO lcl_genetic,
    114. lt_recs TYPE zcl_genetic_base=>tt_allgroups.
    115. START-OF-SELECTION.
    116. CREATE OBJECT lo_g TYPE zcl_genetic.
    117. CREATE OBJECT lo_gc.
    118. lo_g->init( EXPORTING iv_variation = '0.05'
    119. iv_cross = '0.8'
    120. iv_m = '50'
    121. iv_t = '100'
    122. iv_random_up = '100'
    123. io_genetic_cus = lo_gc
    124. ).
    125. lo_g->add_var( name = 'A11' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ax ) * ( boxy DIV ay ) ) ).
    126. lo_g->add_var( name = 'A21' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ax ) * ( boxy DIV az ) ) ).
    127. lo_g->add_var( name = 'A31' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV az ) * ( boxy DIV ax ) ) ).
    128. lo_g->add_var( name = 'A41' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV az ) * ( boxy DIV ay ) ) ).
    129. lo_g->add_var( name = 'A51' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ay ) * ( boxy DIV az ) ) ).
    130. lo_g->add_var( name = 'A61' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ay ) * ( boxy DIV ax ) ) ).
    131. lo_g->add_var( name = 'B11' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bx ) * ( boxy DIV by ) ) ).
    132. lo_g->add_var( name = 'B21' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bx ) * ( boxy DIV bz ) ) ).
    133. lo_g->add_var( name = 'B31' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bz ) * ( boxy DIV bx ) ) ).
    134. lo_g->add_var( name = 'B41' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bz ) * ( boxy DIV by ) ) ).
    135. lo_g->add_var( name = 'B51' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV by ) * ( boxy DIV bz ) ) ).
    136. lo_g->add_var( name = 'B61' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV by ) * ( boxy DIV bx ) ) ).
    137. lo_g->add_var( name = 'A12' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ax ) * ( boxy DIV ay ) ) ).
    138. lo_g->add_var( name = 'A22' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ax ) * ( boxy DIV az ) ) ).
    139. lo_g->add_var( name = 'A32' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV az ) * ( boxy DIV ax ) ) ).
    140. lo_g->add_var( name = 'A42' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV az ) * ( boxy DIV ay ) ) ).
    141. lo_g->add_var( name = 'A52' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ay ) * ( boxy DIV az ) ) ).
    142. lo_g->add_var( name = 'A62' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ay ) * ( boxy DIV ax ) ) ).
    143. lo_g->add_var( name = 'B12' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bx ) * ( boxy DIV by ) ) ).
    144. lo_g->add_var( name = 'B22' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bx ) * ( boxy DIV bz ) ) ).
    145. lo_g->add_var( name = 'B32' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bz ) * ( boxy DIV bx ) ) ).
    146. lo_g->add_var( name = 'B42' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bz ) * ( boxy DIV by ) ) ).
    147. lo_g->add_var( name = 'B52' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV by ) * ( boxy DIV bz ) ) ).
    148. lo_g->add_var( name = 'B62' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV by ) * ( boxy DIV bx ) ) ).
    149. lo_g->add_var( name = 'A13' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ax ) * ( boxy DIV ay ) ) ).
    150. lo_g->add_var( name = 'A23' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ax ) * ( boxy DIV az ) ) ).
    151. lo_g->add_var( name = 'A33' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV az ) * ( boxy DIV ax ) ) ).
    152. lo_g->add_var( name = 'A43' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV az ) * ( boxy DIV ay ) ) ).
    153. lo_g->add_var( name = 'A53' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ay ) * ( boxy DIV az ) ) ).
    154. lo_g->add_var( name = 'A63' low = 0 high = nmax( val1 = amax val2 = ( boxx DIV ay ) * ( boxy DIV ax ) ) ).
    155. lo_g->add_var( name = 'B13' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bx ) * ( boxy DIV by ) ) ).
    156. lo_g->add_var( name = 'B23' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bx ) * ( boxy DIV bz ) ) ).
    157. lo_g->add_var( name = 'B33' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bz ) * ( boxy DIV bx ) ) ).
    158. lo_g->add_var( name = 'B43' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV bz ) * ( boxy DIV by ) ) ).
    159. lo_g->add_var( name = 'B53' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV by ) * ( boxy DIV bz ) ) ).
    160. lo_g->add_var( name = 'B63' low = 0 high = nmax( val1 = bmax val2 = ( boxx DIV by ) * ( boxy DIV bx ) ) ).
    161. DATA(lt_unit) = lo_g->get_result( ).
    162. lo_g->get_record( IMPORTING et_rec = lt_recs ).
    163. WRITE:/ '最优解'.
    164. LOOP AT lt_unit INTO DATA(ls_unit).
    165. WRITE:/ ls_unit-name, ':' ,ls_unit-value.
    166. ENDLOOP.
    167. WRITE:/ '迭代过程'.
    168. SORT lt_recs BY t index.
    169. LOOP AT lt_recs INTO DATA(ls_rec).
    170. WRITE:/ '代数:',ls_rec-t,' 适应度:' ,ls_rec-fitness, ' 值:'.
    171. LOOP AT ls_rec-units INTO ls_unit.
    172. WRITE:ls_unit-name, '-' ,ls_unit-value , ';'.
    173. ENDLOOP.
    174. ENDLOOP.
  • 相关阅读:
    lua学习
    FPGA的主流技术与市场表现方面的调研报告
    【Docker系列】Docker-核心概念/常用命令与项目部署实践
    【HDLBits 刷题】Verilog Language(4)Procedures 和 More Verilog Features 部分
    Impala入门案例
    自动驾驶学习笔记(六)——Apollo安装
    uboot引导应用程序
    TCP/IP(七)TCP的连接管理(四)全连接
    无纸化办公小程序数据交互、wxs的使用
    使用Python编写一个多线程的12306抢票程序
  • 原文地址:https://blog.csdn.net/xiefireworks/article/details/137876522