编写您的第一个Julia代码以解决线性优化问题。
在本文中,我们将重点介绍使用Julia建模线性优化问题。
要了解有关Julia的更多信息,请在此处找到链接。
要了解有关线性优化的更多信息,请在此处找到链接。
Julia有一个名为JuMP的软件包,用于对优化问题进行建模。
JuMP是一种领域特定的建模语言,可以用于线性,混合整数,非线性问题。
JuMP在内部使用MathProgBase。 MathProgBase提供了独立于求解器的高级功能,可用于与许多求解器(如Cbc,Clp,CPLEX,Gurobi等)进行交互。在本示例中,我们将使用Cbc作为求解器。 Cbc是一个开放源代码数学求解器,它支持线性以及混合整数问题。
1.建立模型
using JuMP
using Cbc
lpModel = Model(solver = CbcSolver(seconds = 3600))
在使用JuMP创建模型之前,请确保已安装JuMP和Cbc。
Pkg.add(“JuMP”)
Pkg.add("Cbc")
2.定义变量
我们正在创建两个具有预定义范围的变量,即x和y。
3.创建约束
@constraint (lpModel, x+y <= 20)
@constraint (lpModel, 2x + 3y >= 28)
4.创建一个目标
@objective (lpModel, Max, x + y)
5.解决并阅读答案
status = JuMP.solve(lpModel)
getvalue(x)
getvalue(y)
让我们举个例子。
一次,由18名学生组成的小组进入了新开设的咖啡馆。 咖啡馆只有两个项目,菜单卡就是这样。
1.茶20印度卢比
2.咖啡IN R30
在18名学生中,有5名学生要求喝茶,而6名学生则说要喝咖啡。 剩下的7种饮料都可以。
此外,他们不想花费超过470印度卢比。 这使酒店经理感到困惑。 他过去通常会从茶叶获得2印度卢比的利润,从咖啡获得3印度卢比的利润。 他想使利润最大化,但不确定如何做到这一点。 让我们尝试帮助他。
解
假设,x是要喝茶的学生人数,y是要喝咖啡的学生人数。
他们中至少有5个人想要喝茶。
x> = 5
同样,y> = 6
我们知道,总共有18个学生,因此x + y = 18。
总费用不能超过470,因此
20x + 30y <= 470
目标是使利润最大化,这意味着
最大化利润,用2x + 3y表示,因为每杯茶将产生2印度卢比的利润,每杯咖啡将产生3印度卢比的利润。
using JuMP
using Cbc
lpModel = Model(solver = CbcSolver(seconds = 3600))
@constraint (lpModel, x+y == 18)
@constraint (lpModel, 20x + 30y <= 470)
@objective (lpModel, Max, 2x + 3y)
status = JuMP.solve(lpModel)
println("Number of Tea Cups: $(getvalue(x))")
println("Number of Coffee Mugs : $(getvalue(y))")
以上代码应输出
Number of Tea cups: 7.0
Number of Coffee Mugs : 11.0
这意味着最大利润应该是
2 * 7 + 3 * 11 = INR 47
现在,让这个问题变得更加有趣。 假设总预算是475卢比,而不是总预算470卢比。
因此,我们需要修改约束之一。
@ constraint (lpModel, 20x + 30y <= 475)
这很容易。 让我们在修改后的约束条件下运行整个代码,看看输出是什么。
Number of Tea Cups: 6.5
Number of Coffee Mugs : 11.5
什么地方出了错? 因为,为某人提供半杯茶和半杯咖啡是没有意义的,对吧? 我们需要确保'x'和'y'是离散的整数变量而不是连续的,让我们将变量声明更改为
这也将导致与先前相同的输出。
Number of Tea Cups: 7.0
Number of Coffee Mugs : 11.0
谢谢阅读。 非常感谢您的反馈。
From: https://hackernoon.com/linear-optimization-using-julia-40311c0ad98c