Я пытаюсь решить проблему, которая чем-то похожа на проблему с упаковкой бункера. В этой задаче я должен распределять задания на машины для производства пленки, где машины имеют разную ширину пленки. Все машины должны иметь одинаковый объем использования. Каждый рулон имеет определенную ширину. Машина может выполнять несколько заданий длинной, если сумма ширины всех заданий меньше ширины пленки машины.
Я смоделировал это как проблему с упаковкой мусорного ведра. Поскольку мне нужно было убедиться, что на всех машинах одинаковое количество рулонов, у меня есть ящики как двумерный массив, где каждый тип имеет несколько ящиков. В моей формулировке c - это вместимость машины, x - это двоичная переменная, которая указывает, используется ли корзина, y - двоичная переменная, которая указывает, назначен ли рулон корзине. Общая цель - свести к минимуму образующиеся отходы.
Исходя из этого, я написал код Python с использованием пульпы.
from pulp import *
prob = LpProblem("Production Problem",LpMinimize)
capacity = [1350, 2100]
rolls = [970, 1050, 970, 1100, 1050, 500, 500, 500, 1050, 1350,1200, 370]
I = range(2) # machine film width
J = range(10) # bins for each machine film width
K = range(len(rolls)) # number of rolls in total
# variable to determine wether a particular bin is used
x = LpVariable.dicts(name = "Bin", indexs = ((i,j) for i in I for j in J), cat = 'Binary')
# variable to determine if roll is assigned to a particular bin
y = LpVariable.dicts(name = "RollBin", indexs = ((i,j, k) for i in I for j in J for k in K), cat = 'Binary')
# variable to calculate wastage
w = LpVariable(name = 'wastage', lowBound = 0, cat = LpInteger)
w = LpVariable(name = 'wastage')
for j in J:
for i in I:
firstPart = capacity[i] * x[(i,j)]
for k in K:
secondPart = rolls[k] * y[(i,j,k)]
w += firstPart - secondPart
prob+=w
#each roll is assigned to exactly 1 bin
for k in K:
prob += lpSum([y[(i,j,k)] for i in I for j in J]) == 1
#bin size is not exceeded
for i in I:
for j in J:
prob += lpSum(rolls[k] * y[(i,j,k)] for k in K) - capacity[i] * x[(i,j)] <= 0
# similar number of bins of each type are used
# for i in range(0,len(capacity)-1):
# prob+= lpSum(x[(i,j)] for j in J) - lpSum(x[(i + 1,j)] for j in J) <= 2
prob+= x[(i,j)] == x[i+1,j] for i in I for j in J
status = prob.solve()
print(prob)
for v in prob.variables():
if v.varValue > 0:
print(v.name, "=", v.varValue)
print(value(prob.objective))
print(LpStatus[status])
Моя первая проблема в том, что я не знаю, как указать последнее ограничение. Прямо сейчас выдает ошибку. Во-вторых, я попытался снять ограничение и получил объективное значение 0, что определенно неверно. Я думал, что первое ограничение гарантирует, что все рулоны будут назначены машине, но когда я распечатал решение, ни один из рулонов не был назначен, и ни одна из машин (бункеров) не использовалась.
Может ли кто-нибудь помочь мне здесь. Что-то не так с моей формулировкой?
[Обновление]: теперь включен только исходный вопрос.
x(i,j)=x(i+1,j)
вам действительно не нуженx(i,j)
, а толькоx(j)
. - person Erwin Kalvelagen   schedule 16.05.2017