Facility Location Problem  Standard BIP vs QUBO
Awaiting user inputHello,
I'm fairly new to the optimization world, and working on a research project that involves comparison of solving times for the standard uncapacitated facility location problem, using the following techniques:
1) As a standard BIP:
TotalFixedCost = gp.quicksum(fixedcost[i]*FacilitySelect[i] for i in facilities)
TotalServiceCost = gp.quicksum(servicecost[i,j]*ServiceSelect[i,j] for i in facilities for j in customers)
TotalCost = TotalFixedCost + TotalServiceCost
m.setObjective(TotalCost , GRB.MINIMIZE)
2) As a quadratic unconstrained binary optimization (QUBO) model with a penalty function:
TotalFixedCost = gp.quicksum(fixedcost[i]*FacilitySelect[i] for i in facilities)
TotalServiceCost = gp.quicksum(servicecost[i,j]*ServiceSelect[i,j] for i in facilities for j in customers)
Cost = TotalFixedCost + TotalServiceCost
Penalty1 = p*(gp.quicksum((1gp.quicksum(ServiceSelect[i,j] for i in facilities))*(1gp.quicksum(ServiceSelect[i,j] for i in facilities)) for j in customers))
Penalty2 = p*(gp.quicksum(ServiceSelect[i,j]  ServiceSelect[i,j]*FacilitySelect[i] for i in facilities for j in customers))
TotalCost = Cost + Penalty1 + Penalty2
m.setObjective(TotalCost , GRB.MINIMIZE)
3) As a quadratic unconstrained binary optimization (QUBO) model, solving the xTQx objective, (with the Q matrix given as input):
x = m.addVars(Q.shape[0], vtype=gp.GRB.BINARY)
objective = gp.quicksum(x[i] * x[j] * Q[i, j] for i in range(Q.shape[0]) for j in range(Q.shape[0]))
m.setObjective(objective, gp.GRB.MINIMIZE)
Using the standard BIP formulation, Gurobi is able to solve my sample problem sets instantly with 0 gap. However, the 2 QUBO methods take very long times for the same sets, and have large gaps (especially the penalty function method  in the 1000s).
Is it normal to have large optimality gaps while using the QUBO solver? Do i need to tweak any setting to tune the solver?

Hi Abishek,
In your BIP formulation, you don't have any constraints. There is only a linear objective function, thus the model is easy to solve.
In your QUBO with penalty function, you introduce 2 constraints via penalties. The constraints are enforced because the penalty is bigger if they are not fulfilled.
The first constraint is in \(\texttt{Penalty1}\) and reads
\[\begin{align*}
\sum_{i} \text{ServiceSelect}_{i,j} = 1 \quad \forall j
\end{align*}\]and the constraint hidden in \(\texttt{Penalty2}\) reads
\[\begin{align*}
\sum_{i,j} (\text{ServiceSelect}_{i,j}  \text{ServiceSelect}_{i,j} *\text{FacilitySelect}_{i,j} = 0
\end{align*}\]I don't know about the second QUBO formulation as no details about \(Q\) are given but I assume that something similar is happening.
Best regards,
Jaromił0 
Thank you Jaromil. I do have constraints in the BIP model, i have just shown the objective function above. The constraints used are:
for i in facilities:
for j in customers:
m.addConstr(ServiceSelect[i,j] <= FacilitySelect[i], 'Constraint1')
for j in customers:
m.addConstr(gp.quicksum((ServiceSelect[i,j]) for i in facilities) == 1 , 'Constraint2')For the second QUBO formulation, I am manually generating the Q matrix using logically assumed penalties based on research. Once the Q matrix is generated, i do the following:
Q = np.array(Q)
x = m.addVars(Q.shape[0], vtype=gp.GRB.BINARY)
objective = gp.quicksum(x[i] * x[j] * Q[i, j] for i in range(Q.shape[0]) for j in range(Q.shape[0]))
m.setObjective(objective, gp.GRB.MINIMIZE)What I am trying to understand is, are there any specific tuning/tweaking parameters that I need to invoke to solve QUBO models in Gurobi?
0 
In your BIP formulation, you have the constraints
for i in facilities:
for j in customers:
m.addConstr(ServiceSelect[i,j] <= FacilitySelect[i], 'Constraint1')I don't see how these constraints translate into the penalty term
Penalty2 = p*(gp.quicksum(ServiceSelect[i,j]  ServiceSelect[i,j]*FacilitySelect[i] for i in facilities for j in customers))
Where does the bilinear term ServiceSelect[i,j]*FacilitySelect[i] come from?
Could you share the logs for the 3 runs?
What I am trying to understand is, are there any specific tuning/tweaking parameters that I need to invoke to solve QUBO models in Gurobi?
You should definitely use the latest Gurobi version if you are solving QUBOs. You could try experimenting with the PreQLinearize parameter.
0
Please sign in to leave a comment.
Comments
3 comments