打开julia,按]进入包管理模式,输入如下的命令安装JuMP.jl,
add JuMP
我们来考虑如下一个优化问题,
我在julia的REPL下输入如下的代码,
using JuMP
using HiGHS
model = Model(HiGHS.Optimizer)
@variable(model, x >= 0)
@variable(model, 0 <= y <= 3)
@objective(model, Min, 12x + 20y)
@constraint(model, c1, 6x + 8y >= 100)
@constraint(model, c2, 7x + 12y >= 120)
print(model)
optimize!(model)
@show termination_status(model)
@show primal_status(model)
@show dual_status(model)
@show objective_value(model)
@show value(x)
@show value(y)
@show shadow_price(c1)
@show shadow_price(c2)
nothing #hide
简单的来讲呢,建个模型,告诉这个模型你的变量、目标函数、约束,然后调用合适的求解器求解。用JuMP.jl来处理优化就是这么简单。
lp,nlp,milp,minlp,
gams,apml, aimms,pyomo,jump
以下来自知乎的一个回答,
欢迎转载和分享给更多人,无需标明作者和链接,但如果标了会更显得尊重别人的成果,谢谢
首先,请你不要一上来就对着书按着顺序学。运筹学是一个子方向很多的学科,线性规划,整数规划,非线性规划,随机过程,随机规划,存储量,博弈论,鲁棒优化,最优控制。。。每一个方向里面全是数学,有浅一点的,有很深的,一大堆符号,要都学,学很久,而且也会学得很痛苦,因为他们之间虽然有关系,但是关系不密切。刚开始,我觉得有必要知道这门学科的灵魂。
学运筹不要一上来就去钻,例如一上来就学最最基本的线性规划,是因为如果这么学,其实你学的是优化部分的应用数学,不是运筹学。运筹学不仅仅包括优化。优化只是理论部分。例如线性规划是一种刻画某些现实问题的模型,如果只关注于线性规划本身,那其实有很大一部分是在关注线性规划的数学理论。解线性规划里面的数学理论就多了去了:线性不等式的代表性,对偶理论,各种单纯性法,椭圆法和各种内点法,现在还在发展。里面每一个理论都不是随便看看就能通的,特别对于数学基础不算很好的同学而言。有些教授对里面的数学还讲一些high level的想法,但是国内教科书一般就直接上定义XXX,定理XXX,两下就可以晕了。。。运筹学现在很受关注,很多社科和工科学生都在接触,花太多时间在数学理论部分上,对他们而言挺可惜的。
关键是,对大多数人,里面的数学压根不需要学,我们有软件解!有不少还是开源的!这个自己搜搜就好,其它回答也提到一些了。现在运筹学领域的专家们都给我们把各种解法自动化了,何必不好好利用,还自己慢慢理解算法?再慢慢编程?所以如果只是入门,最重要是看看这一大堆运筹学里面不同的理论都是干什么的,哪些模型好解,哪些难解,现在很多我们接触到的模型都有定论的。
运筹学里面其实更重要的是建模。换言之,就是看现实问题和数学语言是怎么对应的。这个因为考试的原因,太容易被忽略了其重要性。建模这事情说难不难说易不易。易在好像就是定义几个变量,定义一下变量之间的关系和目标函数。难在1. 对现实问题要看透:什么才是问题里面的最重要的因素,抓住重点 2. 找到最合适的数学语言和它对应, 3. 模型要尽量容易解。
第一点是因问题而异的,没法聊。第二点是可以通过了解各种模型适用于刻画具有什么结构的问题来达到。运筹学里面有很多模型。举几个例子:
1. 线性规划能表示所有有线性结构的问题,例如做采购,我们知道了每家供应商的固定价格和最大供应量,我们希望最小化成本,那总成本=单价×数量,这个就是这个问题里面的线性关系。 2. 整数规划能处理一些线性规划处理不了的问题。例如还是采购,假如选了某家供应商,每选定一个供应商,还要增加一个固定成本,于是我们就要多设一个变量来代表是不是选了这个供应商,这时候就需要整数限制。不然那个变量解出来等于0.5,我们只选半个它? 3. 当现实问题涉及多个参与者,每个参与者都有自己优化的东西,这时候就涉及互动,就可以将博弈论派上用场了。 4. 如果见到一个系统是随时间变化的,就可以考虑用最优控制。等等等等。
懂了对自己身边的具体问题建模,再拿个软件解一下模型,对大部分人就够了。所以要看书或者看视频自学的话,第一步是,每一章只看前面讲建模(modeling或者formulation)那一节。够用了。但是对于要更深入地去懂运筹学还不够。做得好的运筹学问题都是这样的:
1. 深刻认识现实问题 2. 用数学语言描述问题(建模) 3. 用数学工具研究模型 4. 再把研究出来的成果从数学语言翻译成我们能看懂的语言(例如汉语,英语。。。)
前面我们只聊到1,2和一点点3,真正的美出现在4。4的重要意义在于如果我们把一个问题解出来了,但是看不懂解出来的是什么,那么我们对这个问题其实是没有增加多少认识的。有些时候还会导致其他问题,例如你在解决某个现实问题的时候,你把一个计算机解出来给你的解拿来用了,发现现实情况不像你想象中那样,那怎么办?是计算机算解错了吗?还是你的模型没建好吗?如果有人给你投资做一个某些方面的优化系统,人家能信得过这样靠建个模型解个解得出的方案吗?大多数不懂你在做什么的人是不会信的。所以好的解可以提供insight!(能让人读懂的现实含义)
例如Kelly Gambling,假如已知有n匹马,他们胜率分别是bi,跑第一的话投1块钱能赢oi块钱,你总共有100块钱(你可以当成一百万,具体数目不重要,关键是比例),投到第i匹马的钱是100pi。假如你要买马买无数次,那应该怎么分配你的钱到各匹马上去?这个问题的解就是pi和b_i成比例。给我们的insight就是,获胜几率大的多放点钱,几率小的少放点钱,就是这么简单。这个model的解给了我们分散投资的idea。
这是最简单的情况,马和马之间是indepedent的,如果是投资股票,股票之间可能有相关性,如果这个相关性很重要,建模的时候就把它也考虑进去,得到考虑了相关性的解,再试图去interpret你的解。如果相关性不太重要,就没必要把模型搞复杂。
能得到给我们insight的解难吗?当然难!要想4出现,前面的1,2,3一定要简洁而深刻。模型既能抓住问题的重点,还要足够简单,不然最后出来的结果怎么可能让人看得懂。这里头需要的可不仅是扎实的数学基础,数学只是描述问题的一种语言,更重要的还是对具体问题的认识和对建出来的模型的预判。对于一个现实问题,建立一个简单好解又能较好地描述现实情况的模型,是一种艺术。这是数学界甚至科学界追求的美的原则:simple and elegant。
以上内容的作者还说建立了微信公众号“运筹之学”,做一些运筹的科普。大家可以移步参考。
对运用优化方法解决我们领域的问题,不要一上来就学那些底层的数学理论,求解算法。我们需要的是理解问题的特性,求解器的特性,适配之。逐渐逐渐的,形成自己的认识和经验。当然建模的平台(语言)也需要考虑一下,便于我们表达模型和问题。
neos, apmonitor, pyomo,jump,
JuMP.jl
NEOS 如果你想尝试不同的求解器,包括一些商业的求解器,你可以使用NEOS-Server。他们提供了不同格式输入,并且还提供api调用。就是要求不能滥用。
APMonitor和Gekko
GalacticOptim.jl
pyomo
OpenMDAO
plasmo.jl这样的主要是建立了一种分级组件建模方式。
calypso之类的优化,强烈耦合在一块的,不是评价-优化模式。