# Error while using subgradient method to update lagrange multipliers

I am trying to implemet the subgradient method in Lagragian relaxation to update the multiplier lamda which has three dimension, I have ecountered an Except error, it looks the is bugs in the code. it shows the following error:

---> 39          lamda[i,k] = max(0,lamda[i,k] + b_Ax[i,k])


TypeError: list indices must be integers or slices, not tuple

J=2
I=3
K=3
b = np.ones((I,K))
#Initial data
n=0 #iteration count that is incremented when LBb is not imprtoved
N= 3 # Maximum number of iterations count (max iter with improvement)
M= 1 #Maximum number of itereations allowed in the heuristic i.e LR heuristic
LB_b= -math.inf #best lower bound
UB_b= math.inf #best upper bound
pi_m= 1   # step size
epsilon= 0.001 # gap limit
tao= 0.001 #limit for tild_m where tildm goes to zero after some iterations.
beta= 0.5# scalar multiplied by tildm
tild_m= 1  # scalar oaly a role in reducing the step size after some iterations.
lamda = np.zeros((I,K))
# Decision varaibles
#Lagrange relaxation
for m in range(M):
#Relaxed porblem_in this case the Lower bound
z1 =(9*x_m[0,0,0]+ 2*x_m[0,1,0]+ x_m[1,0,1] + 2*x_m[1,1,1] + 3*x_m[2,0,2] +
8*x_m[2,1,2] + sum(lamda[i,k]*b[i,k]- lamda[i,k]*sum(x_m[i, j,k] for j in range(J))
for i in range(I) for k in range(K)))
model.setObjective(z1,GRB.MINIMIZE)
model.addConstr(6*x_m[0,0,0] +7*x_m[1,0,1] + 9*x_m[2,0,2] <= 13, "const1")
model.optimize()
LB_m = model.objVal
if LB_m > LB_b:
LB_b=LB_m
n=0
else:
n+=1
if n == N:
tild_m=beta*tild_m
n=0
b_Ax1 = [b[i,k] - sum(x_m[i,j,k].x  for j in range(J))  for i in range(I) for k in
range(K)]
b_Ax = [pi_m*num for num in b_Ax1]
b_Axr = sum(b[i,k]- sum(x_m[i, j, k].x for j in range(J)) for i in range(I) for k in
range(K))
# the solution of relaxed problem will be feasible to original problem,
UB_b=18
gap = abs(UB_b-LB_b)/ (UB_b)
if (UB_b-LB_b)/ UB_b <= epsilon:
break
else:
for i in range(I):
for k in range(K):
lamda[i,k] = max(0,lamda[i,k] + b_Ax[i,k])
pi_m = pi_m = tild_m*((UB_b-LB_b)/(LA.norm(b_Axr)**2))

• b_Ax = [pi_m*num for num in b_Ax1] makes bAx a vector instead of a matrix, so you should (i) make b_Ax a matrix, or (ii) access it values by b_Ax[i * I + k]. Commented Aug 24, 2023 at 13:22
• @MatheusDiógenesAndrade Thank you for your comment, what about b_Ax1, is it possible to convert it into a matrix directly while preserving the solution, and getting lamda[i,k] updated. I have faced a problem before with ' b_Ax1 = (b[i,k] - sum(x_m...)', I could not multiply it by a scalar pi_m because it is a generator, and I could transform it into a matrix to update lamda[i,k].
– ABDE
Commented Aug 24, 2023 at 13:36
• Just do b_Ax1 = np.ones((I, K)) and then populate it. If you could post the entire code, it would be helpful. Commented Aug 24, 2023 at 18:55