난 당신이Julia + JuMP에서 AMPL 세트 및 매개 변수를 어떻게 정의합니까?
set A := a0 a1 a2;
param p :=
a0 1
a1 5
a2 10 ;
가 어떻게 줄리아의 A
및 p
같은 것을 정의 할 정의 할 때 AMPL에 무엇을 유사에, 줄리아 + 점프에서 약간의 일정 매개 변수를 정의 할 필요가?
난 당신이Julia + JuMP에서 AMPL 세트 및 매개 변수를 어떻게 정의합니까?
set A := a0 a1 a2;
param p :=
a0 1
a1 5
a2 10 ;
가 어떻게 줄리아의 A
및 p
같은 것을 정의 할 정의 할 때 AMPL에 무엇을 유사에, 줄리아 + 점프에서 약간의 일정 매개 변수를 정의 할 필요가?
JuMP 자체는 Julia에서 사용할 수있는 것 이상의 색인 세트에 대한 특수 구문을 정의하지 않습니다. 예를 들어, 다음과 같이 정의 할 수 있습니다.
여기서 :a0
은 기호를 정의합니다.
m = Model()
@variable(m, x[A])
점프는 데이터와 AMPL와 같은 방식으로 모델 사이의 구별을하지 않기 때문에 거기 : 색인이 설정을 통해 변수를 원하는 경우
, 다음 구문은 매개 변수의 실제 개념이 없습니다. 대신 데이터를 사용할 때만 제공하십시오. 내가 제대로 질문을 이해한다면, 당신은 우리가 줄리아 사전으로 p
를 정의하는 제약
x[a0] + 5 x[a1] + 10 x[a2] <= 20
을 추가합니다
p = Dict(:a0 => 1, :a1 => 5, :a2 => 10)
@constraint(m, sum(p[i]*x[i] for i in A) <= 20)
같은 것을 할 수 있습니다. 여기에 JuMP에만 해당하는 것은 없으며 실제로 모든 줄리아 표현이 계수로 제공 될 수 있습니다. foo
데이터베이스 조회를 수행 할 수있는 임의의 줄리아 기능, 파이의 컴퓨팅 숫자, 등 내가 작업 @mlubin의 원래 답변을 얻을 coudn't
어디 하나는 그냥 간단하게
@constraint(m, sum(foo(i)*x[i] for i in A) <= 20)
말할 수 . 또한 웹 주위의 많은 예가 위치 기반 색인 생성을 사용하므로 너무 자연스럽지 않으므로 대신 사전을 사용하여 trnsport.gms GAMS 자습서를 다시 작성합니다. gams/ampl "세트"에 훨씬 가깝습니다. .
#=
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
훨씬 더 주석 버전은 내 related blog post 볼 수 있습니다.
이 답변은 매우 유용합니다. 어쨌든 데이터가 코드 안에 있으면 안된다고 생각합니다. 나는 두 가지 해결책을 보았다 : 1) 가능한 경우 파일에서 상수를 읽는다. 2) 예를 들어 xml에서 읽은 데이터를 채우는 스크립트를 통해 코드를 생성합니다. – HAL9000
파일에서 데이터를 읽는 것이 맞습니다. JuMP의 철학은 사용자가 특정 파일 형식을 부과하는 대신 입력을 구조화하는 방법을 결정하도록하는 것입니다. 예를 들어 위의 경우 Julia의 기본 I/O 함수 또는 [LightXML.jl] (https://github.com/lindahua/LightXML.jl) 패키지를 사용하여 파일에서'p'를 채울 수 있습니다. – mlubin
대단히 고맙습니다. 나는 그것에 대해 검색하려고합니다. – HAL9000