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))
-
Official comment
This post is more than two years old. Some information may not be up to date. For current information, please check the Gurobi Documentation or Knowledge Base. If you need more help, please create a new post in the community forum, or try Gurobot, our chatbot interface offering instant, expert-level support. -
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
Post is closed for comments.
Comments
3 comments