Scippy

SCIP

Solving Constraint Integer Programs

circlepacking.c File Reference

Detailed Description

Packing circles in a rectangle of minimal size.

Author
Jose Salmeron
Stefan Vigerske

This example shows how to setup quadratic constraints in SCIP when using SCIP as callable library. The example implements a model for the computation of a smallest rectangle that contains a number of given circles in the plane or the computation of the maximal number of circles that can be placed into a given rectangle.

Suppose that n circles with radii \(r_i\) are given. The task is to find coordinates \((x_i, y_i)\) for the circle midpoints and a rectangle of width \(W \geq 0\) and height \(H \geq 0\), such that

  • every circle is placed within the rectangle ( \(r_i \leq x_i \leq W-r_i\), \(r_i \leq y_i \leq H-r_i\)),
  • circles are not overlapping \(\left((x_i-x_j)^2 + (y_i-y_j)^2 \geq (r_i + r_j)^2\right)\), and
  • the area of the rectangle is minimal.

Alternatively, one may fix the size of the rectangle and maximize the number of circles that can be fit into the rectangle without being overlapping.

Definition in file circlepacking.c.

#include <stdio.h>
#include <string.h>
#include <math.h>
#include "scip/scip.h"
#include "scip/scipdefplugins.h"

Go to the source code of this file.

Functions

static void visualizeSolutionMatplotlib (SCIP *scip, SCIP_SOL *sol)
 
static void visualizeSolutionGnuplot (SCIP *scip, SCIP_SOL *sol)
 
static SCIP_RETCODE visualizeSolutionAscii (SCIP *scip, SCIP_SOL *sol)
 
static SCIP_DECL_EVENTINIT (eventInitDispsol)
 
static SCIP_DECL_EVENTEXIT (eventExitDispsol)
 
static SCIP_DECL_EVENTEXEC (eventExecDispsol)
 
static SCIP_RETCODE includeEventHdlrDispsol (SCIP *scip)
 
static SCIP_RETCODE setupProblem (SCIP *scip, SCIP_Real fixwidth, SCIP_Real fixheight)
 
static SCIP_RETCODE runPacking (SCIP_Real fixwidth, SCIP_Real fixheight, SCIP_Bool dognuplot, SCIP_Bool domatplotlib)
 
int main (int argc, char **argv)
 

Variables

int ncircles = 0
 
SCIP_Realr = NULL
 
int rsize = 0
 
SCIP_VAR ** x
 
SCIP_VAR ** y
 
SCIP_VAR ** b
 
SCIP_VARa
 
SCIP_VARw
 
SCIP_VARh
 
SCIP_Bool minarea
 

Function Documentation

◆ visualizeSolutionMatplotlib()

static void visualizeSolutionMatplotlib ( SCIP scip,
SCIP_SOL sol 
)
static

plots solution by use of Python/Matplotlib

Parameters
scipSCIP data structure
solsolution to plot

Definition at line 65 of file circlepacking.c.

References minarea, ncircles, NULL, r, SCIPerrorMessage, SCIPgetSolOrigObj(), SCIPgetSolVal(), SCIPinfoMessage(), and SCIPround().

Referenced by runPacking().

◆ visualizeSolutionGnuplot()

static void visualizeSolutionGnuplot ( SCIP scip,
SCIP_SOL sol 
)
static

plots solution by use of gnuplot

Parameters
scipSCIP data structure
solsolution to plot

Definition at line 127 of file circlepacking.c.

References MAX, minarea, ncircles, NULL, r, SCIP_Real, SCIPerrorMessage, SCIPgetSolOrigObj(), SCIPgetSolVal(), SCIPinfoMessage(), and SCIPround().

Referenced by runPacking().

◆ visualizeSolutionAscii()

static SCIP_RETCODE visualizeSolutionAscii ( SCIP scip,
SCIP_SOL sol 
)
static

plots solution by use of ascii graphics

Parameters
scipSCIP data structure
solsolution to plot

Definition at line 185 of file circlepacking.c.

References minarea, ncircles, NULL, phi(), r, SCIP_CALL, SCIP_OKAY, SCIP_Real, SCIPallocBufferArray, SCIPceil(), SCIPfreeBufferArray, SCIPgetIntParam(), SCIPgetSolOrigObj(), SCIPgetSolVal(), SCIPinfoMessage(), SCIPround(), and SCIPsnprintf().

Referenced by SCIP_DECL_EVENTEXEC().

◆ SCIP_DECL_EVENTINIT()

static SCIP_DECL_EVENTINIT ( eventInitDispsol  )
static

initialization method of event handler (called after problem was transformed)

Definition at line 277 of file circlepacking.c.

References NULL, SCIP_CALL, SCIP_EVENTTYPE_BESTSOLFOUND, SCIP_OKAY, and SCIPcatchEvent().

◆ SCIP_DECL_EVENTEXIT()

static SCIP_DECL_EVENTEXIT ( eventExitDispsol  )
static

deinitialization method of event handler (called before transformed problem is freed)

Definition at line 286 of file circlepacking.c.

References NULL, SCIP_CALL, SCIP_EVENTTYPE_BESTSOLFOUND, SCIP_OKAY, and SCIPdropEvent().

◆ SCIP_DECL_EVENTEXEC()

static SCIP_DECL_EVENTEXEC ( eventExecDispsol  )
static

execution method of event handler

Definition at line 295 of file circlepacking.c.

References NULL, SCIP_CALL, SCIP_EVENTTYPE_BESTSOLFOUND, SCIP_OKAY, SCIPeventGetSol(), SCIPeventGetType(), and visualizeSolutionAscii().

◆ includeEventHdlrDispsol()

static SCIP_RETCODE includeEventHdlrDispsol ( SCIP scip)
static

creates event handler for dispsol event

Parameters
scipSCIP data structure

Definition at line 311 of file circlepacking.c.

References NULL, SCIP_CALL, SCIP_OKAY, SCIPincludeEventhdlrBasic(), SCIPsetEventhdlrExit(), and SCIPsetEventhdlrInit().

Referenced by runPacking().

◆ setupProblem()

static SCIP_RETCODE setupProblem ( SCIP scip,
SCIP_Real  fixwidth,
SCIP_Real  fixheight 
)
static

create problem in given SCIP and add all variables and constraints to model the circle packing problem

Parameters
scipSCIP data structure
fixwidtha given fixed width for the rectangle, or SCIP_INVALID if not fixed
fixheighta given fixed height for the rectangle, or SCIP_INVALID if not fixed

Definition at line 330 of file circlepacking.c.

References FALSE, minarea, ncircles, NULL, r, SCIP_Bool, SCIP_CALL, SCIP_INVALID, SCIP_MAXSTRLEN, SCIP_OBJSENSE_MAXIMIZE, SCIP_OKAY, SCIP_Real, SCIP_VARTYPE_BINARY, SCIP_VARTYPE_CONTINUOUS, SCIPaddCoefLinear(), SCIPaddCons(), SCIPaddVar(), SCIPallocMemoryArray, SCIPcreateConsBasicLinear(), SCIPcreateConsQuadraticNonlinear(), SCIPcreateProbBasic(), SCIPcreateVarBasic(), SCIPfixVar(), SCIPinfinity(), SCIPisLT(), SCIPreleaseCons(), SCIPsetObjsense(), SCIPsnprintf(), and TRUE.

Referenced by runPacking().

◆ runPacking()

static SCIP_RETCODE runPacking ( SCIP_Real  fixwidth,
SCIP_Real  fixheight,
SCIP_Bool  dognuplot,
SCIP_Bool  domatplotlib 
)
static

run circle packing example

Sets up SCIP and the SCIP problem, solves the problem, and shows the solution.

Parameters
fixwidtha given fixed width for the rectangle, or SCIP_INVALID if not fixed
fixheighta given fixed height for the rectangle, or SCIP_INVALID if not fixed
dognuplotwhether to draw best solution with gnuplot
domatplotlibwhether to draw best solution with python/matplotlib

Definition at line 545 of file circlepacking.c.

References FALSE, includeEventHdlrDispsol(), minarea, ncircles, NULL, r, SCIP_CALL, SCIP_OKAY, SCIPcreate(), SCIPfree(), SCIPfreeMemoryArray, SCIPgetBestSol(), SCIPgetNSols(), SCIPincludeDefaultPlugins(), SCIPinfoMessage(), SCIPprintOrigProblem(), SCIPprintSol(), SCIPreleaseVar(), SCIPsetRealParam(), SCIPsolve(), setupProblem(), visualizeSolutionGnuplot(), and visualizeSolutionMatplotlib().

Referenced by main().

◆ main()

int main ( int  argc,
char **  argv 
)

main method starting SCIP

Parameters
argcnumber of arguments from the shell
argvarray of shell arguments

Definition at line 620 of file circlepacking.c.

References BMSallocMemoryArray, BMSreallocMemoryArray, FALSE, ncircles, r, rsize, runPacking(), SCIP_ALLOC_ABORT, SCIP_Bool, SCIP_INVALID, SCIP_OKAY, SCIP_Real, SCIPprintError(), and TRUE.

Variable Documentation

◆ ncircles

int ncircles = 0

◆ r

Radii

Definition at line 50 of file circlepacking.c.

Referenced by addFlowrowToCommodity(), addFracCounter(), addLocalRows(), addRangeInfo(), addRelaxation(), addTightEstimatorCut(), allRowsInLP(), applyCompression(), atomic_userexpr::atomic_userexpr(), branchruledataEnsureArraySize(), checkCons(), cleanupNetwork(), computeAndConstraintInfos(), computeStarts(), computeVarRatio(), consdataCreate(), consdataFreeRows(), constructCompression(), createCGMIPprimalsols(), createPrizeConstraints(), createRelaxation(), createSubscip(), cutsSubstituteMIR(), deleteCommodity(), detectParallelCols(), dhcstpWarmUp(), displayReaders(), enforceExprNlhdlr(), ensureRngrowmapMem(), extractCapacities(), extractCapacityRows(), extractFlow(), extractFlowRows(), extractNodes(), fillRelationTables(), findUncapacitatedArcs(), forkAddLP(), generateAverageRay(), generateClusterCuts(), generateDisjCutSOS1(), getDualBranchscore(), getDualProof(), getFarkasProof(), getFlowrowFit(), getIncidentNodes(), getJobs(), getNActiveConsScore(), getNextFlowrow(), getNodeSimilarityScore(), getResourcesCapacities(), getResourcesNames(), getSimplexCoefficients(), getVarRank(), graph_mincut_exec(), hashmap_iterate_pairs(), heurdataEnsureArraySize(), identifySourcesTargets(), improvePoint(), invertCommodity(), lpCleanupRows(), lpDelRowset(), lpFlushAddRows(), lpLexDualSimplex(), lpRemoveObsoleteRows(), main(), markRelaxsUnsolved(), markRowsXj(), mcfnetworkFill(), polyscip::global::narrow_cast(), parseDetails(), pcmwAdaptStarts(), posintpower(), ObjPricerVRP::pricing(), profilesFindEarliestFeasibleStart(), profilesFindLatestFeasibleStart(), propVariables(), pseudoforkAddLP(), reduce_bound(), relaxVar(), runBoundHeuristic(), runPacking(), runTm(), runTmPcMW_mode(), SCIP_DECL_COMPREXIT(), SCIP_DECL_CONSGETNVARS(), SCIP_DECL_CONSGETVARS(), SCIP_DECL_HEUREXEC(), SCIP_DECL_NLHDLRENFO(), SCIP_DECL_PRESOLEXEC(), SCIP_DECL_READERREAD(), SCIPapplyLockFixings(), SCIPcolPrint(), SCIPconflictAnalyzeLP(), SCIPcreateSchedulingProblem(), SCIPdummyDebugMethodForSun(), SCIPexprintHessianSparsity(), SCIPfreeRepresentation(), SCIPgetRandomSubset(), SCIPgetReadingTime(), SCIPinitRepresentation(), SCIPlinkcuttreeEvert(), SCIPlpEndDive(), SCIPlpGetDualDegeneracy(), SCIPlpGetDualfarkas(), SCIPlpGetSol(), SCIPlpGetUnboundedSol(), SCIPlpiAddRows(), SCIPlpiDelRows(), SCIPlpiDelRowset(), SCIPlpiGetBase(), SCIPlpiGetBasisInd(), SCIPlpiGetBInvACol(), SCIPlpiGetBInvARow(), SCIPlpiGetBInvCol(), SCIPlpiGetBInvRow(), SCIPlpiGetRows(), SCIPlpiGetSol(), SCIPlpiLoadColLP(), SCIPlpiSetBase(), SCIPlpRemoveRedundantRows(), SCIPlpShrinkRows(), SCIPlpStartDive(), SCIPlpSumRows(), SCIPlpUpdateAges(), SCIPmatrixGetParallelCols(), SCIPrandomGetSubset(), SCIPreoptApplyCompression(), SCIPreoptGetNSols(), SCIPreoptMergeVarHistory(), SCIPresetRepresentation(), SCIPsolAdjustImplicitSolVals(), SCIPsolveProbingRelax(), SCIPStpHeurTMCompStarts(), separateCons(), separateConsBinaryRepresentation(), separateCoverCutsCons(), separateCuts(), separateRltCuts(), setupProblem(), solveBilinearLP(), solveNodeRelax(), solveRowEcholonGF2(), storeCuts(), storeSuitableRows(), strengthenOrbitopeConstraint(), subrootConstructLP(), updateActivities(), updateLoopStatus(), utdist(), varProcessBoundChanges(), visualizeSolutionAscii(), visualizeSolutionGnuplot(), visualizeSolutionMatplotlib(), writeOpbRelevantAnds(), xmlFindNode(), and xmlFindNodeMaxdepth().

◆ rsize

int rsize = 0

Definition at line 51 of file circlepacking.c.

Referenced by main().

◆ x

SCIP_VAR** x

x coordinates

Definition at line 54 of file circlepacking.c.

Referenced by addCut(), addProductVars(), ansUnmark(), atomic_userexpr::atomic_userexpr(), bilinearTermsInsertAll(), bilinearTermsInsertEntry(), checkSystemGF2(), cleanCycle(), compEdgesObst(), computeConvexEnvelopeFacet(), computeCut(), detectMinors(), drawScaledImage(), ecaggrAddBilinTerm(), ecaggrAddQuadvar(), estimateConvexSecant(), estimateUnivariateQuotient(), extractProducts(), F77_FUNC(), getBilinearBinaryTerms(), getBinaryProductExpr(), getBinaryProductExprDo(), getEigenValues(), getX(), graph_mincut_exec(), hessLagSparsitySetNzFlagForExpr(), isPackingCons(), lpiGetBInvVec(), nlrowaggrAddRemBilinTerm(), nlrowaggrCreate(), printRow(), provedBound(), rbRotate(), read_problem(), reversePropBinarySearch(), roundFixingValue(), runBrachistochrone(), SCIP_DECL_CONSEXIT(), SCIP_DECL_EVENTEXEC(), SCIP_DECL_NLHDLRESTIMATE(), SCIP_DECL_READERREAD(), SCIP_NlpiProblem::SCIP_NlpiProblem(), SCIPaddIneqBilinear(), SCIPcalcGreComDiv(), SCIPcalcRootNewton(), SCIPerf(), SCIPgetBilinTermIdxNonlinear(), SCIPgetNlpiOracleIpopt(), SCIPintervalGetRoundingMode(), SCIPintervalQuadBivar(), SCIPintervalQuadUpperBound(), SCIPintervalSquare(), SCIPlpiAddCols(), SCIPlpiAddRows(), SCIPlpiChgBounds(), SCIPlpiChgObj(), SCIPlpiChgSides(), SCIPlpiClearState(), SCIPlpiGetBasisInd(), SCIPlpiGetBInvACol(), SCIPlpiGetBInvARow(), SCIPlpiGetBInvCol(), SCIPlpiGetBInvRow(), SCIPlpiGetDualfarkas(), SCIPlpiGetPrimalRay(), SCIPlpiGetSol(), SCIPlpiLoadColLP(), SCIPlpiReadLP(), SCIPlpiScaleCol(), SCIPlpiScaleRow(), SCIPlpiWriteLP(), SCIPnegateReal(), SCIPpatternAddElement(), SCIPpatternSetElementPos(), SCIPrbtreeDelete_call(), SCIPrealHashCode(), sepadataAddMinor(), separatePoint(), setupProblem(), solvePricingMINLP(), solveRowEcholonGF2(), spxSolve(), and updateBestCandidate().

◆ y

◆ b

SCIP_VAR** b

whether circle is placed into rectangle

Definition at line 56 of file circlepacking.c.

Referenced by alnsFixMoreVariables(), analyseOnoffBounds(), polyscip::Polyscip::boundedCEnd(), cancelCol(), cancelRow(), checkBlocking(), checkCons(), checkSystemGF2(), collectBinaryVars(), computeModularity(), computePosCircleCircle(), computePosRingCircle(), computeRestrictionToRay(), computeRoot(), computeRowEcholonGF2(), consdataCreateBinvars(), consdataLinearize(), createAndSplitProblem(), createCapacityRestriction(), createCoverCutsTimepoint(), createRows(), decompHorizonGetFirstPosBestPotential(), decompHorizonInitialize(), decompHorizonMarkInterval(), detectExpr(), determineVariableFixingsDecomp(), encodeColPair(), encodeRowPair(), estimateUnivariate(), initCurrent(), isNeighbor(), lockRounding(), lpiStrongbranch(), polyscip::Polyscip::numberofUnboundedResults(), optimize(), processRealBoundChg(), projectVbd(), provedBound(), reduce_termcompChangeSubgraphToBottleneck(), removeFixedBinvars(), reoptimize(), reuseSolution(), roundPartition(), scalePenalties(), SCIP_DECL_CONSCHECK(), SCIP_DECL_CONSINITSOL(), SCIP_DECL_CONSLOCK(), SCIP_DECL_CONSRESPROP(), SCIP_DECL_HEUREXEC(), SCIP_DECL_NLHDLRINTEVAL(), SCIP_DECL_NLHDLRREVERSEPROP(), SCIPclassifyConstraintTypesLinear(), SCIPintervalQuadUpperBound(), SCIPintervalSolveBivariateQuadExpressionAllScalar(), SCIPintervalSolveUnivariateQuadExpressionPositiveAllScalar(), SCIPlpiGetBInvCol(), SCIPlpiGetBInvRow(), SCIPrealToRational(), SCIPsetSortProps(), SCIPvisualizeConsCumulative(), selectCandidateUsingSVTS(), solveRowEcholonGF2(), solveSingleRowLP(), SORTTPL_NAME(), strengthenVarbounds(), tightenedLinkvar(), tightenWeights(), tryAggregateIntVars(), updateLambda(), and xmlFreeAttr().

◆ a

area of rectangle

Definition at line 57 of file circlepacking.c.

Referenced by addRowMark(), applyOptcumulative(), blockedAncestors_hash(), blockedAncestors_hashDirty(), blockedAncestors_hashIsHitBlock(), blockedAncestors_unhashDirty(), blockedAncestors_unhashPartial(), polyscip::Polyscip::boundedCEnd(), buildVertexPolyhedralSeparationLP(), cancelCol(), cancelRow(), checkBlocking(), cleanCycle(), cleanupNetwork(), computeAndConstraintInfos(), computeObjWeightSize(), computePosCircleCircle(), computePosRingCircle(), computeRestrictionToRay(), computeRevPropIntervalSin(), computeRoot(), computeVarRatio(), createEdgesFromRow(), createInitialColumns(), createLP(), createVariables(), daExec(), daInit(), dapathsSortStarts(), daRedCostIsValid(), decomposeGetFirstMarked(), detectExpr(), dualascent_allTermsReachable(), dualascent_execPcMw(), encodeColPair(), encodeRowPair(), estimateBivariateQuotient(), F77_FUNC(), findSolPcMw1Term(), generateClusterCuts(), graph_mincut_exec(), graph_printEdgeConflicts(), identifyComponent(), identifySourcesTargets(), integerpow(), isNeighbor(), markRowsXj(), mcfnetworkExtract(), mcfnetworkFill(), mcfnetworkFree(), nodepairqueueCreate(), nodepartitionIsConnected(), polyscip::Polyscip::numberofUnboundedResults(), pcsolGetTrivialEdges(), performAggregations(), printNLRow(), propagateBoundsQuadExpr(), provedBound(), redcostGraphBuild(), redcostGraphMark(), reduce_unconnectedRpcRmwInfeas(), reinitialise(), reroot(), SCIP_DECL_CONSINITSOL(), SCIP_DECL_HEURFREE(), SCIPrealToRational(), SCIPStpHeurTMBuildTreePcMw(), SCIPwriteCcg(), selectBranchingVertexByLp(), selectBranchingVertexByLp2Flow(), selectCandidateUsingSVTS(), solstp_pcGetSolRoot(), SORTTPL_NAME(), tpathsRepairTraverse1st(), tpathsRepairTraverseLevelWithStack(), tpathsRepairTraverseStackAddBelow(), trail(), tryAggregateIntVars(), writeOpbObjective(), writeOpbRelevantAnds(), xmlAddAttr(), xmlFreeAttr(), xmlGetAttrval(), xmlNewAttr(), and xmlShowNode().

◆ w

◆ h

◆ minarea

SCIP_Bool minarea

whether we minimize the area (TRUE) or maximize the number of circles in the rectangle (FALSE)

Definition at line 60 of file circlepacking.c.

Referenced by runPacking(), setupProblem(), visualizeSolutionAscii(), visualizeSolutionGnuplot(), and visualizeSolutionMatplotlib().