SAP ABAP 使用GENIOS求解线性规划问题的简单例子
主要内容来自Operations Research & ABAP ,结合我遇到的需求,做了一些修改。
需求:有BOX1和BOX2两种箱子,分别能包装不同数量的A物料和B物料,给出若干数量的A, B物料,怎样包装可以使箱子数最少?
线性规划有助于解决类似问题。
以下是一个示例程序,包含必要的注释,
*&---------------------------------------------------------------------*
*& Report YTEST_LP1
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ytest_lp1. *BOX1 箱子可以装2个A物料 1个B物料, BOX2箱子可以装1个A物料 3个B物料, 现有10A 11B, 如何包装箱子最少?
*假设最终结果用到了X个 BOX1箱子, Y个BOX2箱子,问题可以写成如下形式
* minimize X + Y
* subject to : 2X + 1Y >= 10
* X + 3Y >= 11
* X >= 0
* Y >= 0
DATA:
lr_model TYPE REF TO cl_genios_model, "problem instance
lr_objective TYPE REF TO cl_genios_objective, "objective function
lr_environment TYPE REF TO cl_genios_environment,
lr_x TYPE REF TO cl_genios_variable, "variables
lr_y TYPE REF TO cl_genios_variable,
lr_constraint TYPE REF TO cl_genios_linearconstraint,
lr_solver TYPE REF TO cl_genios_solver,
ls_result TYPE genioss_solver_result,
ls_variable TYPE genioss_variable,
lt_variables TYPE geniost_variable,
lv_value TYPE genios_float,
lv_name TYPE string. "变量名 lr_environment = cl_genios_environment=>get_environment( ).
lr_model = lr_environment->create_model( 'PRIORIZATION' ).
*定义离散变量,因为箱子是离散的定义连续变量,因为SIMP只支持连续变量
lr_x = lr_model->create_variable( iv_name = 'X'
iv_type = if_genios_model_c=>gc_var_continuous ).
lr_y = lr_model->create_variable( iv_name = 'Y'
iv_type = if_genios_model_c=>gc_var_continuous ).
"下面设置目标函数,取满足条件的(X+Y)最小值,现实中也可能有不同的系数,比如X的价格是2,Y是1,那么在这里做相应调整
lr_objective = lr_model->create_objective( if_genios_model_c=>gc_obj_minimization ).
lr_objective->add_monom( io_variable = lr_x iv_coefficient = 1 ).
lr_objective->add_monom( io_variable = lr_y iv_coefficient = 1 ).
* 定义线性约束c1: 2X + 1Y >= 10
lr_constraint = lr_model->create_linearconstraint( iv_name = 'c1'
iv_type = if_genios_model_c=>gc_con_greaterorequal iv_righthandside = 10 ).
lr_constraint->add_monom( io_variable = lr_x iv_coefficient = 2 ).
lr_constraint->add_monom( io_variable = lr_y iv_coefficient = 1 ). * 定义线性约束c2: 1X + 3Y >= 11
lr_constraint = lr_model->create_linearconstraint( iv_name = 'c2'
iv_type = if_genios_model_c=>gc_con_greaterorequal iv_righthandside = 11 ).
lr_constraint->add_monom( io_variable = lr_x iv_coefficient = 1 ).
lr_constraint->add_monom( io_variable = lr_y iv_coefficient = 3 ).
* 定义线性约束c3: X >= 0
lr_constraint = lr_model->create_linearconstraint( iv_name = 'c3'
iv_type = if_genios_model_c=>gc_con_greaterorequal iv_righthandside = 0 ).
lr_constraint->add_monom( io_variable = lr_x iv_coefficient = 1 ).
* 定义线性约束c4: Y >= 0
lr_constraint = lr_model->create_linearconstraint( iv_name = 'c4'
iv_type = if_genios_model_c=>gc_con_greaterorequal iv_righthandside = 0 ).
lr_constraint->add_monom( io_variable = lr_y iv_coefficient = 1 ). lr_solver = lr_environment->create_solver( 'SIMP' ).
lr_solver->load_model( lr_model ).
ls_result = lr_solver->solve( ). * Get the result
IF ls_result-solution_status = if_genios_solver_result_c=>gc_optimal OR
ls_result-solution_status = if_genios_solver_result_c=>gc_abortfeasible.
lt_variables = lr_model->get_variables( ).
LOOP AT lt_variables INTO ls_variable.
lv_name = ls_variable-variable_ref->gv_name.
lv_value = ls_variable-variable_ref->get_primalvalue( ).
DATA: lv_int TYPE P LENGTH 10 DECIMALS 2.
lv_int = lv_value.
WRITE: /,lv_name,' = ',lv_int.
ENDLOOP.
ENDIF.
lr_environment->destroy_solver( 'SIMP' ).
lr_environment->destroy_model( 'PRIORIZATION' ).
运行程序,可以看到结果
X = 3.80
Y = 2.40
示例中的Solver SIMP 仅支持连续变量,对这个需求显然不合适,因为箱子不应该为小数。如果想使用离散变量,就需要换成其他Solver比如MILP,可惜我的系统无法使用MILP,所以不能测试。据说SAP APO或SAP SCM Optimizer可以满足更复杂的需求。
SAP ABAP 使用GENIOS求解线性规划问题的简单例子的更多相关文章
- SAP ABAP学习路线图--标准教程
SAP ABAP学习路线图--标准教程 摘自:http://www.cnblogs.com/clsoho/archive/2010/07/05/1771400.html
- ABAP开发顾问必备:SAP ABAP开发技术总结
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]ABAP程序之间数据共享与传递
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]字符串处理函数、正则表达式
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- ABAP开发顾问必备:SAP ABAP开发技术总结[转载]
转载自SAP师太技术博客,原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260224.html 在原文上增加了链接,此文及此文的链接版权都归SAP师太所有. ...
- SAP-ABAP系列 第二篇SAP ABAP开发基础
第二章SAP ABAP开发基础 1.ABAP数据类型及定义 ABAP程序中共包含8种基本数据类型定义, 类型名称 描述 属性 C Character Text (字符类型) 默认长度=1,默认值 = ...
- SAP ABAP 的经常使用debug方式
SAP ABAP 的经常使用debug方式: 1. 直接在程序中设断点 在se38里面打上breakpoint,程序执行到该处即进入debug模式 2.background Job的debug 进入S ...
- 如何使用Prometheus采集SAP ABAP Netweaver的应用日志数据
Prometheus是一套开源的系统监控报警框架.它启发于Google的borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 2012 年创建,作为社区开源项目进行开发 ...
- 【ABAP系列】SAP ABAP BAPI_REQUISITION_CREATE创建采购申请
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP BAPI_RE ...
- 【ABAP系列】SAP ABAP 字符编码与解码、Unicode
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 字符编码与解码 ...
随机推荐
- 关于在visual Studio 2022中无法找到 ASP.NET Core Web Application 或 ASP.NET Core Web 应用程序
在学习 ASP.NET Core Web Application 时 发现无论如何都无法找到这个模板,在翻遍论坛后都没有看到解决的方法,在我下载 visual Studio 2017 中终于找到了 但 ...
- 逍遥自在学C语言 | 赋值运算符
前言 在C语言中,赋值运算符用于将一个值赋给变量 这个过程分为两个步骤: 计算赋值运算符右侧的表达式 将结果赋给左侧的变量. C语言提供了多个不同的赋值运算符,包括基本的赋值运算符.复合赋值运算符以及 ...
- 完美的背景图全屏css代码 – background-size:cover?
写主题样式的时候经常会碰到用背景图铺满整个背景的需求,这里分享下使用方法 需要的效果 图片以背景的形式铺满整个屏幕,不留空白区域 保持图像的纵横比(图片不变形) 图片居中 不出现滚动条 多浏览器支持 ...
- 【asp.net core】自定义模型绑定及其验证
引言 水此篇博客,依旧是来自群里的讨论,最后说到了,在方法参数自定义了一个特性,用来绑定模型,优先从Form取,如果为空,或者不存在,在从QueryString中获取并且绑定,然后闲着无聊,就水一篇博 ...
- 2023-01-01:remix-ide是浏览器的ide,官方已经提供地址,但是需要连接外网。如果是内网,需要自己在服务器里搭建remix-ide;另一种方式是用remix-ide的桌面版。这里只讨论
2023-01-01:remix-ide是浏览器的ide,官方已经提供地址,但是需要连接外网.如果是内网,需要自己在服务器里搭建remix-ide:另一种方式是用remix-ide的桌面版.这里只讨论 ...
- 2021-02-27:假设一个固定大小为W的窗口,依次划过arr,返回每一次滑出状况的最大值。例如,arr = [4,3,5,4,3,3,6,7], W = 3。返回:[5,5,5,4,6,7]。
2021-02-27:假设一个固定大小为W的窗口,依次划过arr,返回每一次滑出状况的最大值.例如,arr = [4,3,5,4,3,3,6,7], W = 3.返回:[5,5,5,4,6,7]. 福 ...
- [vuex] unknown action type:***
vuex 分模块后使用mapActions调用action老是提示 [vuex] unknown action type:*** 异常 目录 index.js是这样的 import Vue from ...
- LINIUX 查询命令的 区别 chich whereis locate fing
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. locate 配合数据库查看文件位置 ...
- Win10环境配置(一)——C\C++篇
Win10环境配置(一)--C\C++篇 1.工具准备 官网下载地址:https://sourceforge.net/projects/mingw-w64/ MinGW64下载地址:https://s ...
- “AI Earth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学、Xarray 使用教学,针对气象领域.nc文件读取处理
1."AI Earth"人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1].NetCDF4使用教学.Xarray 使用教学,针对气象领域.nc文件读取处理 比赛官网: ...