「达摩院MindOpt APL 建模语言」语法说明 print 将结果写表格文件

简介: 不同的编程语言写入表格文件的方式均不相同,下面将展示MindOpt APL建模语言的方式。

1. 用法简述

不同的编程语言写入表格文件的方式均不相同,下面将展示MindOpt APL建模语言的方式。

# 覆盖式样写csv文件
print "{}, {}, {}" % "日期", "班次", "员工编号" : "file.csv";
close "file.csv";
# append追加式样写csv文件
print "{}, {}, {}" % d,s,e >> "Schedule_Results.csv";
close "Schedule_Results.csv";

2. 说明

2.1. 建模语言介绍

  • MindOpt建模语言(MindOpt APL, 简称为MAPL)是MindOpt团队研发的一种代数建模语言。用MAPL描述数学规划模型与用数学公式进行描述非常类似。

2.2. 语法

2.2.1. 读数据

MAPL目前read as读数据的方式支持两种数据格式ns,即数值和字符串。数字表示要读入字段的索引,而类型则表示按照何种类型来读入该字段。skip n表示跳过表格的第n行内容。

2.2.2. 写数据

任意MAPL支持的print语句+写入模式+文件名称即可将决策变量的取值打印成csv格式

  • 合法的 print/format print 语句
  • 任意MAPL支持的print语句,如 print A[1,2,3]
  • filename
  • 文本文件名,如 "result.txt""result.csv"等文本方式写
  • 两种写模式
  • : 表示第一次打开后是覆盖(overwrite)方式写,打开后在后续是拼接(append)方式写,如果不存在则新建文件。
  • >> 表示打开后都是拼接(append)方式写,如果不存在则新建文件。

更多使用方法可以参考MAPL文档:https://www.yuque.com/mindopt/apl/dw9pmekz73dxfxgd

3. 应用

在优化问题中,人员排班就是个比较好的例子,排班表非常的适合以表格的方式展示结果。

代码:

clear model;
set Schedule = {read "班次.csv" as "<1s>" skip 1}; # 读取班次的名称
set Day = {read "需求人数.csv" as "<1n>" skip 1}; #读取排班的日期
param maxDay = max(Day);
print "待排",maxDay,"天的班";
param NumDemand = read "需求人数-长列表.csv" as "<1n,2s> 3n" skip 1; #读取每天各个班次的需求人数,原横纵表拉成长列表为了读取数据方便
param totalSlots = sum {<d,s> in Day*Schedule} NumDemand[d,s];
print "总共有",totalSlots,"个班次待排";
#预估上班人数
param maxEmployee = ceil(totalSlots/5) + 1; #如果班次需求特殊导致不可解的时候,可以增加员工
print "设置参与排班人数:",maxEmployee;
set Employee = {1..maxEmployee};
#声明变量 
var x[Day*Schedule*Employee] binary; 
#约束
subto constraint_0 :
    forall {<d,s> in Day*Schedule}
         sum {e in Employee} x[d,s,e] >= NumDemand[d,s]; #满足用工需求
subto constraint_1 : 
    forall {<d,e> in Day*Employee}
            sum {s in Schedule} x[d,s,e] <= 1;  #每人每天只排一个班次
set DayPre = Day without {<maxDay>}; #去掉最后一天
subto constraint_2 : 
    forall {e in Employee}
        forall {d in DayPre}
            x[d,"夜班0-8点",e] + x[d+1,"早班8-16点",e] <= 1; #前一天晚班的,第二天不排早班
subto constraint_3 : 
    forall {e in Employee}
        sum {<d,s> in Day*Schedule} x[d,s,e] <= 5; #待排的7天里只上5天班
minimize minOnduty: sum {<d,s,e> in Day*Schedule*Employee} x[d,s,e];
#求解
option solver mindopt;     # (可选)指定求解用的求解器,默认是MindOpt
option mindopt_options 'print=0'; #设置求解器输出级别,减少过程打印
solve;         # 求解
# 结果打印和检查结果
print "-----------------Display---------------";
#display; #打印太多,注释了
# 将结果打印为数据表格
print "{}, {}, {}" % "日期", "班次", "员工编号" : "Schedule_Results.csv";
close "Schedule_Results.csv";
forall {<d,s,e> in Day*Schedule*Employee with x[d,s,e] >0}
    print "{}, {}, {}" % d, s,e >> "Schedule_Results.csv";
close "Schedule_Results.csv";

结果:

待排7天的班
总共有99个班次待排
设置参与排班人数:21
Running mindoptampl
wantsol=1
print=0
MindOpt Version 1.0.0 (Build date: 20231013)
Copyright (c) 2020-2023 Alibaba Cloud.
Start license validation (current time : 17-NOV-2023 16:52:20).
License validation terminated. Time : 0.004s
OPTIMAL; objective 99.00
Completed.

输出的Schedule_Results.csv表格部分结果:

image.png

4. 更多应用示例

案例代码均可点击链接查看

  1. 物流运输 将每条通道分别运输多少商品写成表格

将结果输出为表格:

print "{},{},{} "% "起点","途径点","商品数量" : "Results.csv";
close "Results.csv";
forall {<i, j> in LINKS}
    print "{},{},{}" % i,j,Ship[i,j]  >> "Results.csv";
close "Results.csv";

结果如下:

image.png

  1. 排产排程 将每月每种油脂的处理方式、生产计划写成表格

将结果输出为表格:

print "{}, {}, {}, {}" % "油脂", "月份", "处理方案","数量" : "每月油脂处理方式.csv";
close "每月油脂处理方式.csv";
forall {<j,m,n> in O*M*N}
    print "{}, {}, {}, {}" % j, m, n, x[j,m,n] >> "每月油脂的处理方式.csv";
close "每月油脂处理方式.csv";
print "{}, {}" % "月份", "生产计划" : "Results_.csv";
close "Results_.csv";
forall {<m> in M}
    print "{}, {}" % m,y[m] >> "Results_.csv";
close "Results_.csv";

结果如下:

image.png

image.png

相关文章
|
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月前
|
达摩院 IDE 开发工具
阿里达摩院MindOpt优化求解器-月刊(2024年5月)
阿里达摩院MindOpt优化求解器-月刊(2024年5月版),新增了两个案例,如何使用LLM和MindOpt更准确地回答数学问题、如何使用MindOpt优化云计算集群虚拟机资源配置提高机器利用率,和如何利用IIS冲突分析指导不可解的问题解决方案。MindOpt的求解器已经可以在阿里云线上购买不联网版本。租户版也正式上线,可体验更多功能。新增QQ交流群。
132 4
|
6月前
|
达摩院 Python
阿里达摩院MindOpt优化求解器-月刊(2024年6月)
**阿里达摩院MindOpt优化求解器2024年6月月刊概览:** - 发布新功能,MAPL建模语言V2.5上线,Python APIs全面升级,旧版本不兼容。 提供快速入门教程、示例代码展示如何用Python调用MAPL。MindOpt Studio租户版新增Gradio支持,便于开发WebAPP,提供了案例源码展示如何开发。引入新案例: 1. 巡检线路的排班-2017全国大学生数学建模竞赛D题。包含最短路模型、TSP模型、弧分割模型。2. 商品组合定价策略:探讨如何最赚钱的加购区商品定价。
140 0
|
6月前
|
达摩院 供应链 调度
【FlowShop流水线作业排班问题【数学规划的应用(含代码)】阿里达摩院MindOpt】
本文探讨了使用阿里巴巴达摩院的MindOpt工具解决FlowShop流水线作业排班的数学规划问题。FlowShop涉及到多台机器、多个工序和多个作业,目标是通过优化排班最小化总生产耗时。MindOpt通过数学规划方法,如线性或混合整数线性规划,将问题建模并转化为代码,利用云建模平台MindOpt Studio和MindOpt APL建模语言进行求解。案例中详细介绍了参数定义、变量解析、约束设置和目标函数,展示了如何通过MindOpt进行建模和求解,以达到最优化的生产调度。此外,文章还提供了代码示例和结果解析,帮助读者理解如何实际应用MindOpt解决这类问题。