<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=iso-8859-1" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 8.00.6001.18975">
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR><BR>Hi Thomas and Stephen,<BR><BR>I apologize to Thomas.<BR><BR>The updating 
of&nbsp;&nbsp; bestPossibleObjective_ from the&nbsp; objective function value 
<BR>of the root is an expensive operation that looks at all the nodes 
<BR>currently in the tree.<BR>How often this is done depends on the 
printFrequency_ member variable of <BR>CbcModel , which is set to 0 in the 
constructor, but readjusted 
later.<BR>--------------------------------------------------<BR>Bits from 
CbcModel.cpp<BR>bestPossibleObjective_=originalContinuousObjective_;<BR><BR><BR><BR>&nbsp; 
if (printFrequency_ &lt;= 0) {<BR>&nbsp;&nbsp;&nbsp; printFrequency_ = 1000 
;<BR>&nbsp;&nbsp;&nbsp; if (getNumCols() &gt; 
2000)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printFrequency_ = 100 ;<BR>&nbsp; 
}<BR>/////////////[NOT A BINARY 
OPERATION<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
if ((numberNodes_%printFrequency_) == 0) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
int j 
;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
int nNodes = tree_-&gt;size() 
;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
bestPossibleObjective_ = 1.0e100 
;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
for (j = 0;j &lt; nNodes;j++) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
CbcNode * node = tree_-&gt;nodePointer(j) 
;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
if (node&amp;&amp;node-&gt;objectiveValue() &lt; 
<BR>bestPossibleObjective_)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
bestPossibleObjective_ = <BR>node-&gt;objectiveValue() 
;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR><BR><BR><BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 
(!status_) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
// Set best possible unless stopped on 
gap<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
if(secondaryStatus_ != 
2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
bestPossibleObjective_=bestObjective_;<BR><BR><BR><BR><BR>bestPossibleObjective_(COIN_DBL_MAX),<BR><BR><BR><BR><BR>printFrequency_(0),<BR><BR><BR><BR><BR><BR><BR>double<BR>CbcModel::getBestPossibleObjValue() 
const<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 
CoinMin(bestPossibleObjective_,bestObjective_) * <BR>solver_-&gt;getObjSense() 
;<BR>}<BR><BR>Gabrielle<BR><BR>----- Original Message ----- <BR>From: Stefan 
Vigerske<BR>To: Thomas Schoenemann<BR>Cc: <A 
href="">cbc@list.coin-or.org</A><BR>Sent: Tuesday, November 09, 2010 9:12 
AM<BR>Subject: Re: [Cbc] How to get the lower 
bound?<BR><BR><BR>Hi,<BR><BR>CbcModel::getBestPossibleObjValue() should give you 
the dual bound (=<BR>lower bound for minimization) that you are interested 
in.<BR>If the dual bound does not change during B&amp;B, then because of reasons 
2<BR>or 3 in your mail.<BR>Cbc may have a different strategies on how to 
generate which cuts and<BR>how to select nodes from the tree, which may be less 
lucky in computing<BR>tighter bounds on your instance than other 
solvers.<BR><BR>You could test CbcModel::getBestPossibleObjValue() on a simpler 
instance<BR>and see how it improves over time.<BR><BR>Stefan<BR><BR><BR>Thomas 
Schoenemann wrote:<BR>&gt; Dear Gabrielle,<BR>&gt;<BR>&gt; I think you 
misunderstand me: I am interested in lower bounds derived from<BR>&gt; 
fractional solutions, not the upper bound defined by the best known <BR>&gt; 
integral<BR>&gt; solution (just for clarity: I am considering _minimization_ 
problems).<BR>&gt;<BR>&gt; Concerning upper bounds, CBC is working just fine and 
hardly comparable to <BR>&gt; any<BR>&gt; other solver since it leaves the 
decision of what heuristics to run <BR>&gt; entirely<BR>&gt; to the 
user.<BR>&gt;<BR>&gt; Concerning lower bounds, I think I was quite specific in 
my previous <BR>&gt; posting<BR>&gt; about how I want them to be computed. As I 
said, I have never seen the <BR>&gt; value<BR>&gt; change in the printout, and I 
see three possible explanations: 1. the <BR>&gt; value is<BR>&gt; not computed 
in the way I want it 2. the relaxation of at least one child <BR>&gt; of<BR>&gt; 
the root node is never solved. 3. the relaxation value one of the childs 
<BR>&gt; is<BR>&gt; indentical to that of the root node.<BR>&gt;<BR>&gt; I 
cannot exclude 2 and 3, but they do sound strange to me. As I said, many<BR>&gt; 
other solvers, both commercial (Gurobi, Cplex, Xpress) and open source <BR>&gt; 
(SCIP)<BR>&gt; provide tigther bounds.<BR>&gt;<BR>&gt; Apart from that, I would 
like to clarify that CBC is in my view absolutely<BR>&gt; competitive (there is 
no universally best solver, which is not to be <BR>&gt; expected<BR>&gt; given 
the generality of the solved problems). It is indeed my default <BR>&gt; 
solver<BR>&gt; due to the clever customized stragegy of integrating your own 
cuts and<BR>&gt; heuristics. There is just this one minor issue that confuses 
me.<BR>&gt;<BR>&gt; Best regards,<BR>&gt;&nbsp;&nbsp; 
Thomas<BR>&gt;<BR>&gt;<BR>&gt; Am Dienstag, 9. November 2010 02:02:16 schrieb 
Gabrielle A. Grun:<BR>&gt;&gt; HI Thomas,<BR>&gt;&gt;<BR>&gt;&gt; bestObjective_ 
is a member variable of CbcModel not associated to any<BR>&gt;&gt; specific 
node. It is updated in CbcModel setBestSolution (CBC_Message <BR>&gt;&gt; 
how,<BR>&gt;&gt; double &amp; objectiveValue, const double 
*solutionIn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
bool<BR>&gt;&gt; fixVariables)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; when the 
objective value of an integer solution <BR>&gt;&gt; "beats"<BR>&gt;&gt; the 
incumbent bestObjective_ value(a cutoff is used)<BR>&gt;&gt;<BR>&gt;&gt; if 
bestObjective_ is unchanged from the point of&nbsp; root node, then 
no<BR>&gt;&gt; integer solution was found in the branch and cut 
process.<BR>&gt;&gt;<BR>&gt;&gt; If the best objective printed by Cbc 
IS&nbsp;&nbsp; less than that of commercial<BR>&gt;&gt; products for the same 
node count limit ( that there are different ways of<BR>&gt;&gt; counting nodes), 
either cbc has found an integer solution with a "better"<BR>&gt;&gt; objective 
function value or most likely, there is something wrong with <BR>&gt;&gt; 
Cbc,<BR>&gt;&gt; the other products or your use of them.<BR>&gt;&gt;<BR>&gt;&gt; 
Take care.<BR>&gt;&gt;<BR>&gt;&gt; Gabrielle<BR>&gt;&gt; ----- Original Message 
-----<BR>&gt;&gt; From: Thomas Schoenemann<BR>&gt;&gt; To: <A 
href="">cbc@list.coin-or.org</A><BR>&gt;&gt; Sent: Monday, November 08, 2010 
1:02 AM<BR>&gt;&gt; Subject: Re: [Cbc] How to get the lower 
bound?<BR>&gt;&gt;<BR>&gt;&gt;<BR>&gt;&gt; Dear Gabrielle and 
John,<BR>&gt;&gt;<BR>&gt;&gt; I am interested in the best proven lower bound. I 
did not know about the<BR>&gt;&gt; getMinimizationObjValue() function, so that 
already helps somewhat. As <BR>&gt;&gt; for<BR>&gt;&gt; the<BR>&gt;&gt; 
printouts, I did notice them and found that the values were 
consistently<BR>&gt;&gt; lower<BR>&gt;&gt; than those printed out by commercial 
products. I also had the impression<BR>&gt;&gt; that<BR>&gt;&gt; the value never 
changed after the root node. If you split the root node<BR>&gt;&gt; into two and 
solve both lp-relaxations, I would like to know the lower of<BR>&gt;&gt; the two 
objectives. This should be the best proven lower bound, and every<BR>&gt;&gt; 
time you solve the two children of a node you can propagate this value 
to<BR>&gt;&gt; all of its ancestors. Is this done in the current implementation 
of Cbc?<BR>&gt;&gt;<BR>&gt;&gt; The main reason I asked this question now is an 
upcoming deadline on<BR>&gt;&gt; Thursday.<BR>&gt;&gt; The respective 
observations I made throughout the last half a year and <BR>&gt;&gt; 
they<BR>&gt;&gt; all date at least a month back. I am very sorry, but due to the 
deadline <BR>&gt;&gt; I<BR>&gt;&gt; cannot give you specific information right 
now. I'll investigate next <BR>&gt;&gt; week!<BR>&gt;&gt;<BR>&gt;&gt; Best 
regards,<BR>&gt;&gt;&nbsp;&nbsp;&nbsp; Thomas<BR>&gt;&gt;<BR>&gt;&gt; Am 
Sonntag, 7. November 2010 19:34:54 schrieb Gabrielle A. Grun:<BR>&gt;&gt;&gt; Hi 
Thomas,<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; is this what you are 
after?<BR>&gt;&gt;&gt; /// Get best objective function value as 
minimization<BR>&gt;&gt;&gt; inline double getMinimizationObjValue() 
const<BR>&gt;&gt;&gt; { return bestObjective_;};<BR>&gt;&gt;&gt; 
[CbcModel.hpp]<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; You should be seeing 
bestObjective_ in any case as John says.<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; 
{CBC_END,5,1,"Partial search - best objective %g (best possible %g), 
<BR>&gt;&gt;&gt; took<BR>&gt;&gt;&gt; %d iterations and %d nodes (%.2f 
seconds)"},<BR>&gt;&gt;&gt; CbcMessage.cpp]<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; 
status_=1;<BR>&gt;&gt;&gt; if (!status_) {<BR>&gt;&gt;&gt; // Set best possible 
unless stopped on gap<BR>&gt;&gt;&gt; if(secondaryStatus_ != 2)<BR>&gt;&gt;&gt; 
bestPossibleObjective_=bestObjective_;<BR>&gt;&gt;&gt; 
handler_-&gt;message(CBC_END_GOOD,messages_)<BR>&gt;&gt;&gt; &lt;&lt; 
bestObjective_ &lt;&lt; numberIterations_ &lt;&lt;<BR>&gt;&gt;&gt; 
numberNodes_&lt;&lt;getCurrentSeconds()<BR>&gt;&gt;&gt; &lt;&lt; CoinMessageEol 
;<BR>&gt;&gt;&gt; } else {<BR>&gt;&gt;&gt; 
handler_-&gt;message(CBC_END,messages_)<BR>&gt;&gt;&gt; &lt;&lt; bestObjective_ 
&lt;&lt;bestPossibleObjective_<BR>&gt;&gt;&gt; &lt;&lt; numberIterations_ 
&lt;&lt; numberNodes_&lt;&lt;getCurrentSeconds()<BR>&gt;&gt;&gt; &lt;&lt; 
CoinMessageEol ;<BR>&gt;&gt;&gt; }<BR>&gt;&gt;&gt; 
CbcModel::branchAndBound---------CbcModel.cpp]<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; 
Take care.<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; 
Gabrielle<BR>&gt;&gt;&gt; ----- Original Message -----<BR>&gt;&gt;&gt; From: 
Thomas Schoenemann<BR>&gt;&gt;&gt; To: <A 
href="">cbc@list.coin-or.org</A><BR>&gt;&gt;&gt; Sent: Sunday, November 07, 2010 
7:22 AM<BR>&gt;&gt;&gt; Subject: [Cbc] How to get the lower 
bound?<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; Dear 
all,<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; several of my problems cannot be solved 
exactly by Cbc (or any other<BR>&gt;&gt;&gt; solver),<BR>&gt;&gt;&gt; so I set a 
limit on the number of nodes. In this case, most commercial<BR>&gt;&gt;&gt; 
products provide the tightest lowest bound from the part of the<BR>&gt;&gt;&gt; 
branch-and-<BR>&gt;&gt;&gt; bound that was actually executed. Is there a way to 
get this information<BR>&gt;&gt;&gt; in<BR>&gt;&gt;&gt; Cbc? So far I only found 
the value of the root-relaxation and the value<BR>&gt;&gt;&gt; of 
the<BR>&gt;&gt;&gt; last round of cuts at the root node, but the latter only by 
reading it<BR>&gt;&gt;&gt; off from the output on the 
screen.<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; Best 
regards,<BR>&gt;&gt;&gt;&nbsp;&nbsp; Thomas<BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; 
_______________________________________________<BR>&gt;&gt;&gt; Cbc mailing 
list<BR>&gt;&gt;&gt; <A href="">Cbc@list.coin-or.org</A><BR>&gt;&gt;&gt; <A 
href="">http://list.coin-or.org/mailman/listinfo/cbc</A><BR>&gt;&gt;&gt;<BR>&gt;&gt;&gt; 
_______________________________________________<BR>&gt;&gt;&gt; Cbc mailing 
list<BR>&gt;&gt;&gt; <A href="">Cbc@list.coin-or.org</A><BR>&gt;&gt;&gt; <A 
href="">http://list.coin-or.org/mailman/listinfo/cbc</A><BR>&gt;&gt; 
_______________________________________________<BR>&gt;&gt; Cbc mailing 
list<BR>&gt;&gt; <A href="">Cbc@list.coin-or.org</A><BR>&gt;&gt; <A 
href="">http://list.coin-or.org/mailman/listinfo/cbc</A><BR>&gt;&gt;<BR>&gt;&gt; 
_______________________________________________<BR>&gt;&gt; Cbc mailing 
list<BR>&gt;&gt; <A href="">Cbc@list.coin-or.org</A><BR>&gt;&gt; <A 
href="">http://list.coin-or.org/mailman/listinfo/cbc</A><BR>&gt;<BR>&gt; 
_______________________________________________<BR>&gt; Cbc mailing list<BR>&gt; 
<A href="">Cbc@list.coin-or.org</A><BR>&gt; <A 
href="">http://list.coin-or.org/mailman/listinfo/cbc</A><BR>&gt;<BR><BR><BR>-- 
<BR>Stefan Vigerske<BR>Humboldt University Berlin, Numerical Mathematics<BR><A 
href="">http://www.math.hu-berlin.de/~stefan</A><BR><BR>_______________________________________________<BR>Cbc 
mailing list<BR><A href="">Cbc@list.coin-or.org</A><BR><A 
href="">http://list.coin-or.org/mailman/listinfo/cbc</A> <BR>3</DIV>
<DIV>&nbsp;</DIV>
<DIV>Gabrielle</DIV></BODY></HTML>