我需要在 Julia+JuMP 中定义一些常量参数,类似于您在 AMPL 中定义时所做的
set A := a0 a1 a2;
param p :=
a0 1
a1 5
a2 10 ;
我如何在 Julia 中定义类似A
and的东西?p
我需要在 Julia+JuMP 中定义一些常量参数,类似于您在 AMPL 中定义时所做的
set A := a0 a1 a2;
param p :=
a0 1
a1 5
a2 10 ;
我如何在 Julia 中定义类似A
and的东西?p
除了 Julia 中可用的之外,JuMP 本身并没有为索引集定义特殊语法。因此,例如,您可以定义
A = [:a0, :a1, :a2]
其中:a0
定义了一个符号。
如果你想在这个集合上索引一个变量,那么语法是:
m = Model()
@variable(m, x[A])
JuMP 也不像 AMPL 那样区分数据和模型,因此没有参数的真正概念。相反,您只需在使用数据时提供数据。如果我正确理解你的问题,你可以做类似的事情
p = Dict(:a0 => 1, :a1 => 5, :a2 => 10)
@constraint(m, sum(p[i]*x[i] for i in A) <= 20)
这将添加约束
x[a0] + 5 x[a1] + 10 x[a2] <= 20
我们定义p
为 Julia 字典的地方。这里没有特定于 JuMP 的内容,实际上任何 julia 表达式都可以作为系数提供。可以很容易地说
@constraint(m, sum(foo(i)*x[i] for i in A) <= 20)
foo
可以执行数据库查找、计算 pi 的位数等的任意 Julia 函数在哪里?
我无法得到@mlubin 工作的原始答案。此外,网络上的许多示例都使用基于位置的索引,我觉得不太自然,所以我改用字典重写了 GAMS 教程的trnsport.gms示例..感觉更接近 gams/ampl "sets “..
#=
Transposition in JuMP of the basic transport model used in the GAMS tutorial
This problem finds a least cost shipping schedule that meets requirements at markets and supplies at factories.
- Original formulation: Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions.
Princeton University Press, Princeton, New Jersey, 1963.
- Gams implementation: This formulation is described in detail in:
Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide.
The Scientific Press, Redwood City, California, 1988.
- JuMP implementation: Antonello Lobianco
=#
using JuMP, DataFrames
# Sets
plants = ["seattle","san_diego"] # canning plants
markets = ["new_york","chicago","topeka"] # markets
# Parameters
a = Dict( # capacity of plant i in cases
"seattle" => 350,
"san_diego" => 600,
)
b = Dict( # demand at market j in cases
"new_york" => 325,
"chicago" => 300,
"topeka" => 275,
)
# distance in thousands of miles
d_table = wsv"""
plants new_york chicago topeka
seattle 2.5 1.7 1.8
san_diego 2.5 1.8 1.4
"""
d = Dict( (r[:plants],m) => r[Symbol(m)] for r in eachrow(d_table), m in markets)
f = 90 # freight in dollars per case per thousand miles
c = Dict() # transport cost in thousands of dollars per case ;
[ c[p,m] = f * d[p,m] / 1000 for p in plants, m in markets]
# Model declaration
trmodel = Model() # transport model
# Variables
@variables trmodel begin
x[p in plants, m in markets] >= 0 # shipment quantities in cases
end
# Constraints
@constraints trmodel begin
supply[p in plants], # observe supply limit at plant p
sum(x[p,m] for m in markets) <= a[p]
demand[m in markets], # satisfy demand at market m
sum(x[p,m] for p in plants) >= b[m]
end
# Objective
@objective trmodel Min begin
sum(c[p,m]*x[p,m] for p in plants, m in markets)
end
print(trmodel)
status = solve(trmodel)
if status == :Optimal
println("Objective value: ", getobjectivevalue(trmodel))
println("Shipped quantities: ")
println(getvalue(x))
println("Shadow prices of supply:")
[println("$p = $(getdual(supply[p]))") for p in plants]
println("Shadow prices of demand:")
[println("$m = $(getdual(demand[m]))") for m in markets]
else
println("Model didn't solved")
println(status)
end
# Expected result:
# obj= 153.675
#['seattle','new-york'] = 50
#['seattle','chicago'] = 300
#['seattle','topeka'] = 0
#['san-diego','new-york'] = 275
#['san-diego','chicago'] = 0
#['san-diego','topeka'] = 275
我的相关博客文章中提供了更多评论版本。