Я пытаюсь реализовать проблему балансировки конвейера до Python.
Вот некоторые из ограничений
Моя переменная x является двоичной. Я для задач и J для рабочих станций. Если задача i назначена станции jx [i, j], то 1, иначе это 0.
У меня проблема с номером ограничения (5). Это ограничение для приоритетности задач. Именно поэтому приоритет задачи не будет на следующих станциях. Я не знаю, как я могу кодировать это в Python. Вот весь мой код. Пожалуйста помоги. Заранее спасибо.
import pulp
import random
#parameteers
n = 12
m = 5
i=range(1,12)
j=range(1,5)
set_I = range(1, n+1)
set_J = range(1, m+1)
A=[3,6,7,6,4,8,9,2,11,4,2,3]
p=[(),(1),(1),(2),(2),(2,3),(3),(5,6),(6,7),(4,5,8),(8,11),(9,10)]
b={(i,j): random.normalvariate(0,5) for i in set_I for j in set_J}
t = pulp.OrderedDict({i: A[i-1] for i in set_I})
P = pulp.OrderedDict({i: p[i-1] for i in set_I})
U=3
# Model
opt_mod = pulp.LpProblem(name="Binary_model", sense=pulp.LpMinimize)
# Variables from a dictionary
x_vars = pulp.LpVariable.dicts("x", b.keys(), cat=pulp.LpBinary)
y_vars = pulp.LpVariable.dicts("y", t.keys(), cat=pulp.LpBinary)
#z_vars=pulp.LpVariable.dicts("z",t.keys(),cat=pulp.LpBinary)
if x_vars==0 or y_vars==0:
z_vars=0
else:
z_vars=1
C = pulp.LpVariable("C",cat=pulp.LpInteger)
if x_vars==1 and y_vars==1:
a=2
else:
if x_vars==0 and y_vars==0:
a=0
else:
a=1
if y_vars==1:
y1=1
else:
y1=0
# Constraints
for j in set_J:
opt_mod += pulp.lpSum(x_vars[i,j] for i in set_I) >= 1 #3#
opt_mod += pulp.lpSum(x_vars[i,j] for i in set_I) <=2 #4#
#opt_mod += pulp.lpSum(x_vars[i,j] for i in set_I) <=pulp.lpSum(x_vars[p,n] for p in P) #5#
opt_mod += (pulp.lpSum(x_vars[i,j] for i in set_I)) -(1) == y1 #9#
for i in set_I:
opt_mod += pulp.lpSum(z_vars*(0.5)* t[i])+ \
pulp.lpSum((((x_vars[i,j])-(z_vars))*t[i]) for j in set_J) <= C #6#
opt_mod += ((z_vars)-a) >= (-1.5) #7#
opt_mod += ((1.5*z_vars)-a) <= 0 #8#
opt_mod += pulp.lpSum(y_vars[i]) <= U #10#
opt_mod += C >= 0 #13#
#objectives
opt_mod += C
# Solve
opt_mod.solve()