作者:祁彬彬、马良
本篇问题引自《数学模型(第五版)》
序 本篇文章主要讲解很多教材在开篇时,都会介绍的一个线性规划求解的简单实例——奶制品加工生产计划获利的代码,但它出现在我们关于建模文章系列的开篇位置,其承担的任务有所不同,因为写出代码方案不再是目标,而是手段。我们关注的是,通过多种求解代码方案,几个非常关键的问题应当在这个系列刚开始的时候就得到部分回答:Lingo作为早期数学建模中的应知必会软件,其模型搭建与求解机制是怎样的?为什么早期版本的MATLAB在优化问题求解时无法代替Lingo?为什么新版本MATLAB又具备了走向建模舞台中央,彻底取代Lingo的资格和条件?
这几个问题,尤其第3个,兼具头条系的帅气,和UC震惊部的沧桑,究竟是博眼球?还是确有资格?可能需要一个比较漫长的论证和测试,并伴随大量问题实例以及对应的代码求解方案。那么从这篇文章开始,我们可能就要开始这个探讨过程,这篇文章主要有如下内容:用Lingo软件求解该优化模型; 分析总结Lingo代码中,有关优化模型求解时对应的基本要素与机制;利用Yalmip求解同一问题的模型构造与求解方法;利用MATLAB求解同一问题,其对应Lingo不同模块位置的命令函数以及相应的代码编写方法;设置MATLAB调用Gurobi求解问题的代码方案与步骤。
通过对这个示例的剖析,达到如下目标:解释Lingo模型搭建与求解机制以及新版MATLAB中,对应的等效代码流程;通过比较几种方式求解同一规划问题的代码,感受MATLAB基于问题和基于求解器两类求解代码的编写方式差异;了解MATLAB调用Gurobi求解同一模型的方法,以及如何在代码中指定调用MATLAB官方命令或者Gurobi同名函数求解模型;利用Yalmip建模并求解(调用Gurobi)的方式;
题目 一奶制品加工厂用牛奶生产 两种奶制品,1桶牛奶可在甲车间用12h加工成3kg的 ,或者在乙车间用8h加工成4kg的 ,根据市场需求,生产出的 全部都能售出,每千克 获利24元,每千克 获利16元,现在加工厂每天能得到50桶牛奶的供应,每天正式工人总的劳动时间为480h,且甲车间设备每天至多能加工100kg的 ,乙车间的设备加工能力可以认为没有上限限制(加工能力足够大),试为该厂指定一个生产计划,使得每天的获利最大。
分析获利最大的决策是生产计划,每天多少桶牛奶用来各自生产 ,决策受3个条件限制:原料供应、劳动时间、甲车间加工能力。优化模型要素决策变量:设每天用 桶牛奶生产 、用 桶牛奶生产 ;目标函数:设每天获利 元。 桶牛奶生产 的 ,获利为 , 桶牛奶生产 的 ,获利为 ,所以 约束条件:包括原料供应、劳动时间、设备能力、非负约束。
约束条件明细:原料供应:生产总量所需牛奶上限需满足 :劳动时间:加工总时间不超过工人总劳动时间 :设备能力:加工的产量上限 :非负约束
数学模型
从优化模型的几个要素,以及数学模型表达式,很容易看出牛奶加工问题属于简单线性规划模型求解,这种优化模型任何市面所见的优化软件都不会有求解难度,且每一条约束和目标函数都容易理解,后续分析的重心放在代码的流程结构上。
代码Lingo与MATLAB求解器求解模型方式分析比较Lingo求解优化问题的机制一般优化问题从模型搭建到求解,要经历下面的过程。
Fig00.png (5.73 KB, 下载次数: 35)
下载附件
保存到相册
2021-7-30 08:49 上传
需要强调的是,建模语言进入求解器之前,总归要被转换为矩阵形式输入的,但Lingo却中间两个环节做了整合化的处理,不妨看看Lingo是如何求解奶制品加工厂这个简单LP例子的:
max = 72*x1+64*x2;
x1+x2 |