「达摩院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

相关文章
|
1月前
|
达摩院 Linux 决策智能
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
### MindOpt 优化求解器月刊(2024年3月) - 发布亮点:MAPL建模语言升级至V2.4,支持云上无安装使用和向量化建模语法。 - 新增功能:Linux用户可本地安装`maplpy`,并支持Python与MAPL混编。 - 实例分享:介绍背包问题的组合优化,展示如何在限定容量下最大化收益。 - 用户投稿:探讨机票超售时的最优调派策略,以最小化赔付成本。 - 加入互动:官方钉钉群32451444,更多资源及。 [查看详细内容](https://opt.aliyun.com/)
83 0
阿里达摩院MindOpt优化求解器-月刊(2024年3月)
|
1月前
|
达摩院 Linux API
阿里达摩院MindOpt求解器V1.1新增C#接口
阿里达摩院MindOpt求解器发布最新版本V1.1,增加了C#相关API和文档。优化求解器产品是求解优化问题的专业计算软件,可广泛各个行业。阿里达摩院从2019年投入自研MindOpt优化求解器,截止目前经历27个版本的迭代,取得了多项国内和国际第一的成绩。就在上个月,2023年12月,在工信部产业发展促进中心等单位主办的首届能源电子产业创新大赛上,MindOpt获得电力用国产求解器第一名。本文将为C#开发者讲述如何下载安装MindOpt和C#案例源代码。
151 3
阿里达摩院MindOpt求解器V1.1新增C#接口
|
1月前
|
达摩院 开发者 容器
「达摩院MindOpt」优化形状切割问题(MILP)
在制造业,高效地利用材料不仅是节约成本的重要环节,也是可持续发展的关键因素。无论是在金属加工、家具制造还是纺织品生产中,原材料的有效利用都直接影响了整体效率和环境影响。
「达摩院MindOpt」优化形状切割问题(MILP)
|
1月前
|
机器学习/深度学习 达摩院
阿里达摩院MindOpt优化求解器-月刊(2024年4月)
【摘要】2024.04.30,阿里云发布了MindOpt优化求解器的新商品和功能。MindOpt现在已上架,提供超低价零售求解器,支持按需购买,可在阿里云平台上直接购买联网或不联网License。新版本V1.2发布,提升MILP性能,并增加PostScaling参数。此外,MindOpt Studio推出租户定制版,正处于邀测阶段。同时分享了使用MindOpt解决二分类SVM问题的案例。更多内容,可访问相关链接。
68 0
|
16天前
|
达摩院 IDE 开发工具
阿里达摩院MindOpt优化求解器-月刊(2024年5月)
阿里达摩院MindOpt优化求解器-月刊(2024年5月版),新增了两个案例,如何使用LLM和MindOpt更准确地回答数学问题、如何使用MindOpt优化云计算集群虚拟机资源配置提高机器利用率,和如何利用IIS冲突分析指导不可解的问题解决方案。MindOpt的求解器已经可以在阿里云线上购买不联网版本。租户版也正式上线,可体验更多功能。新增QQ交流群。
48 4
|
1月前
|
测试技术 索引
MindOpt APL向量化建模语法的介绍与应用(2)
在数据科学、工程优化和其他科学计算领域中,向量和矩阵的运算是核心组成部分。MAPL作为一种数学规划语言,为这些领域的专业人员提供了强大的工具,通过向量式和矩阵式变量声明以及丰富的内置数学运算支持,大大简化了数学建模和优化问题的处理。在本文中,我们将探索MAPL的这些特性,并且通过示例来展示如何有效使用这些工具。
|
1月前
|
达摩院 Linux Docker
MindOpt APL 最新版本功能介绍,并且开放下载使用了!
MindOpt APL (MAPL) 是由阿里巴巴达摩院研发的国产建模语言,专长于电力SCUC等问题,提供向量化建模支持,可与Mindopt Studio平台集成。最新版2.4增加了向量化建模、Linux环境下通过pip安装支持以及改进了打印显示和错误提示。MAPL的向量化建模提高了效率,适合大规模问题。用户可通过云平台Docker打包或pip安装使用,支持多种求解器,包括MindOpt和开源求解器。
|
1月前
|
机器学习/深度学习 算法 测试技术
MindOpt APL向量化建模语法的介绍与应用(1)
向量化建模是一种高效的数学建模和编程技术,它涉及到对向量、矩阵和更高维数组进行操作,以实现操作的同时性和批量处理。在优化和数据分析等领域,向量化建模可以极大地提高计算效率,特别是当涉及到大量的重复计算时。由于向量化建模具有表述优势、操作优势、计算性能、可扩展性等优势,使得其适合于解决很大一类实际问题
|
1月前
|
达摩院 决策智能
阿里达摩院MindOpt优化求解器-月刊(2024年2月)
新增2个整数规划的应用案例《人员排班:小美的春节相亲大计划》和《组合优化问题:装箱问题》。B站的视频专题已有9篇讲解如何用数学规划去解决生活和工作中的问题,包含如何建立数学模型、编代码、运行代码和结果理解。使用了达摩院 MindOpt 的建模语言和云平台,可复制项目跟随视频练习。还可参与活动领奖品!
101 1
|
1月前
|
达摩院 API C#
阿里达摩院MindOpt优化求解器-月刊(2024年1月)
MindOpt优化求解器 V1.1.0 发布,LP和MILP性能提升,新增C# API等多功能,详解如何使用这些新功能。新增旅行商TSP问题案例,假期如何旅游省路费, 主交通费¥900 内,就可跨5省游10城!TSP问题中MTZ消除子环的方法详解。公众号博文《四年求一解,一群达摩院数学家的极限挑战》讲解MindOpt团队成员的成长故事。
99 0
阿里达摩院MindOpt优化求解器-月刊(2024年1月)