「达摩院MindOpt」线性规划用于排程排程问题(02)

简介: 排产排程、原料采购、仓储存放等是制造业降本增效的关键问题。

1. 问题描述和数学规划模型

排产排程、原料采购、仓储存放等是制造业降本增效的关键问题。本节以香皂的制造为例,不同于上一篇问题01-生产多少,本例主要考虑原料采购的问题。以下数据只是用来示意如何使用MAPL建模和求解,实际的制造规划问题规模更大,建模更复杂。

集合


  • 制作香皂的油脂集合image.png
  • 油脂分为两种,我们定义植物油脂集合为image.png,动物油脂集合为image.png

参数

  • 油脂image.png每吨的成本image.png
  • 油脂image.png的硬度image.png
  • 植物油脂的购买量上限image.png(单位: 吨)
  • 动物油脂的购买上限image.png(单位: 吨)
  • 每卖出一吨香皂,盈利image.png
  • 香皂的硬度不得低于image.png,也不得高于image.png

变量

  • image.png是某工厂要购买油脂image.png的重量(单位: 吨)
  • image.png是生产的香皂量(单位: 吨)

目标

  • 工厂要最大化其利润: image.png

约束

  • 假设从油脂到香皂的转化过程中,油脂没有任何浪费,生产过程中重量守恒: image.png
  • 植物油脂的购买总量不得超过image.png
  • 动物油脂的购买总量不得超过image.png
  • 假设从油脂到香皂的制造过程中,硬度的转化满足线性关系: image.png

2. 使用MindOpt APL进行建模和求解

MindOpt建模语言(MindOpt Algebra Programming Language, MindOpt APL,简称为MAPL)是一种高效且通用的代数建模语言。当前主要用于数学规划问题的建模,并支持调用多种求解器求解。下面将演示如何使用MAPL将上面的数学模型公式和数据输入,生成一个求解器可求解的问题,再调用求解器去进行求解。

方法1:cell中直接输入建模代码运行

我们可以将 MindOpt APL 建模代码直接在MindOpt云上平台Notebook中的cell里运行。请注意内核(kernel)需要选MAPL。代码如下:

clear model;#清除model,多次run的时候使用
option modelname model/manufacture_02_soap1;#方便与方法2的中间文件生成在同一个目录
#---------建模-----------------
# manufacture_02_soap1.mapl
# 声明集合
set O1 := { "VEG1", "VEG2" };
set O2 := {"OIL1", "OIL2", "OIL3"};
set O :=  O1 + O2;  
set F := {"cost", "hardness"};
# 声明参数
param data[O * F] := 
        | "cost" , "hardness" |
|"VEG1" |  100   ,  2.0       |
|"VEG2" |  90    ,  4.5       |
|"OIL1" |  110   ,  5.3       |
|"OIL2" |  105   ,  7.8       |
|"OIL3" |  95    ,  5.0       |;
param r  := 180;
param b1 := 200;
param b2 := 150;
param l  := 4;
param u  := 6;
# 声明变量
var x[O] >= 0;    # 括号内室字母O, 并非数字0
var y >= 0;
# 声明目标
maximize Reward:  r * y - sum {<j> in O} (data[j, "cost"] * x[j]);
# 声明约束
subto Weight:     sum {<j> in O} x[j] == y;
subto Hardness1:  sum {<j> in O} (data[j, "hardness"] * x[j]) >= y * l;
subto Hardness2:  sum {<j> in O} (data[j, "hardness"] * x[j]) <= y * u;
subto VEGBound:   sum {<j> in O1} x[j] <= b1;
subto OILBound:   sum {<j> in O2} x[j] <= b2;
#------------------------------
print "-----------------用MindOpt求解---------------";
option solver mindopt;   # 指定求解用MindOpt求解器
solve;               # 求解
display;
print "-----------------结果---------------";
print "最大利润 = ",r * y - sum {<j> in O} data[j, "cost"] * x[j];

方法2:导入.mapl文件运行建模然后求解

上面时直接在cell中运行所有的脚本,我们也可以建立个新文档,将中间建模的代码保存为manufacture_02_soap1.mapl文件。然后运行如下code,结果同方法1。

clear model;#清除model,多次run的时候使用
#------------------------------
model model/manufacture_02_soap1.mapl;  #通过导入建模脚本.mapl文件进行建模
#------------------------------
print "-----------------用MindOpt求解---------------";
option solver mindopt;   # 指定求解用MindOpt求解器
solve;               # 求解
display;
print "-----------------结果---------------";
print "最大利润 = ", r * y - sum {<j> in O} data[j, "cost"] * x[j];

3. 结果

运行方法一、方法二代码结果一致,如下:

-----------------用MindOpt求解---------------
Running mindoptampl
wantsol=1
MindOpt Version 0.25.1 (Build date: 20230816)
Copyright (c) 2020-2023 Alibaba Cloud.
Start license validation (current time : 24-AUG-2023 19:46:39).
License validation terminated. Time : 0.006s
Model summary.
 - Num. variables     : 6
 - Num. constraints   : 5
 - Num. nonzeros      : 23
 - Bound range        : [1.5e+02,2.0e+02]
 - Objective range    : [9.0e+01,1.8e+02]
 - Matrix range       : [1.0e+00,7.8e+00]
Presolver started.
Presolver terminated. Time : 0.000s
Simplex method started.
Model fingerprint: =Y2dkV2dhdnY
    Iteration       Objective       Dual Inf.     Primal Inf.     Time
            0     1.54802e+05      0.0000e+00      8.6001e+00     0.01s    
            4     3.07500e+04      0.0000e+00      0.0000e+00     0.01s    
Postsolver started.
Simplex method terminated. Time : 0.001s
OPTIMAL; objective 30750.00
4 simplex iterations
Completed.
Primal Solution:
  x@VEG1 = 0.00000000
  x@VEG2 = 200.000000
  x@OIL1 = 0.00000000
  x@OIL2 = 0.00000000
  x@OIL3 = 150.000000
       y = 350.000000
-----------------结果---------------
最大利润 = 30750

display指令运行时,会打印出很多求解的结果,x@name 和 y 是决策变量的取值,后面的dual solution是对偶解的值。示意如下:


Primal Solution:
  x@VEG1 = 0.00000000
  x@VEG2 = 200.000000
  x@OIL1 = 0.00000000
  x@OIL2 = 0.00000000
  x@OIL3 = 150.000000
       y = 350.000000
-----------------结果---------------
最大利润 = 30750

同时,在最近建模的文件所在目录或option modelname指定的位置,会生成对应的文件.nl.sol。其中.nl文件是建模的问题模型文件,可被多数求解器识别,.sol文件中存储了求解结果solution。

从打印的结果,们可以得到采用如下的采购方案时,利润最大,为30750元,生产了350吨的香皂:

x@VEG2 = 200.000000
  x@OIL3 = 150.000000
相关文章
|
4月前
|
达摩院 供应链 安全
光储荷经济性调度问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文介绍使用MindOpt工具优化光储荷经济性调度的数学规划问题。光储荷经济性调度技术旨在最大化能源利用率和经济效益,应用场景包括分布式光伏微网、家庭能源管理系统、商业及工业用电、电力市场参与者等。文章详细阐述了如何通过数学规划方法解决虚拟电厂中的不确定性与多目标优化难题,并借助MindOpt云建模平台、MindOpt APL建模语言及MindOpt优化求解器实现问题建模与求解。最终案例展示了如何通过合理充放电策略减少37%的电费支出,实现经济与环保双重效益。读者可通过提供的链接获取完整源代码。
|
4月前
|
达摩院 BI 索引
切割问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文主要讲述了使用MindOpt工具对切割问题进行优化的过程与实践。切割问题是指从一维原材料(如木材、钢材等)中切割出特定长度的零件以满足不同需求,同时尽可能减少浪费的成本。文章通过实例详细介绍了如何使用MindOpt云上建模求解平台及其配套的MindOpt APL建模语言来解决此类问题,包括数学建模、代码实现、求解过程及结果分析等内容。此外,还讨论了一维切割问题的应用场景,并对其进行了扩展,探讨了更复杂的二维和三维切割问题。通过本文的学习,读者能够掌握利用MindOpt工具解决实际切割问题的方法和技术。
|
4月前
|
达摩院 算法 安全
智慧楼宇多目标调度问题【数学规划的应用(含代码)】阿里达摩院MindOpt
本文探讨了使用MindOpt工具优化智慧楼宇的多目标调度问题,特别是在虚拟电厂场景下的应用。智慧楼宇通过智能化技术综合考虑能耗、舒适度等多目标,实现楼宇设备的有效管理和调度。虚拟电厂作为多能源聚合体,能够参与电力市场,提供调峰、调频等辅助服务。文章介绍了如何使用MindOpt云上建模求解平台及MindOpt APL建模语言对楼宇多目标调度问题进行数学建模和求解,旨在通过优化储能设备的充放电操作来最小化用电成本、碳排放成本和功率变化成本,从而实现经济、环保和电网稳定的综合目标。最终结果显示,在使用储能设备的情况下,相比不使用储能设备的情形,成本节约达到了约48%。
|
4月前
|
达摩院 供应链 JavaScript
网络流问题--仓储物流调度【数学规划的应用(含代码)】阿里达摩院MindOpt
本文通过使用MindOpt工具优化仓储物流调度问题,旨在提高物流效率并降低成本。首先,通过考虑供需匹配、运输时间与距离、车辆容量、仓库储存能力等因素构建案例场景。接着,利用数学规划方法,包括线性规划和网络流问题,来建立模型。在网络流问题中,通过定义节点(资源)和边(资源间的关系),确保流量守恒和容量限制条件下找到最优解。文中还详细介绍了MindOpt Studio云建模平台和MindOpt APL建模语言的应用,并通过实例展示了如何声明集合、参数、变量、目标函数及约束条件,并最终解析了求解结果。通过这些步骤,实现了在满足各仓库需求的同时最小化运输成本的目标。
|
5月前
|
达摩院 安全 调度
网络流问题--交通调度【数学规划的应用(含代码)】阿里达摩院MindOpt
本文探讨了如何利用数学规划工具MindOpt解决交通调度问题。交通调度涉及网络流分析,考虑道路容量、车辆限制、路径选择等因素,以实现高效运行。通过建立数学模型,利用MindOpt云平台和建模语言MAPL,设定流量最大化目标并确保流量守恒,解决实际的调度问题。案例展示了如何分配车辆从起点到终点,同时满足道路容量约束。MindOpt Studio提供在线开发环境,支持模型构建和求解,帮助优化大规模交通调度。
|
5月前
|
达摩院
人员排班【数学规划的应用(含代码)】阿里达摩院MindOpt
本文介绍了使用阿里巴巴达摩院的MindOpt工具解决人员排班的数学规划问题。人员排班在多个行业中至关重要,如制造业、医疗、餐饮和零售等。问题涉及多种约束,包括工作需求、员工能力、工作时间限制、连续工作天数及公平性。通过MindOpt云建模平台和建模语言MindOpt APL,建立数学模型并编写代码来解决最小化总上班班次的问题。案例中展示了如何声明集合、参数、变量和约束,并给出了部分代码示例。最后,通过MindOpt求解器得到最优解,并将结果输出到CSV文件中。
|
5月前
|
存储 达摩院 供应链
排产排程问题【数学规划的应用(含代码)】阿里达摩院MindOpt
**文章摘要:** 本文探讨了使用阿里巴巴达摩院的MindOpt优化求解器解决制造业中的排产排程问题。排产排程涉及物料流动、工序安排、设备调度等多个方面,通常通过数学规划方法建模。MindOpt支持线性规划、整数规划等,能有效处理大规模数据。案例以香皂制造工厂为例,考虑了多种油脂的购买、存储和生产计划,以及价格变化和存储成本。问题通过数学建模转化为MindOpt APL代码,求解器自动寻找最优解,以最大化利润。文章还提供了代码解析,展示了解决方案的细节,包括目标函数(利润最大化)、约束条件(如生产效率、库存管理)以及结果分析。
|
7月前
|
达摩院 Linux 决策智能
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
### MindOpt 优化求解器月刊(2024年3月) - 发布亮点:MAPL建模语言升级至V2.4,支持云上无安装使用和向量化建模语法。 - 新增功能:Linux用户可本地安装`maplpy`,并支持Python与MAPL混编。 - 实例分享:介绍背包问题的组合优化,展示如何在限定容量下最大化收益。 - 用户投稿:探讨机票超售时的最优调派策略,以最小化赔付成本。 - 加入互动:官方钉钉群32451444,更多资源及。 [查看详细内容](https://opt.aliyun.com/)
132 0
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
|
7月前
|
达摩院 Linux API
阿里达摩院MindOpt求解器V1.1新增C#接口
阿里达摩院MindOpt求解器发布最新版本V1.1,增加了C#相关API和文档。优化求解器产品是求解优化问题的专业计算软件,可广泛各个行业。阿里达摩院从2019年投入自研MindOpt优化求解器,截止目前经历27个版本的迭代,取得了多项国内和国际第一的成绩。就在上个月,2023年12月,在工信部产业发展促进中心等单位主办的首届能源电子产业创新大赛上,MindOpt获得电力用国产求解器第一名。本文将为C#开发者讲述如何下载安装MindOpt和C#案例源代码。
244 3
阿里达摩院MindOpt求解器V1.1新增C#接口
|
7月前
|
达摩院 开发者 容器
「达摩院MindOpt」优化形状切割问题(MILP)
在制造业,高效地利用材料不仅是节约成本的重要环节,也是可持续发展的关键因素。无论是在金属加工、家具制造还是纺织品生产中,原材料的有效利用都直接影响了整体效率和环境影响。
「达摩院MindOpt」优化形状切割问题(MILP)