FICO
FICO Xpress Optimization Examples Repository
FICO Optimization Community FICO Xpress Optimization Home
Back to examples browserPrevious exampleNext example

Infeasibility and IIS Detection

Description

In this example, we model an infeasible linear programming problem. For analyzing the infeasibility, we use IIS detection of the Xpress Optimizer.



Further explanation of this example: Conversion of a similar Python example

infeasible_r.zip[download all files]

Source Files
By clicking on a file name, a preview is opened at the bottom of this page.
infeasible.R[download]





infeasible.R

#####################################
# This file is part of the          #
# Xpress-R interface examples       #
#                                   #
#   (c) 2022-2024 Fair Isaac Corporation #
#####################################
#' ---
#' title: "Infeasibility and IIS Detection"
#' author: Gregor Hendel
#' date: Dec. 2021
#' ---
#'
## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(echo = TRUE)
library(xpress)

#'
#' In this example, we model an infeasible linear programming problem.
#' For analyzing the infeasibility, we use IIS detection of the Xpress Optimizer.
#'
#' In most cases, an infeasible model points at a mistake in the modeling process.
#' Learn more about how Xpress supports the analysis of infeasible models
#' and the tracing of infeasibility reasons
#' [here](https://www.fico.com/fico-xpress-optimization/docs/latest/solver/optimizer/HTML/chapter3_sec_section3001.html).
#'
#' First, we need to create an LP that is infeasible.
#'
## ----Problem Formulation------------------------------------------------------
  p <- createprob()
  x0 <- xprs_newcol(p, 0, Inf, "C")
  x1 <- xprs_newcol(p, 0, Inf, "C")
  
  # x0 + 2 x1 >= 1
  c1 <- xprs_newrow(p, c(x0, x1), c(1,2), "G", 1, name="First Row")
  
  # 2 x0 + x1 >= 1
  c2 <- xprs_newrow(p, c(x0, x1), c(2,1), "G", 1, name="Second Row")
  
  # x0 + x1 <= 0.5
  c3 <- xprs_newrow(p, c(x0, x1), c(1,1), "L", 0.5, name="Third Row")

#'
#' The problem is found to be infeasible by calling `xprs_optimize`.
#'
## ----Solve the Problem--------------------------------------------------------
  setoutput(p)
  xprs_optimize(p)
  
  # a status of 2 means LP infeasible
  print(paste("Problem solved to status", getintattrib(p, xpress:::LPSTATUS)))

#'
#' We initiate the IIS detection using `iisall` and query the status using `iisstatus`.
#'
#' On larger problems where IIS detection
#' consumes time, we might rather search for a first IIS using `iisfirst`, and
#' then iterate consecutively through other IISs using `issnext`.
#'
## ----Initiate IIS Detection---------------------------------------------------
  iisall(p)
  status <- iisstatus(p)
  print(status)
  iis <- getiisdata(p, 1)
  print("IIS Data:")
  print(iis)

## ----Determine Isolations-----------------------------------------------------
  iisisolations(p, 1)


Back to examples browserPrevious exampleNext example