Unbdray does not give me correct answer
OngoingHello,
I am trying to solve a problem in two ways with and without Benders decomposition. extract unbdrays and add them to my Master problem but when I extract them and put them into (w)(d-Bx)=<0 is not working and gives me an error. I would be highly thankful if you help me in this regard.
def solve_Dual_subproblem(z):
# defining all variables
Dualproblem = grb.Model()
#Dualproblem.setParam ('LogToConsole',0)
sumpc = Dualproblem.addVars(Tx,vtype='c',lb=0) #sum power channel
powerupperbound = Dualproblem.addVars(Tx,range(numChannels),vtype='c',lb=0) #upperbound power variable
qdef = Dualproblem.addVars(Tx,Rx,range(numChannels),vtype='c',lb=-grb.GRB.INFINITY, ub= grb.GRB.INFINITY) #qdef
qsens = Dualproblem.addVars(Tx,Rx,range(numChannels),vtype='c',lb=0) #qsens
qint = Dualproblem.addVars(Tx,Rx,range(numChannels),vtype='c',lb=0) #qint
qsnr = Dualproblem.addVars(Tx,Rx,range(numChannels),vtype='c',lb=0) #qsnr
# defining all the constraints
# constraint(0)
sump=[]
for i in list(range(numDevices)):
for n in range(numChannels):
lhs = - sumpc[i] - powerupperbound[i,n] - sum( dist[i,j] * qdef[i,j,n] for j in list(range(numDevices)) )
rhs = 1
sump.append(Dualproblem.addConstr(lhs <= rhs , name = 'sump'))
# constraint(1)
sumq=[]
for i in list(range(numDevices)):
for j in list(range(numDevices)):
for n in range(numChannels):
lhs=qdef[i,j,n] + qsens[i,j,n] - (sum(qint[k,j,n] for k in list(range(numDevices)) ) - qint[i,j,n]) + qsnr[i,j,n] - delta * (sum(qsnr[k,j,n] for k in list(range(numDevices)) ) - qsnr[i,j,n] )
rhs=0
sumq.append(Dualproblem.addConstr(lhs == rhs , name = 'sumq'))
expr = sum(-Pmax_radio * sumpc[i] for i in list(range(numDevices))) + sum( -Pmax_channel * sum( z[i,j,n] for j in Rx ) * powerupperbound[i,n] for i in list(range(numDevices)) for n in range(numChannels)) + sum( Psense * z[i,j,n] * qsens[i,j,n] for i in list(range(numDevices)) for j in list(range(numDevices)) for n in range(numChannels)) + sum( (-Pinterfere -(1-z[i,j,n])*M) * qint[i,j,n] for i in list(range(numDevices)) for j in list(range(numDevices)) for n in range(numChannels)) + sum( (delta*gamma-M*(1-z[i,j,n])) *qsnr[i,j,n] for i in list(range(numDevices)) for j in list(range(numDevices)) for n in range(numChannels))
Dualproblem.setObjective(sense=grb.GRB.MAXIMIZE,expr=(expr))
Dualproblem.setParam('InfUnbdInfo', 1) #for feasibility cut
Dualproblem.setParam('Method',0) #simplex method for dual
Dualproblem.update()
Dualproblem.optimize()
#print(Dualproblem.display())
print('Dualproblem.status',Dualproblem.status)
print('Dualproblem.ObjVal= ', Dualproblem.ObjVal)
if Dualproblem.status==grb.GRB.UNBOUNDED:
#print('in',Dualproblem.getConstrByName('sumq').getAttr("FarkasDual"))
dualsp=Dualproblem.getAttr('UnbdRay', Dualproblem.getVars())
sumpc_sol = Dualproblem.getAttr('UnbdRay', sumpc)
dual_sumpc = np.array([sumpc_sol[(i)] for i in range(numDevices)])
powerupperbound_sol = Dualproblem.getAttr('UnbdRay', powerupperbound)
dual_powerupperbound = np.array([powerupperbound_sol[(i),n] for i in range(numDevices) for n in range(numChannels)])
qdef_sol = Dualproblem.getAttr('UnbdRay', qdef)
dual_qdef = np.array([qdef_sol[(i),(j),n] for i in range(numDevices) for j in range(numDevices) for n in range(numChannels)])
qsens_sol = Dualproblem.getAttr('UnbdRay', qsens)
dual_qsens = np.array([qsens_sol[(i),(j),n] for i in range(numDevices) for j in range(numDevices) for n in range(numChannels)])
qint_sol = Dualproblem.getAttr('UnbdRay', qint)
dual_qint = np.array([qint_sol[(i),(j),n] for i in range(numDevices) for j in range(numDevices) for n in range(numChannels)])
qsnr_sol = Dualproblem.getAttr('UnbdRay', qsnr)
dual_qsnr = np.array([qsnr_sol[(i),(j),n] for i in range(numDevices) for j in range(numDevices) for n in range(numChannels)])
return dual_sumpc,dual_powerupperbound,dual_qdef,dual_qsens,dual_qint,dual_qsnr,Dualproblem.status,dualsp
alpha = sum( Pmax_radio * dual_sumpc[i] for i in range(numDevices)) + sum((Pinterfere + M) * dual_qint[i,j,n] for i in range(numDevices) for j in range(numDevices) for n in range(numChannels)) +sum(((delta * gamma) - M) * dual_qsnr[i,j,n] for i in range(numDevices) for j in range(numDevices) for n in range(numChannels))
beta_z=np.zeros((numDevices,numDevices,numChannels))
for j in range(numDevices):
for n in range(numChannels):
for i in range(numDevices):
beta_z[i,j,n] = Pmax_channel * dual_powerupperbound[i,n] + Psense * dual_qsens[i,j,n]- M * dual_qint[i,j,n] + M * dual_qsnr[i,j,n]
#beta_z[i,j,n] = Pmax_channel * dual_powerupperbound[i,n] + (Psense * dual_qsens[i,j,n]-M*dual_qint[i,j,n] )
#check the correctness of the cuts
#checking subproblem status and adding cuts
cutname='cut'+ str(outeriter)
if dual_feas == 5: #infeasible sub problem & unbounded dual
master.addConstr(alpha + sum(beta_z[i,j,n]*z[(i),(j),n] for i in range(numDevices) for j in range(numDevices) for n in range(numChannels)) <= 0 , name='feas'+str(outeriter))
-
Hi Zahra. What exactly is the error that is raised when you try and add the feasibility cut?
0 -
Hi Steven,
the error is Unable to retrieve attribute 'ObjVal' of Master problem and when I see the .lp result it because the feasibility cut I added is not feasible itself. (Z is a positive value)
feas1: 2.704 z(8,0,0) + 2.704 z(8,0,1) + 2.704 z(8,0,2) + 2.704 z(8,0,3)
+ 3.364 z(8,2,4) <= -100
Please sign in to leave a comment.
Comments
2 comments