Hide navigation sidebar
Hide table of contents sidebar
Back to top
Toggle table of contents sidebar

# mip2.R

    # Copyright 2025, Gurobi Optimization, LLC
    #
    # This example reads a MIP model from a file, solves it and
    # prints the objective values from all feasible solutions
    # generated while solving the MIP. Then it creates the fixed
    # model and solves that model.

    library(Matrix)
    library(gurobi)

    args <- commandArgs(trailingOnly = TRUE)
    if (length(args) < 1) {
      stop('Usage: Rscript mip2.R filename\n')
    }

    # Read model
    cat('Reading model',args[1],'...')
    model <- gurobi_read(args[1])
    cat('... done\n')

    # Detect set of non-continous variables
    numvars    <- dim(model$A)[[2]]
    intvars    <- which(model$vtype != 'C')
    numintvars <- length(intvars)
    if (numintvars < 1) {
      stop('All model\'s variables are continuous, nothing to do\n')
    }

    # Optimize
    params               <- list()
    params$poolsolutions <- 20
    result               <- gurobi(model, params)

    # Capture solution information
    if (result$status != 'OPTIMAL') {
      cat('Optimization finished with status', result$status, '\n')
      stop('Stop now\n')
    }

    # Iterate over the solutions
    if ('pool' %in% names(result)) {
      solcount <- length(result$pool)
      for (k in 1:solcount) {
        cat('Solution', k, 'has objective:', result$pool[[k]]$objval, '\n')
      }
    } else {
      solcount <- 1
      cat('Solution 1 has objective:', result$objval, '\n')
    }

    # Convert to fixed model
    for (j in 1:numvars) {
      if (model$vtype[j] != 'C') {
        t <- floor(result$x[j]+0.5)
        model$lb[j] <- t
        model$ub[j] <- t
      }
    }

    # Solve the fixed model
    result2 <- gurobi(model, params)
    if (result2$status != 'OPTIMAL') {
      stop('Error: fixed model isn\'t optimal\n')
    }

    if (abs(result$objval - result2$objval) > 1e-6 * (1 + abs(result$objval))) {
      stop('Error: Objective values differ\n')
    }

    # Print values of non-zero variables
    for (j in 1:numvars) {
      if (abs(result2$x[j]) < 1e-6) next
      varnames <- ''
      if ('varnames' %in% names(model)) {
        varnames <- model$varnames[j]
      } else {
        varnames <- sprintf('X%d', j)
      }
      cat(format(varnames, justify='left', width=10),':',
          format(result2$x[j], justify='right', digits=2, width=10), '\n')
    }

    # Clear space
    rm(model, params, result, result2)

Help and Feedback

Press `/` or click to search this documentation | Gurobi website | Gurobi community forum
Go to other Gurobi documentation | Gurobi download | Contact support