1

PuLp で解決しようとしている大規模な線形計画法モデルがあります。これまでのところ、dict 変数の各「行」の最小値と最大値を設定しようとしたときに問題が発生したことを除いて、すべてが順調に進んでいます。以下の例では、示されているように、エリアごとの動物の最小数と最大数を設定したいと考えています。

簡単にするために、変数名を「dogs」と「cats」に変更しました

import pulp as lp 

prob = lp.LpProblem("test problem", lp.LpMaximize)

# in reality I have 20,000 areas
areas = [1, 2, 3]

costs = {1: 300,
         2: 310,
         3: 283}

dogs = {1: 150,
        2: 300,
        3: 400}
# Max cats per area
cats = {1: 400,
        2: 140,
        3: 0}

# minimum dogs per area
min_dogs = {1: 50,
            2: 5,
            3: 80}

# min cats per area
min_cats = {1: 5,
            2: 24,
            3: 0}

prob = lp.LpProblem("Example for SO", lp.LpMinimize)

# Setup variables

dog_vars = lp.LpVariable.dicts('dogs', dogs, 0)
cat_vars = lp.LpVariable.dicts('cats', cats, 0)

# Objective:
prob += lp.lpSum([costs[i] * (dog_vars[i] + cat_vars[i]) for i in areas])

# Constraints
prob += lp.lpSum([costs[i] * (dog_vars[i] + cat_vars[i]) for i in areas]) <= 50000
# Constraints not working:
prob += lp.lpSum([dog_vars[i] - min_dogs[i] for i in dogs]) >= 0
prob += lp.lpSum([cat_vars[i] - min_cats[i] for i in cats]) >= 0


prob.solve()
print("Status:", lp.LpStatus[prob.status])

for v in prob.variables():
    print(v.name, "=", v.varValue)

print("Total # of km to be done", lp.value(prob.objective))

結果は次のとおりです。min_cats問題は、これらの変数のそれぞれにとよりも少なくない値が存在する必要があることですmin_dogs。値を分散するのではなく、猫と犬の 1 つの領域に割り当てました。

('Status:', 'Optimal')
('cats_1', '=', 0.0)
('cats_2', '=', 0.0)
('cats_3', '=', 29.0)
('dogs_1', '=', 0.0)
('dogs_2', '=', 0.0)
('dogs_3', '=', 135.0)
('Total # of km to be done', 46412.0)
[Finished in 0.7s]

行レベルで最小境界と最大境界を割り当てるにはどうすればよいですか?

4

1 に答える 1