26 #include "objscip/objscip.h" 48 if( edge->
adjac == node2 )
91 SCIP_CALL( SCIPallocMemoryArray(
scip, &tour_, graph_->nnodes) );
105 SCIPfreeMemoryArray(
scip, &tour_);
114 assert( heur != NULL );
115 SCIP_SOL* sol = SCIPgetBestSol(
scip );
130 int nnodes = graph_->nnodes;
133 if( nnodes < 4 || sol == NULL || ncalls_ >= nnodes )
135 *result = SCIP_DIDNOTRUN;
139 *result= SCIP_DIDNOTFIND;
154 while( edge != NULL )
157 if( edge->
back != lastedge && SCIPgetSolVal(
scip, sol, edge->
var) > 0.5 )
164 for(j = i; j > 0 && tour_[j-1]->length < edge->
length; j-- )
165 tour_[j] = tour_[j-1];
176 }
while ( node != &nodes[0] );
177 assert( i == nnodes );
182 SCIP_CALL( SCIPallocBufferArray(
scip, &edges2test, 4) );
186 for(
int i = 0; i < ncalls_ && *result != SCIP_FOUNDSOL; i++ )
188 edges2test[0] = tour_[ncalls_];
189 edges2test[1] = tour_[i];
191 edges2test[3] =
findEdge( nodes, edges2test[0]->adjac, edges2test[1]->adjac );
192 assert( edges2test[2] != NULL );
193 assert( edges2test[3] != NULL );
196 if( edges2test[0]->length + edges2test[1]->length > edges2test[2]->length + edges2test[3]->length
197 && SCIPvarGetLbGlobal(edges2test[0]->var) == 0.0
198 && SCIPvarGetLbGlobal(edges2test[1]->var) == 0.0
199 && SCIPvarGetUbGlobal(edges2test[2]->var) == 1.0
200 && SCIPvarGetUbGlobal(edges2test[3]->var) == 1.0 )
206 SCIP_CALL( SCIPcreateSol(
scip, &swapsol, heur) );
209 for(
int j = 0; j < nnodes; j++)
211 SCIP_CALL( SCIPsetSolVal(
scip, swapsol, tour_[j]->var, 1.0) );
215 SCIP_CALL( SCIPsetSolVal(
scip, swapsol, edges2test[0]->var, 0.0) );
216 SCIP_CALL( SCIPsetSolVal(
scip, swapsol, edges2test[1]->var, 0.0) );
217 SCIP_CALL( SCIPsetSolVal(
scip, swapsol, edges2test[2]->var, 1.0) );
218 SCIP_CALL( SCIPsetSolVal(
scip, swapsol, edges2test[3]->var, 1.0) );
219 SCIP_CALL( SCIPaddSolFree(
scip, &swapsol, &success) );
222 *result = SCIP_FOUNDSOL;
227 SCIPfreeBufferArray(
scip, &edges2test);
2-Optimum - combinatorial improvement heuristic for TSP
SCIP_DECL_HEUREXITSOL(Heur2opt::scip_exitsol)
SCIP_DECL_HEURINIT(Heur2opt::scip_init)
generator for global cuts in undirected graphs
SCIP_DECL_HEURFREE(Heur2opt::scip_free)
SCIP_DECL_HEUREXEC(Heur2opt::scip_exec)
struct GraphEdge * first_edge
SCIP_DECL_HEUREXIT(Heur2opt::scip_exit)
static GRAPHEDGE * findEdge(GRAPHNODE *nodes, GRAPHNODE *node1, GRAPHNODE *node2)
C++ problem data for TSP.
SCIP_DECL_HEURINITSOL(Heur2opt::scip_initsol)
SCIP_DECL_HEURCLONE(scip::ObjCloneable *Heur2opt::clone)
void capture_graph(GRAPH *gr)
void release_graph(GRAPH **gr)