|
1 %* glpk05.tex *% |
|
2 |
|
3 \chapter{Branch-and-Cut API Routines} |
|
4 |
|
5 \section{Introduction} |
|
6 |
|
7 \subsection{Using the callback routine} |
|
8 |
|
9 The GLPK MIP solver based on the branch-and-cut method allows the |
|
10 application program to control the solution process. This is attained |
|
11 by means of the user-defined callback routine, which is called by the |
|
12 solver at various points of the branch-and-cut algorithm. |
|
13 |
|
14 The callback routine passed to the MIP solver should be written by the |
|
15 user and has the following specification:\footnote{The name |
|
16 {\tt foo\_bar} used here is a placeholder for the callback routine |
|
17 name.} |
|
18 |
|
19 \begin{verbatim} |
|
20 void foo_bar(glp_tree *tree, void *info); |
|
21 \end{verbatim} |
|
22 |
|
23 \noindent |
|
24 where \verb|tree| is a pointer to the data structure \verb|glp_tree|, |
|
25 which should be used on subsequent calls to branch-and-cut interface |
|
26 routines, and \verb|info| is a transit pointer passed to the routine |
|
27 \verb|glp_intopt|, which may be used by the application program to pass |
|
28 some external data to the callback routine. |
|
29 |
|
30 The callback routine is passed to the MIP solver through the control |
|
31 parameter structure \verb|glp_iocp| (see Chapter ``Basic API Routines'', |
|
32 Section ``Mixed integer programming routines'', Subsection ``Solve MIP |
|
33 problem with the branch-and-cut method'') as follows: |
|
34 |
|
35 \newpage |
|
36 |
|
37 \begin{verbatim} |
|
38 glp_prob *mip; |
|
39 glp_iocp parm; |
|
40 . . . |
|
41 glp_init_iocp(&parm); |
|
42 . . . |
|
43 parm.cb_func = foo_bar; |
|
44 parm.cb_info = ... ; |
|
45 ret = glp_intopt(mip, &parm); |
|
46 . . . |
|
47 \end{verbatim} |
|
48 |
|
49 To determine why it is being called by the MIP solver the callback |
|
50 routine should use the routine \verb|glp_ios_reason| (described in this |
|
51 section below), which returns a code indicating the reason for calling. |
|
52 Depending on the reason the callback routine may perform necessary |
|
53 actions to control the solution process. |
|
54 |
|
55 The reason codes, which correspond to various point of the |
|
56 branch-and-cut algorithm implemented in the MIP solver, are described |
|
57 in Subsection ``Reasons for calling the callback routine'' below. |
|
58 |
|
59 To ignore calls for reasons, which are not processed by the callback |
|
60 routine, it should just return to the MIP solver doing nothing. For |
|
61 example: |
|
62 |
|
63 \begin{verbatim} |
|
64 void foo_bar(glp_tree *tree, void *info) |
|
65 { . . . |
|
66 switch (glp_ios_reason(tree)) |
|
67 { case GLP_IBRANCH: |
|
68 . . . |
|
69 break; |
|
70 case GLP_ISELECT: |
|
71 . . . |
|
72 break; |
|
73 default: |
|
74 /* ignore call for other reasons */ |
|
75 break; |
|
76 } |
|
77 return; |
|
78 } |
|
79 \end{verbatim} |
|
80 |
|
81 To control the solution process as well as to obtain necessary |
|
82 information the callback routine may use the branch-and-cut API |
|
83 routines described in this chapter. Names of all these routines begin |
|
84 with `\verb|glp_ios_|'. |
|
85 |
|
86 \subsection{Branch-and-cut algorithm} |
|
87 |
|
88 This section gives a schematic description of the branch-and-cut |
|
89 algorithm as it is implemented in the GLPK MIP solver. |
|
90 |
|
91 \medskip |
|
92 |
|
93 {\it 1. Initialization} |
|
94 |
|
95 Set $L:=\{P_0\}$, where $L$ is the {\it active list} (i.e. the list of |
|
96 active subproblems), $P_0$ is the original MIP problem to be solved. |
|
97 |
|
98 Set $z^{\it best}:=+\infty$ (in case of minimization) or |
|
99 $z^{\it best}:=-\infty$ (in case of maximization), where $z^{\it best}$ |
|
100 is {\it incumbent value}, i.e. an upper (minimization) or lower |
|
101 (maximization) global bound for $z^{\it opt}$, the optimal objective |
|
102 value for $P^0$. |
|
103 |
|
104 \medskip |
|
105 |
|
106 {\it 2. Subproblem selection} |
|
107 |
|
108 If $L=\varnothing$ then GO TO 9. |
|
109 |
|
110 Select $P\in L$, i.e. make active subproblem $P$ current. |
|
111 |
|
112 \medskip |
|
113 |
|
114 {\it 3. Solving LP relaxation} |
|
115 |
|
116 Solve $P^{\it LP}$, which is LP relaxation of $P$. |
|
117 |
|
118 If $P^{\it LP}$ has no primal feasible solution then GO TO 8. |
|
119 |
|
120 Let $z^{\it LP}$ be the optimal objective value for $P^{\it LP}$. |
|
121 |
|
122 If $z^{\it LP}\geq z^{\it best}$ (in case of minimization) or |
|
123 $z^{\it LP}\leq z^{\rm best}$ (in case of maximization) then GO TO 8. |
|
124 |
|
125 \medskip |
|
126 |
|
127 {\it 4. Adding ``lazy'' constraints} |
|
128 |
|
129 Let $x^{\it LP}$ be the optimal solution to $P^{\it LP}$. |
|
130 |
|
131 If there are ``lazy'' constraints (i.e. essential constraints not |
|
132 included in the original MIP problem $P_0$), which are violated at the |
|
133 optimal point $x^{\it LP}$, add them to $P$, and GO TO 3. |
|
134 |
|
135 \medskip |
|
136 |
|
137 {\it 5. Check for integrality} |
|
138 |
|
139 Let $x_j$ be a variable, which is required to be integer, and let |
|
140 $x^{\it LP}_j\in x^{\it LP}$ be its value in the optimal solution to |
|
141 $P^{\it LP}$. |
|
142 |
|
143 If $x^{\it LP}_j$ are integral for all integer variables, then a better |
|
144 integer feasible solution is found. Store its components, set |
|
145 $z^{\it best}:=z^{\it LP}$, and GO TO 8. |
|
146 |
|
147 \medskip |
|
148 |
|
149 {\it 6. Adding cutting planes} |
|
150 |
|
151 If there are cutting planes (i.e. valid constraints for $P$), |
|
152 which are violated at the optimal point $x^{\it LP}$, add them to $P$, |
|
153 and GO TO 3. |
|
154 |
|
155 \medskip |
|
156 |
|
157 {\it 7. Branching} |
|
158 |
|
159 Select {\it branching variable} $x_j$, i.e. a variable, which is |
|
160 required to be integer, and whose value $x^{\it LP}_j\in x^{\it LP}$ is |
|
161 fractional in the optimal solution to $P^{\it LP}$. |
|
162 |
|
163 Create new subproblem $P^D$ (so called {\it down branch}), which is |
|
164 identical to the current subproblem $P$ with exception that the upper |
|
165 bound of $x_j$ is replaced by $\lfloor x^{\it LP}_j\rfloor$. (For |
|
166 example, if $x^{\it LP}_j=3.14$, the new upper bound of $x_j$ in the |
|
167 down branch will be $\lfloor 3.14\rfloor=3$.) |
|
168 |
|
169 Create new subproblem $P^U$ (so called {\it up branch}), which is |
|
170 identical to the current subproblem $P$ with exception that the lower |
|
171 bound of $x_j$ is replaced by $\lceil x^{\it LP}_j\rceil$. (For example, |
|
172 if $x^{\it LP}_j=3.14$, the new lower bound of $x_j$ in the up branch |
|
173 will be $\lceil 3.14\rceil=4$.) |
|
174 |
|
175 Set $L:=(L\backslash\{P\})\cup\{P^D,P^U\}$, i.e. remove the current |
|
176 subproblem $P$ from the active list $L$ and add two new subproblems |
|
177 $P^D$ and $P^U$ to it. Then GO TO 2. |
|
178 |
|
179 \medskip |
|
180 |
|
181 {\it 8. Pruning} |
|
182 |
|
183 Remove from the active list $L$ all subproblems (including the current |
|
184 one), whose local bound $\widetilde{z}$ is not better than the global |
|
185 bound $z^{\it best}$, i.e. set $L:=L\backslash\{P\}$ for all $P$, where |
|
186 $\widetilde{z}\geq z^{\it best}$ (in case of minimization) or |
|
187 $\widetilde{z}\leq z^{\it best}$ (in case of maximization), and then |
|
188 GO TO 2. |
|
189 |
|
190 The local bound $\widetilde{z}$ for subproblem $P$ is an lower |
|
191 (minimization) or upper (maximization) bound for integer optimal |
|
192 solution to {\it this} subproblem (not to the original problem). This |
|
193 bound is local in the sense that only subproblems in the subtree rooted |
|
194 at node $P$ cannot have better integer feasible solutions. Note that |
|
195 the local bound is not necessarily the optimal objective value to LP |
|
196 relaxation $P^{\it LP}$. |
|
197 |
|
198 \medskip |
|
199 |
|
200 {\it 9. Termination} |
|
201 |
|
202 If $z^{\it best}=+\infty$ (in case of minimization) or |
|
203 $z^{\it best}=-\infty$ (in case of maximization), the original problem |
|
204 $P_0$ has no integer feasible solution. Otherwise, the last integer |
|
205 feasible solution stored on step 5 is the integer optimal solution to |
|
206 the original problem $P_0$ with $z^{\it opt}=z^{\it best}$. STOP. |
|
207 |
|
208 \subsection{The search tree} |
|
209 |
|
210 On the branching step of the branch-and-cut algorithm the current |
|
211 subproblem is divided into two\footnote{In more general cases the |
|
212 current subproblem may be divided into more than two subproblems. |
|
213 However, currently such feature is not used in GLPK.} new subproblems, |
|
214 so the set of all subproblems can be represented in the form of a rooted |
|
215 tree, which is called the {\it search} or {\it branch-and-bound} tree. |
|
216 An example of the search tree is shown on Fig.~1. Each node of the |
|
217 search tree corresponds to a subproblem, so the terms `node' and |
|
218 `subproblem' may be used synonymously. |
|
219 |
|
220 \newpage |
|
221 |
|
222 \begin{figure}[t] |
|
223 \noindent\hfil |
|
224 \xymatrix @R=20pt @C=10pt |
|
225 {&&&&&&*+<14pt>[o][F=]{A}\ar@{-}[dllll]\ar@{-}[dr]\ar@{-}[drrrr]&&&&\\ |
|
226 &&*+<14pt>[o][F=]{B}\ar@{-}[dl]\ar@{-}[dr]&&&&&*+<14pt>[o][F=]{C} |
|
227 \ar@{-}[dll]\ar@{-}[dr]\ar@{-}[drrr]&&&*+<14pt>[o][F-]{\times}\\ |
|
228 &*+<14pt>[o][F-]{\times}\ar@{-}[dl]\ar@{-}[d]\ar@{-}[dr]&& |
|
229 *+<14pt>[o][F-]{D}&&*+<14pt>[o][F=]{E}\ar@{-}[dl]\ar@{-}[dr]&&& |
|
230 *+<14pt>[o][F=]{F}\ar@{-}[dl]\ar@{-}[dr]&&*+<14pt>[o][F-]{G}\\ |
|
231 *+<14pt>[o][F-]{\times}&*+<14pt>[o][F-]{\times}&*+<14pt>[o][F-]{\times} |
|
232 &&*+<14pt>[][F-]{H}&&*+<14pt>[o][F-]{I}&*+<14pt>[o][F-]{\times}&& |
|
233 *+<14pt>[o][F-]{J}&\\} |
|
234 |
|
235 \bigskip |
|
236 |
|
237 \noindent\hspace{.8in} |
|
238 \xymatrix @R=11pt |
|
239 {*+<20pt>[][F-]{}&*\txt{\makebox[1in][l]{Current}}&& |
|
240 *+<20pt>[o][F-]{}&*\txt{\makebox[1in][l]{Active}}\\ |
|
241 *+<20pt>[o][F=]{}&*\txt{\makebox[1in][l]{Non-active}}&& |
|
242 *+<14pt>[o][F-]{\times}&*\txt{\makebox[1in][l]{Fathomed}}\\ |
|
243 } |
|
244 |
|
245 \begin{center} |
|
246 Fig. 1. An example of the search tree. |
|
247 \end{center} |
|
248 \end{figure} |
|
249 |
|
250 In GLPK each node may have one of the following four statuses: |
|
251 |
|
252 $\bullet$ {\it current node} is the active node currently being |
|
253 processed; |
|
254 |
|
255 $\bullet$ {\it active node} is a leaf node, which still has to be |
|
256 processed; |
|
257 |
|
258 $\bullet$ {\it non-active node} is a node, which has been processed, |
|
259 but not fathomed; |
|
260 |
|
261 $\bullet$ {\it fathomed node} is a node, which has been processed and |
|
262 fathomed. |
|
263 |
|
264 In the data structure representing the search tree GLPK keeps only |
|
265 current, active, and non-active nodes. Once a node has been fathomed, |
|
266 it is removed from the tree data structure. |
|
267 |
|
268 Being created each node of the search tree is assigned a distinct |
|
269 positive integer called the {\it subproblem reference number}, which |
|
270 may be used by the application program to specify a particular node of |
|
271 the tree. The root node corresponding to the original problem to be |
|
272 solved is always assigned the reference number 1. |
|
273 |
|
274 \subsection{Current subproblem} |
|
275 |
|
276 The current subproblem is a MIP problem corresponding to the current |
|
277 node of the search tree. It is represented as the GLPK problem object |
|
278 (\verb|glp_prob|) that allows the application program using API routines |
|
279 to access its content in the standard way. If the MIP presolver is not |
|
280 used, it is the original problem object passed to the routine |
|
281 \verb|glp_intopt|; otherwise, it is an internal problem object built by |
|
282 the MIP presolver. |
|
283 |
|
284 Note that the problem object is used by the MIP solver itself during |
|
285 the solution process for various purposes (to solve LP relaxations, to |
|
286 perfom branching, etc.), and even if the MIP presolver is not used, the |
|
287 current content of the problem object may differ from its original |
|
288 content. For example, it may have additional rows, bounds of some rows |
|
289 and columns may be changed, etc. In particular, LP segment of the |
|
290 problem object corresponds to LP relaxation of the current subproblem. |
|
291 However, on exit from the MIP solver the content of the problem object |
|
292 is restored to its original state. |
|
293 |
|
294 To obtain information from the problem object the application program |
|
295 may use any API routines, which do not change the object. Using API |
|
296 routines, which change the problem object, is restricted to stipulated |
|
297 cases. |
|
298 |
|
299 \subsection{The cut pool} |
|
300 |
|
301 The {\it cut pool} is a set of cutting plane constraints maintained by |
|
302 the MIP solver. It is used by the GLPK cut generation routines and may |
|
303 be used by the application program in the same way, i.e. rather than |
|
304 to add cutting plane constraints directly to the problem object the |
|
305 application program may store them to the cut pool. In the latter case |
|
306 the solver looks through the cut pool, selects efficient constraints, |
|
307 and adds them to the problem object. |
|
308 |
|
309 \subsection{Reasons for calling the callback routine} |
|
310 |
|
311 The callback routine may be called by the MIP solver for the following |
|
312 reasons. |
|
313 |
|
314 \subsubsection*{Request for subproblem selection} |
|
315 |
|
316 The callback routine is called with the reason code \verb|GLP_ISELECT| |
|
317 if the current subproblem has been fathomed and therefore there is no |
|
318 current subproblem. |
|
319 |
|
320 In response the callback routine may select some subproblem from the |
|
321 active list and pass its reference number to the solver using the |
|
322 routine \verb|glp_ios_select_node|, in which case the solver continues |
|
323 the search from the specified active subproblem. If no selection is made |
|
324 by the callback routine, the solver uses a backtracking technique |
|
325 specified by the control parameter \verb|bt_tech|. |
|
326 |
|
327 To explore the active list (i.e. active nodes of the branch-and-bound |
|
328 tree) the callback routine may use the routines \verb|glp_ios_next_node| |
|
329 and \verb|glp_ios_prev_node|. |
|
330 |
|
331 \subsubsection*{Request for preprocessing} |
|
332 |
|
333 The callback routine is called with the reason code \verb|GLP_IPREPRO| |
|
334 if the current subproblem has just been selected from the active list |
|
335 and its LP relaxation is not solved yet. |
|
336 |
|
337 In response the callback routine may perform some preprocessing of the |
|
338 current subproblem like tightening bounds of some variables or removing |
|
339 bounds of some redundant constraints. |
|
340 |
|
341 \subsubsection*{Request for row generation} |
|
342 |
|
343 The callback routine is called with the reason code \verb|GLP_IROWGEN| |
|
344 if LP relaxation of the current subproblem has just been solved to |
|
345 optimality and its objective value is better than the best known integer |
|
346 feasible solution. |
|
347 |
|
348 In response the callback routine may add one or more ``lazy'' |
|
349 constraints (rows), which are violated by the current optimal solution |
|
350 of LP relaxation, using API routines \verb|glp_add_rows|, |
|
351 \verb|glp_set_row_name|, \verb|glp_set_row_bnds|, and |
|
352 \verb|glp_set_mat_row|, in which case the solver will perform |
|
353 re-optimization of LP relaxation. If there are no violated constraints, |
|
354 the callback routine should just return. |
|
355 |
|
356 Optimal solution components for LP relaxation can be obtained with API |
|
357 routines \verb|glp_get_obj_val|, \verb|glp_get_row_prim|, |
|
358 \verb|glp_get_row_dual|, \verb|glp_get_col_prim|, and |
|
359 \verb|glp_get_col_dual|. |
|
360 |
|
361 \subsubsection*{Request for heuristic solution} |
|
362 |
|
363 The callback routine is called with the reason code \verb|GLP_IHEUR| |
|
364 if LP relaxation of the current subproblem being solved to optimality |
|
365 is integer infeasible (i.e. values of some structural variables of |
|
366 integer kind are fractional), though its objective value is better than |
|
367 the best known integer feasible solution. |
|
368 |
|
369 In response the callback routine may try applying a primal heuristic |
|
370 to find an integer feasible solution,\footnote{Integer feasible to the |
|
371 original MIP problem, not to the current subproblem.} which is better |
|
372 than the best known one. In case of success the callback routine may |
|
373 store such better solution in the problem object using the routine |
|
374 \verb|glp_ios_heur_sol|. |
|
375 |
|
376 \subsubsection*{Request for cut generation} |
|
377 |
|
378 The callback routine is called with the reason code \verb|GLP_ICUTGEN| |
|
379 if LP relaxation of the current subproblem being solved to optimality |
|
380 is integer infeasible (i.e. values of some structural variables of |
|
381 integer kind are fractional), though its objective value is better than |
|
382 the best known integer feasible solution. |
|
383 |
|
384 In response the callback routine may reformulate the {\it current} |
|
385 subproblem (before it will be splitted up due to branching) by adding to |
|
386 the problem object one or more {\it cutting plane constraints}, which |
|
387 cut off the fractional optimal point from the MIP |
|
388 polytope.\footnote{Since these constraints are added to the current |
|
389 subproblem, they may be globally as well as locally valid.} |
|
390 |
|
391 Adding cutting plane constraints may be performed in two ways. |
|
392 One way is the same as for the reason code \verb|GLP_IROWGEN| (see |
|
393 above), in which case the callback routine adds new rows corresponding |
|
394 to cutting plane constraints directly to the current subproblem. |
|
395 |
|
396 The other way is to add cutting plane constraints to the {\it cut pool}, |
|
397 a set of cutting plane constraints maintained by the solver, rather than |
|
398 directly to the current subproblem. In this case after return from the |
|
399 callback routine the solver looks through the cut pool, selects |
|
400 efficient cutting plane constraints, adds them to the current |
|
401 subproblem, drops other constraints, and then performs re-optimization. |
|
402 |
|
403 \subsubsection*{Request for branching} |
|
404 |
|
405 The callback routine is called with the reason code \verb|GLP_IBRANCH| |
|
406 if LP relaxation of the current subproblem being solved to optimality |
|
407 is integer infeasible (i.e. values of some structural variables of |
|
408 integer kind are fractional), though its objective value is better than |
|
409 the best known integer feasible solution. |
|
410 |
|
411 In response the callback routine may choose some variable suitable for |
|
412 branching (i.e. integer variable, whose value in optimal solution to |
|
413 LP relaxation of the current subproblem is fractional) and pass its |
|
414 ordinal number to the solver using the routine |
|
415 \verb|glp_ios_branch_upon|, in which case the solver splits the current |
|
416 subproblem in two new subproblems and continues the search. If no choice |
|
417 is made by the callback routine, the solver uses a branching technique |
|
418 specified by the control parameter \verb|br_tech|. |
|
419 |
|
420 \subsubsection*{Better integer solution found} |
|
421 |
|
422 The callback routine is called with the reason code \verb|GLP_IBINGO| |
|
423 if LP relaxation of the current subproblem being solved to optimality |
|
424 is integer feasible (i.e. values of all structural variables of integer |
|
425 kind are integral within the working precision) and its objective value |
|
426 is better than the best known integer feasible solution. |
|
427 |
|
428 Optimal solution components for LP relaxation can be obtained in the |
|
429 same way as for the reason code \verb|GLP_IROWGEN| (see above). |
|
430 |
|
431 Components of the new MIP solution can be obtained with API routines |
|
432 \verb|glp_mip_obj_val|, \verb|glp_mip_row_val|, and |
|
433 \verb|glp_mip_col_val|. Note, however, that due to row/cut generation |
|
434 there may be additional rows in the problem object. |
|
435 |
|
436 The difference between optimal solution to LP relaxation and |
|
437 corresponding MIP solution is that in the former case some structural |
|
438 variables of integer kind (namely, basic variables) may have values, |
|
439 which are close to nearest integers within the working precision, while |
|
440 in the latter case all such variables have exact integral values. |
|
441 |
|
442 The reason \verb|GLP_IBINGO| is intended only for informational |
|
443 purposes, so the callback routine should not modify the problem object |
|
444 in this case. |
|
445 |
|
446 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
447 |
|
448 \newpage |
|
449 |
|
450 \section{Basic routines} |
|
451 |
|
452 \subsection{glp\_ios\_reason---determine reason for calling the |
|
453 callback routine} |
|
454 |
|
455 \subsubsection*{Synopsis} |
|
456 |
|
457 \begin{verbatim} |
|
458 int glp_ios_reason(glp_tree *tree); |
|
459 \end{verbatim} |
|
460 |
|
461 \subsubsection*{Returns} |
|
462 |
|
463 The routine \verb|glp_ios_reason| returns a code, which indicates why |
|
464 the user-defined callback routine is being called: |
|
465 |
|
466 \verb|GLP_ISELECT|---request for subproblem selection; |
|
467 |
|
468 \verb|GLP_IPREPRO|---request for preprocessing; |
|
469 |
|
470 \verb|GLP_IROWGEN|---request for row generation; |
|
471 |
|
472 \verb|GLP_IHEUR |---request for heuristic solution; |
|
473 |
|
474 \verb|GLP_ICUTGEN|---request for cut generation; |
|
475 |
|
476 \verb|GLP_IBRANCH|---request for branching; |
|
477 |
|
478 \verb|GLP_IBINGO |---better integer solution found. |
|
479 |
|
480 \subsection{glp\_ios\_get\_prob---access the problem object} |
|
481 |
|
482 \subsubsection*{Synopsis} |
|
483 |
|
484 \begin{verbatim} |
|
485 glp_prob *glp_ios_get_prob(glp_tree *tree); |
|
486 \end{verbatim} |
|
487 |
|
488 \subsubsection*{Description} |
|
489 |
|
490 The routine \verb|glp_ios_get_prob| can be called from the user-defined |
|
491 callback routine to access the problem object, which is used by the MIP |
|
492 solver. It is the original problem object passed to the routine |
|
493 \verb|glp_intopt| if the MIP presolver is not used; otherwise it is an |
|
494 internal problem object built by the presolver. |
|
495 |
|
496 \subsubsection*{Returns} |
|
497 |
|
498 The routine \verb|glp_ios_get_prob| returns a pointer to the problem |
|
499 object used by the MIP solver. |
|
500 |
|
501 \subsubsection*{Comments} |
|
502 |
|
503 To obtain various information about the problem instance the callback |
|
504 routine can access the problem object (i.e. the object of type |
|
505 \verb|glp_prob|) using the routine \verb|glp_ios_get_prob|. It is the |
|
506 original problem object passed to the routine \verb|glp_intopt| if the |
|
507 MIP presolver is not used; otherwise it is an internal problem object |
|
508 built by the presolver. |
|
509 |
|
510 \subsection{glp\_ios\_row\_attr---determine additional row attributes} |
|
511 |
|
512 \subsubsection*{Synopsis} |
|
513 |
|
514 \begin{verbatim} |
|
515 void glp_ios_row_attr(glp_tree *tree, int i, glp_attr *attr); |
|
516 \end{verbatim} |
|
517 |
|
518 \subsubsection*{Description} |
|
519 |
|
520 The routine \verb|glp_ios_row_attr| retrieves additional attributes of |
|
521 $i$-th row of the current subproblem and stores them in the structure |
|
522 \verb|glp_attr|, which the parameter \verb|attr| points to. |
|
523 |
|
524 The structure \verb|glp_attr| has the following fields: |
|
525 |
|
526 \medskip |
|
527 |
|
528 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
529 \multicolumn{2}{@{}l}{{\tt int level}}\\ |
|
530 &Subproblem level at which the row was created. (If \verb|level| = 0, |
|
531 the row was added either to the original problem object passed to the |
|
532 routine \verb|glp_intopt| or to the root subproblem on generating |
|
533 ``lazy'' or/and cutting plane constraints.)\\ |
|
534 \end{tabular} |
|
535 |
|
536 \medskip |
|
537 |
|
538 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
539 \multicolumn{2}{@{}l}{{\tt int origin}}\\ |
|
540 &The row origin flag:\\ |
|
541 &\verb|GLP_RF_REG |---regular constraint;\\ |
|
542 &\verb|GLP_RF_LAZY|---``lazy'' constraint;\\ |
|
543 &\verb|GLP_RF_CUT |---cutting plane constraint.\\ |
|
544 \end{tabular} |
|
545 |
|
546 \medskip |
|
547 |
|
548 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
549 \multicolumn{2}{@{}l}{{\tt int klass}}\\ |
|
550 &The row class descriptor, which is a number passed to the routine |
|
551 \verb|glp_ios_add_row| as its third parameter. If the row is a cutting |
|
552 plane constraint generated by the solver, its class may be the |
|
553 following:\\ |
|
554 &\verb|GLP_RF_GMI |---Gomory's mixed integer cut;\\ |
|
555 &\verb|GLP_RF_MIR |---mixed integer rounding cut;\\ |
|
556 &\verb|GLP_RF_COV |---mixed cover cut;\\ |
|
557 &\verb|GLP_RF_CLQ |---clique cut.\\ |
|
558 \end{tabular} |
|
559 |
|
560 \newpage |
|
561 |
|
562 \subsection{glp\_ios\_mip\_gap---compute relative MIP gap} |
|
563 |
|
564 \subsubsection*{Synopsis} |
|
565 |
|
566 \begin{verbatim} |
|
567 double glp_ios_mip_gap(glp_tree *tree); |
|
568 \end{verbatim} |
|
569 |
|
570 \subsubsection*{Description} |
|
571 |
|
572 The routine \verb|glp_ios_mip_gap| computes the relative MIP gap (also |
|
573 called {\it duality gap}) with the following formula: |
|
574 $${\tt gap} = \frac{|{\tt best\_mip} - {\tt best\_bnd}|} |
|
575 {|{\tt best\_mip}| + {\tt DBL\_EPSILON}}$$ |
|
576 where \verb|best_mip| is the best integer feasible solution found so |
|
577 far, \verb|best_bnd| is the best (global) bound. If no integer feasible |
|
578 solution has been found yet, \verb|gap| is set to \verb|DBL_MAX|. |
|
579 |
|
580 \subsubsection*{Returns} |
|
581 |
|
582 The routine \verb|glp_ios_mip_gap| returns the relative MIP gap. |
|
583 |
|
584 \subsubsection*{Comments} |
|
585 |
|
586 The relative MIP gap is used to measure the quality of the best integer |
|
587 feasible solution found so far, because the optimal solution value |
|
588 $z^*$ for the original MIP problem always lies in the range |
|
589 $${\tt best\_bnd}\leq z^*\leq{\tt best\_mip}$$ |
|
590 in case of minimization, or in the range |
|
591 $${\tt best\_mip}\leq z^*\leq{\tt best\_bnd}$$ |
|
592 in case of maximization. |
|
593 |
|
594 To express the relative MIP gap in percents the value returned by the |
|
595 routine \verb|glp_ios_mip_gap| should be multiplied by 100\%. |
|
596 |
|
597 \newpage |
|
598 |
|
599 \subsection{glp\_ios\_node\_data---access application-specific data} |
|
600 |
|
601 \subsubsection*{Synopsis} |
|
602 |
|
603 \begin{verbatim} |
|
604 void *glp_ios_node_data(glp_tree *tree, int p); |
|
605 \end{verbatim} |
|
606 |
|
607 \subsubsection*{Description} |
|
608 |
|
609 The routine \verb|glp_ios_node_data| allows the application accessing a |
|
610 memory block allocated for the subproblem (which may be active or |
|
611 inactive), whose reference number is $p$. |
|
612 |
|
613 The size of the block is defined by the control parameter \verb|cb_size| |
|
614 passed to the routine \verb|glp_intopt|. The block is initialized by |
|
615 binary zeros on creating corresponding subproblem, and its contents is |
|
616 kept until the subproblem will be removed from the tree. |
|
617 |
|
618 The application may use these memory blocks to store specific data for |
|
619 each subproblem. |
|
620 |
|
621 \subsubsection*{Returns} |
|
622 |
|
623 The routine \verb|glp_ios_node_data| returns a pointer to the memory |
|
624 block for the specified subproblem. Note that if \verb|cb_size| = 0, the |
|
625 routine returns a null pointer. |
|
626 |
|
627 \subsection{glp\_ios\_select\_node---select subproblem to continue the |
|
628 search} |
|
629 |
|
630 \subsubsection*{Synopsis} |
|
631 |
|
632 \begin{verbatim} |
|
633 void glp_ios_select_node(glp_tree *tree, int p); |
|
634 \end{verbatim} |
|
635 |
|
636 \subsubsection*{Description} |
|
637 |
|
638 The routine \verb|glp_ios_select_node| can be called from the |
|
639 user-defined callback routine in response to the reason |
|
640 \verb|GLP_ISELECT| to select an active subproblem, whose reference |
|
641 number is $p$. The search will be continued from the subproblem |
|
642 selected. |
|
643 |
|
644 \newpage |
|
645 |
|
646 \subsection{glp\_ios\_heur\_sol---provide solution found by heuristic} |
|
647 |
|
648 \subsubsection*{Synopsis} |
|
649 |
|
650 \begin{verbatim} |
|
651 int glp_ios_heur_sol(glp_tree *tree, const double x[]); |
|
652 \end{verbatim} |
|
653 |
|
654 \subsubsection*{Description} |
|
655 |
|
656 The routine \verb|glp_ios_heur_sol| can be called from the user-defined |
|
657 callback routine in response to the reason \verb|GLP_IHEUR| to provide |
|
658 an integer feasible solution found by a primal heuristic. |
|
659 |
|
660 Primal values of {\it all} variables (columns) found by the heuristic |
|
661 should be placed in locations $x[1]$, \dots, $x[n]$, where $n$ is the |
|
662 number of columns in the original problem object. Note that the routine |
|
663 \verb|glp_ios_heur_sol| does {\it not} check primal feasibility of the |
|
664 solution provided. |
|
665 |
|
666 Using the solution passed in the array $x$ the routine computes value |
|
667 of the objective function. If the objective value is better than the |
|
668 best known integer feasible solution, the routine computes values of |
|
669 auxiliary variables (rows) and stores all solution components in the |
|
670 problem object. |
|
671 |
|
672 \subsubsection*{Returns} |
|
673 |
|
674 If the provided solution is accepted, the routine |
|
675 \verb|glp_ios_heur_sol| returns zero. Otherwise, if the provided |
|
676 solution is rejected, the routine returns non-zero. |
|
677 |
|
678 \subsection{glp\_ios\_can\_branch---check if can branch upon specified |
|
679 variable} |
|
680 |
|
681 \subsubsection*{Synopsis} |
|
682 |
|
683 \begin{verbatim} |
|
684 int glp_ios_can_branch(glp_tree *tree, int j); |
|
685 \end{verbatim} |
|
686 |
|
687 \subsubsection*{Returns} |
|
688 |
|
689 If $j$-th variable (column) can be used to branch upon, the routine |
|
690 returns non-zero, otherwise zero. |
|
691 |
|
692 \newpage |
|
693 |
|
694 \subsection{glp\_ios\_branch\_upon---choose variable to branch upon} |
|
695 |
|
696 \subsubsection*{Synopsis} |
|
697 |
|
698 \begin{verbatim} |
|
699 void glp_ios_branch_upon(glp_tree *tree, int j, int sel); |
|
700 \end{verbatim} |
|
701 |
|
702 \subsubsection*{Description} |
|
703 |
|
704 The routine \verb|glp_ios_branch_upon| can be called from the |
|
705 user-defined callback routine in response to the reason |
|
706 \verb|GLP_IBRANCH| to choose a branching variable, whose ordinal number |
|
707 is $j$. Should note that only variables, for which the routine |
|
708 \verb|glp_ios_can_branch| returns non-zero, can be used to branch upon. |
|
709 |
|
710 The parameter \verb|sel| is a flag that indicates which branch |
|
711 (subproblem) should be selected next to continue the search: |
|
712 |
|
713 \verb|GLP_DN_BRNCH|---select down-branch; |
|
714 |
|
715 \verb|GLP_UP_BRNCH|---select up-branch; |
|
716 |
|
717 \verb|GLP_NO_BRNCH|---use general selection technique. |
|
718 |
|
719 \subsubsection*{Comments} |
|
720 |
|
721 On branching the solver removes the current active subproblem from the |
|
722 active list and creates two new subproblems ({\it down-} and {\it |
|
723 up-branches}), which are added to the end of the active list. Note that |
|
724 the down-branch is created before the up-branch, so the last active |
|
725 subproblem will be the up-branch. |
|
726 |
|
727 The down- and up-branches are identical to the current subproblem with |
|
728 exception that in the down-branch the upper bound of $x_j$, the variable |
|
729 chosen to branch upon, is replaced by $\lfloor x_j^*\rfloor$, while in |
|
730 the up-branch the lower bound of $x_j$ is replaced by |
|
731 $\lceil x_j^*\rceil$, where $x_j^*$ is the value of $x_j$ in optimal |
|
732 solution to LP relaxation of the current subproblem. For example, if |
|
733 $x_j^*=3.14$, the new upper bound of $x_j$ in the down-branch is |
|
734 $\lfloor 3.14\rfloor=3$, and the new lower bound in the up-branch is |
|
735 $\lceil 3.14\rceil=4$.) |
|
736 |
|
737 Additionally the callback routine may select either down- or up-branch, |
|
738 from which the solver will continue the search. If none of the branches |
|
739 is selected, a general selection technique will be used. |
|
740 |
|
741 \newpage |
|
742 |
|
743 \subsection{glp\_ios\_terminate---terminate the solution process} |
|
744 |
|
745 \subsubsection*{Synopsis} |
|
746 |
|
747 \begin{verbatim} |
|
748 void glp_ios_terminate(glp_tree *tree); |
|
749 \end{verbatim} |
|
750 |
|
751 \subsubsection*{Description} |
|
752 |
|
753 The routine \verb|glp_ios_terminate| sets a flag indicating that the |
|
754 MIP solver should prematurely terminate the search. |
|
755 |
|
756 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
757 |
|
758 \newpage |
|
759 |
|
760 \section{The search tree exploring routines} |
|
761 |
|
762 \subsection{glp\_ios\_tree\_size---determine size of the search tree} |
|
763 |
|
764 \subsubsection*{Synopsis} |
|
765 |
|
766 \begin{verbatim} |
|
767 void glp_ios_tree_size(glp_tree *tree, int *a_cnt, int *n_cnt, |
|
768 int *t_cnt); |
|
769 \end{verbatim} |
|
770 |
|
771 \subsubsection*{Description} |
|
772 |
|
773 The routine \verb|glp_ios_tree_size| stores the following three counts |
|
774 which characterize the current size of the search tree: |
|
775 |
|
776 \verb|a_cnt| is the current number of active nodes, i.e. the current |
|
777 size of the active list; |
|
778 |
|
779 \verb|n_cnt| is the current number of all (active and inactive) nodes; |
|
780 |
|
781 \verb|t_cnt| is the total number of nodes including those which have |
|
782 been already removed from the tree. This count is increased whenever |
|
783 a new node appears in the tree and never decreased. |
|
784 |
|
785 If some of the parameters \verb|a_cnt|, \verb|n_cnt|, \verb|t_cnt| is |
|
786 a null pointer, the corresponding count is not stored. |
|
787 |
|
788 \subsection{glp\_ios\_curr\_node---determine current active subprob-\\ |
|
789 lem} |
|
790 |
|
791 \subsubsection*{Synopsis} |
|
792 |
|
793 \begin{verbatim} |
|
794 int glp_ios_curr_node(glp_tree *tree); |
|
795 \end{verbatim} |
|
796 |
|
797 \subsubsection*{Returns} |
|
798 |
|
799 The routine \verb|glp_ios_curr_node| returns the reference number of the |
|
800 current active subproblem. However, if the current subproblem does not |
|
801 exist, the routine returns zero. |
|
802 |
|
803 \newpage |
|
804 |
|
805 \subsection{glp\_ios\_next\_node---determine next active subproblem} |
|
806 |
|
807 \subsubsection*{Synopsis} |
|
808 |
|
809 \begin{verbatim} |
|
810 int glp_ios_next_node(glp_tree *tree, int p); |
|
811 \end{verbatim} |
|
812 |
|
813 \subsubsection*{Returns} |
|
814 |
|
815 If the parameter $p$ is zero, the routine \verb|glp_ios_next_node| |
|
816 returns the reference number of the first active subproblem. However, |
|
817 if the tree is empty, zero is returned. |
|
818 |
|
819 If the parameter $p$ is not zero, it must specify the reference number |
|
820 of some active subproblem, in which case the routine returns the |
|
821 reference number of the next active subproblem. However, if there is |
|
822 no next active subproblem in the list, zero is returned. |
|
823 |
|
824 All subproblems in the active list are ordered chronologically, i.e. |
|
825 subproblem $A$ precedes subproblem $B$ if $A$ was created before $B$. |
|
826 |
|
827 \subsection{glp\_ios\_prev\_node---determine previous active subproblem} |
|
828 |
|
829 \subsubsection*{Synopsis} |
|
830 |
|
831 \begin{verbatim} |
|
832 int glp_ios_prev_node(glp_tree *tree, int p); |
|
833 \end{verbatim} |
|
834 |
|
835 \subsubsection*{Returns} |
|
836 |
|
837 If the parameter $p$ is zero, the routine \verb|glp_ios_prev_node| |
|
838 returns the reference number of the last active subproblem. However, if |
|
839 the tree is empty, zero is returned. |
|
840 |
|
841 If the parameter $p$ is not zero, it must specify the reference number |
|
842 of some active subproblem, in which case the routine returns the |
|
843 reference number of the previous active subproblem. However, if there |
|
844 is no previous active subproblem in the list, zero is returned. |
|
845 |
|
846 All subproblems in the active list are ordered chronologically, i.e. |
|
847 subproblem $A$ precedes subproblem $B$ if $A$ was created before $B$. |
|
848 |
|
849 \newpage |
|
850 |
|
851 \subsection{glp\_ios\_up\_node---determine parent subproblem} |
|
852 |
|
853 \subsubsection*{Synopsis} |
|
854 |
|
855 \begin{verbatim} |
|
856 int glp_ios_up_node(glp_tree *tree, int p); |
|
857 \end{verbatim} |
|
858 |
|
859 \subsubsection*{Returns} |
|
860 |
|
861 The parameter $p$ must specify the reference number of some (active or |
|
862 inactive) subproblem, in which case the routine \verb|iet_get_up_node| |
|
863 returns the reference number of its parent subproblem. However, if the |
|
864 specified subproblem is the root of the tree and, therefore, has |
|
865 no parent, the routine returns zero. |
|
866 |
|
867 \subsection{glp\_ios\_node\_level---determine subproblem level} |
|
868 |
|
869 \subsubsection*{Synopsis} |
|
870 |
|
871 \begin{verbatim} |
|
872 int glp_ios_node_level(glp_tree *tree, int p); |
|
873 \end{verbatim} |
|
874 |
|
875 \subsubsection*{Returns} |
|
876 |
|
877 The routine \verb|glp_ios_node_level| returns the level of the |
|
878 subproblem,\linebreak whose reference number is $p$, in the |
|
879 branch-and-bound tree. (The root subproblem has level 0, and the level |
|
880 of any other subproblem is the level of its parent plus one.) |
|
881 |
|
882 \subsection{glp\_ios\_node\_bound---determine subproblem local\\bound} |
|
883 |
|
884 \subsubsection*{Synopsis} |
|
885 |
|
886 \begin{verbatim} |
|
887 double glp_ios_node_bound(glp_tree *tree, int p); |
|
888 \end{verbatim} |
|
889 |
|
890 \subsubsection*{Returns} |
|
891 |
|
892 The routine \verb|glp_ios_node_bound| returns the local bound for |
|
893 (active or inactive) subproblem, whose reference number is $p$. |
|
894 |
|
895 \subsubsection*{Comments} |
|
896 |
|
897 The local bound for subproblem $p$ is an lower (minimization) or upper |
|
898 (maximization) bound for integer optimal solution to {\it this} |
|
899 subproblem (not to the original problem). This bound is local in the |
|
900 sense that only subproblems in the subtree rooted at node $p$ cannot |
|
901 have better integer feasible solutions. |
|
902 |
|
903 On creating a subproblem (due to the branching step) its local bound is |
|
904 inherited from its parent and then may get only stronger (never weaker). |
|
905 For the root subproblem its local bound is initially set to |
|
906 \verb|-DBL_MAX| (minimization) or \verb|+DBL_MAX| (maximization) and |
|
907 then improved as the root LP relaxation has been solved. |
|
908 |
|
909 Note that the local bound is not necessarily the optimal objective value |
|
910 to corresponding LP relaxation. |
|
911 |
|
912 \subsection{glp\_ios\_best\_node---find active subproblem with best |
|
913 local bound} |
|
914 |
|
915 \subsubsection*{Synopsis} |
|
916 |
|
917 \begin{verbatim} |
|
918 int glp_ios_best_node(glp_tree *tree); |
|
919 \end{verbatim} |
|
920 |
|
921 \subsubsection*{Returns} |
|
922 |
|
923 The routine \verb|glp_ios_best_node| returns the reference number of |
|
924 the active subproblem, whose local bound is best (i.e. smallest in case |
|
925 of minimization or largest in case of maximization). However, if the |
|
926 tree is empty, the routine returns zero. |
|
927 |
|
928 \subsubsection*{Comments} |
|
929 |
|
930 The best local bound is an lower (minimization) or upper (maximization) |
|
931 bound for integer optimal solution to the original MIP problem. |
|
932 |
|
933 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
934 |
|
935 \newpage |
|
936 |
|
937 \section{The cut pool routines} |
|
938 |
|
939 \subsection{glp\_ios\_pool\_size---determine current size of the cut\\ |
|
940 pool} |
|
941 |
|
942 \subsubsection*{Synopsis} |
|
943 |
|
944 \begin{verbatim} |
|
945 int glp_ios_pool_size(glp_tree *tree); |
|
946 \end{verbatim} |
|
947 |
|
948 \subsubsection*{Returns} |
|
949 |
|
950 The routine \verb|glp_ios_pool_size| returns the current size of the |
|
951 cut pool, that is, the number of cutting plane constraints currently |
|
952 added to it. |
|
953 |
|
954 \subsection{glp\_ios\_add\_row---add constraint to the cut pool} |
|
955 |
|
956 \subsubsection*{Synopsis} |
|
957 |
|
958 \begin{verbatim} |
|
959 int glp_ios_add_row(glp_tree *tree, const char *name, |
|
960 int klass, int flags, int len, const int ind[], |
|
961 const double val[], int type, double rhs); |
|
962 \end{verbatim} |
|
963 |
|
964 \subsubsection*{Description} |
|
965 |
|
966 The routine \verb|glp_ios_add_row| adds specified row (cutting plane |
|
967 constraint) to the cut pool. |
|
968 |
|
969 The cutting plane constraint should have the following format: |
|
970 $$\sum_{j\in J}a_jx_j\left\{\begin{array}{@{}c@{}}\geq\\\leq\\ |
|
971 \end{array}\right\}b,$$ |
|
972 where $J$ is a set of indices (ordinal numbers) of structural variables, |
|
973 $a_j$ are constraint coefficients, $x_j$ are structural variables, $b$ |
|
974 is the right-hand side. |
|
975 |
|
976 The parameter \verb|name| specifies a symbolic name assigned to the |
|
977 constraint (1 up to 255 characters). If it is \verb|NULL| or an empty |
|
978 string, no name is assigned. |
|
979 |
|
980 The parameter \verb|klass| specifies the constraint class, which must |
|
981 be either zero or a number in the range from 101 to 200. The application |
|
982 may use this attribute to distinguish between cutting plane constraints |
|
983 of different classes.\footnote{Constraint classes numbered from 1 to 100 |
|
984 are reserved for GLPK cutting plane generators.} |
|
985 |
|
986 The parameter \verb|flags| currently is not used and must be zero. |
|
987 |
|
988 Ordinal numbers of structural variables (i.e. column indices) $j\in J$ |
|
989 and numerical values of corresponding constraint coefficients $a_j$ must |
|
990 be placed in locations \verb|ind[1]|, \dots, \verb|ind[len]| and |
|
991 \verb|val[1]|, \dots, \verb|val[len]|, respectively, where |
|
992 ${\tt len}=|J|$ is the number of constraint coefficients, |
|
993 $0\leq{\tt len}\leq n$, and $n$ is the number of columns in the problem |
|
994 object. Coefficients with identical column indices are not allowed. |
|
995 Zero coefficients are allowed, however, they are ignored. |
|
996 |
|
997 The parameter \verb|type| specifies the constraint type as follows: |
|
998 |
|
999 \verb|GLP_LO| means inequality constraint $\Sigma a_jx_j\geq b$; |
|
1000 |
|
1001 \verb|GLP_UP| means inequality constraint $\Sigma a_jx_j\leq b$; |
|
1002 |
|
1003 The parameter \verb|rhs| specifies the right-hand side $b$. |
|
1004 |
|
1005 All cutting plane constraints in the cut pool are identified by their |
|
1006 ordinal numbers 1, 2, \dots, $size$, where $size$ is the current size |
|
1007 of the cut pool. New constraints are always added to the end of the cut |
|
1008 pool, thus, ordinal numbers of previously added constraints are not |
|
1009 changed. |
|
1010 |
|
1011 \subsubsection*{Returns} |
|
1012 |
|
1013 The routine \verb|glp_ios_add_row| returns the ordinal number of the |
|
1014 cutting plane constraint added, which is the new size of the cut pool. |
|
1015 |
|
1016 \subsubsection*{Example} |
|
1017 |
|
1018 \begin{verbatim} |
|
1019 /* generate triangle cutting plane: |
|
1020 x[i] + x[j] + x[k] <= 1 */ |
|
1021 . . . |
|
1022 /* add the constraint to the cut pool */ |
|
1023 ind[1] = i, val[1] = 1.0; |
|
1024 ind[2] = j, val[2] = 1.0; |
|
1025 ind[3] = k, val[3] = 1.0; |
|
1026 glp_ios_add_row(tree, NULL, TRIANGLE_CUT, 0, 3, ind, val, |
|
1027 GLP_UP, 1.0); |
|
1028 \end{verbatim} |
|
1029 |
|
1030 \subsubsection*{Comments} |
|
1031 |
|
1032 Cutting plane constraints added to the cut pool are intended to be then |
|
1033 added only to the {\it current} subproblem, so these constraints can be |
|
1034 globally as well as locally valid. However, adding a constraint to the |
|
1035 cut pool does not mean that it will be added to the current |
|
1036 subproblem---it depends on the solver's decision: if the constraint |
|
1037 seems to be efficient, it is moved from the pool to the current |
|
1038 subproblem, otherwise it is simply dropped.\footnote{Globally valid |
|
1039 constraints could be saved and then re-used for other subproblems, but |
|
1040 currently such feature is not implemented.} |
|
1041 |
|
1042 Normally, every time the callback routine is called for cut generation, |
|
1043 the cut pool is empty. On the other hand, the solver itself can generate |
|
1044 cutting plane constraints (like Gomory's or mixed integer rounding |
|
1045 cuts), in which case the cut pool may be non-empty. |
|
1046 |
|
1047 \subsection{glp\_ios\_del\_row---remove constraint from the cut pool} |
|
1048 |
|
1049 \subsubsection*{Synopsis} |
|
1050 |
|
1051 \begin{verbatim} |
|
1052 void glp_ios_del_row(glp_tree *tree, int i); |
|
1053 \end{verbatim} |
|
1054 |
|
1055 \subsubsection*{Description} |
|
1056 |
|
1057 The routine \verb|glp_ios_del_row| deletes $i$-th row (cutting plane |
|
1058 constraint) from the cut pool, where $1\leq i\leq size$ is the ordinal |
|
1059 number of the constraint in the pool, $size$ is the current size of the |
|
1060 cut pool. |
|
1061 |
|
1062 Note that deleting a constraint from the cut pool leads to changing |
|
1063 ordinal numbers of other constraints remaining in the pool. New ordinal |
|
1064 numbers of the remaining constraints are assigned under assumption that |
|
1065 the original order of constraints is not changed. Let, for example, |
|
1066 there be four constraints $a$, $b$, $c$ and $d$ in the cut pool, which |
|
1067 have ordinal numbers 1, 2, 3 and 4, respectively, and let constraint |
|
1068 $b$ have been deleted. Then after deletion the remaining constraint $a$, |
|
1069 $c$ and $d$ are assigned new ordinal numbers 1, 2 and 3, respectively. |
|
1070 |
|
1071 To find the constraint to be deleted the routine \verb|glp_ios_del_row| |
|
1072 uses ``smart'' linear search, so it is recommended to remove constraints |
|
1073 in a natural or reverse order and avoid removing them in a random order. |
|
1074 |
|
1075 \subsubsection*{Example} |
|
1076 |
|
1077 \begin{verbatim} |
|
1078 /* keep first 10 constraints in the cut pool and remove other |
|
1079 constraints */ |
|
1080 while (glp_ios_pool_size(tree) > 10) |
|
1081 glp_ios_del_row(tree, glp_ios_pool_size(tree)); |
|
1082 \end{verbatim} |
|
1083 |
|
1084 \newpage |
|
1085 |
|
1086 \subsection{glp\_ios\_clear\_pool---remove all constraints from the cut |
|
1087 pool} |
|
1088 |
|
1089 \subsubsection*{Synopsis} |
|
1090 |
|
1091 \begin{verbatim} |
|
1092 void glp_ios_clear_pool(glp_tree *tree); |
|
1093 \end{verbatim} |
|
1094 |
|
1095 \subsubsection*{Description} |
|
1096 |
|
1097 The routine \verb|glp_ios_clear_pool| makes the cut pool empty deleting |
|
1098 all existing rows (cutting plane constraints) from it. |
|
1099 |
|
1100 %* eof *% |