У меня есть список продуктов (i), каждый с заданным весом и объемом. Оптимизация проходит в два этапа, из которых я не смог решить второй шаг.
Первая оптимизация: минимизировать количество используемых ячеек (решено)
Минимизируйте количество контейнеров, используемых для упаковки списка продуктов. У меня фиксированные контейнеры с ограничениями по максимальному объему и весу. Код Python:
prob = pp.LpProblem("algorithm",pp.LpMinimize) #pp=pulp solver Y_max=10 #bins will not exceed this number #Y_min = minimum number of bins (calculated) # j = index of jth bin # i = index of ith product w=weights #list of weights w_i for product i v=volumes #list of volumes v_i for product i W=W_max #maximum weight of a bin V=V_max #maximum volume of a bin #len(order) = number of products x=pp.LpVariable.dicts("x_i,j", ((i, j) for i in range(len(order)) for j in range(Y_max)),0,1,pp.LpBinary) #variable indicating if product i is placed in bin j y=pp.LpVariable.dicts("y_j", ((j,0) for j in range(Y_max)),0,1,pp.LpBinary) #variable indicating if bin j is used or unused Y=pp.LpVariable('Y') prob +=Y , 'objective function' prob += pp.lpSum([y[j,0] for j in range(Y_max)]) == Y, "" for i in range(len(order)): prob += pp.lpSum([x[i,j] for j in range(Y_max)]) == 1,'' #product i can only be placed in 1 bin for j in range(Y_max): prob += pp.lpSum([x[i,j]*w[i] for i in range(len(order))]) <= W*y[j,0],"" #weight constraint for j in range(Y_max): prob += pp.lpSum([x[i,j]*v[i] for i in range(len(order))]) <= V*y[j,0],"" #volume constraint for j in range(Y_max): for i in range(len(order)): prob += x[i,j] <= y[j,0],"" #products i may not be placed in bin j if bin j is unnused. prob += pp.lpSum([y[j,0] for i in range(len(order))]) >=Y_min,"" pp.LpSolverDefault.msg = 1 prob.solve()`
Вторая оптимизация: минимизировать количество зон, в которые перемещается бункер (как решить в линейной оптимизации?)
Каждый продукт поступает из одной из двух зон (зона 1 или зона 2). У нас есть список этих зон z_i (например, Зона 1 ‹==> 1, Зона 2 ‹==> 0).
При условии, что количество ячеек не превышает минимального количества ячеек (определенного при первой оптимизации), могу ли я разделить продукты по ячейкам так, чтобы количество зон, в которые перемещается каждая ячейка, было минимальным?
Ограничения объема и веса первой оптимизации все еще применяются.
В идеале бункер никогда не должен перемещаться в две зоны, но в некоторых случаях он вынужден это делать. (например, первая оптимизация приводит к 1 бункеру, содержащему продукты зоны 1 и зоны 2).