1

線形最適化モデルを作成しようとしています。次のようなセットがあります。

si=[1,51,39,400909,1244]
sj=[31,47,5]

このセットの数字はコードを表します。セットをループしてモデルに制約を追加しようとしていますが、値を使用してセットをループしたくありません。インデックスに基づいてセットをループしたいのです。ここに私が今持っているコードがあります:

si=[1,51,39,400909,1244]
sj=[31,47,5]

c= [3 5 2;
    4 3 5;
    4 5 3;
    5 4 3;
    3 5 4]
b= [80;
    75;
    80;
    120;
    60]
# x_ij >= 0  ∀ i = 1,...,5, j = 1,...,3
@defVar(m, x[i in si,j in sj] >= 0)
@setObjective(m,Min,sum{c[i,j]*x[i,j],i in si, j in sj})
# ∀j = 1,...,3
for j in sj
    @addConstraint(m, sum{x[i,j],i in si} <= 480)
end
for i in si
    @addConstraint(m, sum{x[i,j],j in sj} >= b[i])
end

セット内の数値が大きすぎるため、エラーが発生し続けます。代わりにインデックスをループする方法を知っている人はいますか? または、これを行う別の方法がありますか?

ソリューションの印刷にも問題があります。これが私のコードです:

for i in n
    for j in p
        println("x",i,",",j,"= ", getValue(x[i,j]))
    end
end (incorporating Iain Dunning's answer from below)

ただし、出力は読み取りのみです

 Objective value: 1165.0
x5,3= 0.0

変数の値を読み取れるように出力を修正する方法を知っていますか?

4

1 に答える 1

4

投稿したコードはc、たとえば400909,47. これを試して:

n = length(si)
p = length(sj)

@variable(m, x[i=1:n,j=1:p] >= 0)
@objective(m,Min,sum{c[i,j]*x[i,j],i=1:n,j=1:p})
for j in 1:p
    @constraint(m, sum{x[i,j],i=1:n} <= 480)
end
for i in 1:n
    @constraint(m, sum{x[i,j],j=1:p} >= b[i])
end
于 2015-08-13T18:54:27.613 に答える