[SCIP] Implementing no-good cuts that cuts off feasible solutions
Leon Eifler
eifler at zib.de
Thu Oct 19 08:05:08 CEST 2023
Hi Matheus,
I am a bit confused: Wouldn't the pruning of nodes using the objective
value of \bar{x} in your case be invalid since you have that nonlinear
part to consider? Is adding f to the model and solving a MINLP not an
option for you?
In any case, I wanted to mention that SCIP already contains a feature to
count/enumerate all integer-feasible solutions:
https://www.scipopt.org/doc/html/COUNTER.php#COLLECTALLFEASEBLES
I hope this helps,
Leon
Am 10/18/2023 um 8:42 PM schrieb Matheus Ota:
> Sorry, there is a problem in the way I phrased the question. The
> objective value of solution \bar{x} is not given by just c^T \bar{x},
> but by c^T \bar{x} + f(\bar{x}), where f is some non-linear function
> that I know how to compute whenever \bar{x} is feasible. So if solving
> the LP relaxation returns an integer feasible point \bar{x}, it does
> not necessarily mean that \bar{x} is optimal (because of the f(.)
> function). This f() function creates the need to enumerate with the
> no-good cuts.
>
> Em qua., 18 de out. de 2023 às 14:32, Matheus Ota
> <matheusota at gmail.com> escreveu:
>
> Dear SCIP Team,
>
> I want to implement a no-good cut (that cuts off a single integer
> point of the feasible region) but I don't know how to proceed.
> Suppose that I want to solve the following problem:
> (P) min cx
> s.t. Ax <= b
> x binary
>
> Suppose that \bar{x} is feasible for (P), then I can cut off just
> \bar{x} by using the "no-good cut"
> \sum_{i : \bar{x}_i = 0} x_i + \sum_{i : \bar{x}_i = 1} (1 - x_i)
> >= 1.
>
> Note that I'm not requesting the no-good cut to be feasible for
> (P). This is because I want to essentially use SCIP to enumerate
> the solutions. I want to do the following process:
> 1. Get a feasible solution \bar{x} to (P).
> 2. Compare \bar{x} with the best feasible solution found so far,
> and update the best solution found if \bar{x} is better than the
> current one.
> 3. Remove \bar{x} with a no-good cut.
>
> Since I'm always removing a feasible point, in the end of the
> branch-and-bound, it should return that the problem is infeasible.
> However, I don't want to simply "discard" \bar{x}. I want to use
> the objective value of \bar{x} to possibly prune more nodes of the
> branch-and-bound tree. Do you have any suggestions on how to
> implement this?
>
> The first idea that came to my mind was to branch whenever I find
> a feasible solution \bar{x}. Then in the left branch node I only
> have { \bar{x} } as the feasible region and in the right branch
> node I add the no-good cut that cuts off \bar{x}. The problem with
> this approach is that, if I'm on the left branch node, once I get
> a solution \bar{x} in the CONSCHECK method, I don't know how to
> differentiate if this is the first time that I've found \bar{x}
> (in which case I should branch) or if this is the second time that
> I've found it (in which case I'm on the left branch node, and I
> should just return that the solution is feasible). Also, I'm not
> totally sure that this is the "correct" approach to use.
>
> Sorry for the long email, and any help is appreciated.
>
> Best,
> Matheus
>
>
> _______________________________________________
> Scip mailing list
> Scip at zib.de
> https://listserv.zib.de/mailman/listinfo/scip
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listserv.zib.de/pipermail/scip/attachments/20231019/be7e55d0/attachment.html>
More information about the Scip
mailing list