This section includes source code for all of the Gurobi sos examples.The same source code can be found in theexamples directory of theGurobi distribution.
/* Copyright 2025, Gurobi Optimization, LLC *//* This example creates a very simple Special Ordered Set (SOS) model. The model consists of 3 continuous variables, no linear constraints, and a pair of SOS constraints of type 1. */#include<stdlib.h>#include<stdio.h>#include"gurobi_c.h"intmain(intargc,char*argv[]){GRBenv*env=NULL;GRBmodel*model=NULL;interror=0;doublex[3];doubleobj[3];doubleub[3];intsostype[2];intsosbeg[2];intsosind[4];doublesoswt[4];intoptimstatus;doubleobjval;/* Create environment */error=GRBloadenv(&env,"sos.log");if(error)gotoQUIT;/* Create an empty model */error=GRBnewmodel(env,&model,"sos",0,NULL,NULL,NULL,NULL,NULL);if(error)gotoQUIT;/* Add variables */obj[0]=-2;obj[1]=-1;obj[2]=-1;ub[0]=1.0;ub[1]=1.0;ub[2]=2.0;error=GRBaddvars(model,3,0,NULL,NULL,NULL,obj,NULL,ub,NULL,NULL);if(error)gotoQUIT;/* Build first SOS1: x0=0 or x1=0 */sosind[0]=0;sosind[1]=1;soswt[0]=1.0;soswt[1]=2.0;sosbeg[0]=0;sostype[0]=GRB_SOS_TYPE1;/* Build second SOS1: x0=0 or x2=0 */sosind[2]=0;sosind[3]=2;soswt[2]=1.0;soswt[3]=2.0;sosbeg[1]=2;sostype[1]=GRB_SOS_TYPE1;/* Add SOSs to model */error=GRBaddsos(model,2,4,sostype,sosbeg,sosind,soswt);if(error)gotoQUIT;/* Optimize model */error=GRBoptimize(model);if(error)gotoQUIT;/* Write model to 'sos.lp' */error=GRBwrite(model,"sos.lp");if(error)gotoQUIT;/* Capture solution information */error=GRBgetintattr(model,GRB_INT_ATTR_STATUS,&optimstatus);if(error)gotoQUIT;error=GRBgetdblattr(model,GRB_DBL_ATTR_OBJVAL,&objval);if(error)gotoQUIT;error=GRBgetdblattrarray(model,GRB_DBL_ATTR_X,0,3,x);if(error)gotoQUIT;printf("\nOptimization complete\n");if(optimstatus==GRB_OPTIMAL){printf("Optimal objective: %.4e\n",objval);printf(" x=%.4f, y=%.4f, z=%.4f\n",x[0],x[1],x[2]);}elseif(optimstatus==GRB_INF_OR_UNBD){printf("Model is infeasible or unbounded\n");}else{printf("Optimization was stopped early\n");}QUIT:/* Error reporting */if(error){printf("ERROR: %s\n",GRBgeterrormsg(env));exit(1);}/* Free model */GRBfreemodel(model);/* Free environment */GRBfreeenv(env);return0;}
/* Copyright 2025, Gurobi Optimization, LLC *//* This example creates a very simple Special Ordered Set (SOS) model. The model consists of 3 continuous variables, no linear constraints, and a pair of SOS constraints of type 1. */#include"gurobi_c++.h"usingnamespacestd;intmain(intargc,char*argv[]){GRBEnv*env=0;GRBVar*x=0;try{env=newGRBEnv();GRBModelmodel=GRBModel(*env);// Create variablesdoubleub[]={1,1,2};doubleobj[]={-2,-1,-1};stringnames[]={"x0","x1","x2"};x=model.addVars(NULL,ub,obj,NULL,names,3);// Add first SOS1: x0=0 or x1=0GRBVarsosv1[]={x[0],x[1]};doublesoswt1[]={1,2};model.addSOS(sosv1,soswt1,2,GRB_SOS_TYPE1);// Add second SOS1: x0=0 or x2=0 */GRBVarsosv2[]={x[0],x[2]};doublesoswt2[]={1,2};model.addSOS(sosv2,soswt2,2,GRB_SOS_TYPE1);// Optimize modelmodel.optimize();for(inti=0;i<3;i++)cout<<x[i].get(GRB_StringAttr_VarName)<<" "<<x[i].get(GRB_DoubleAttr_X)<<endl;cout<<"Obj: "<<model.get(GRB_DoubleAttr_ObjVal)<<endl;}catch(GRBExceptione){cout<<"Error code = "<<e.getErrorCode()<<endl;cout<<e.getMessage()<<endl;}catch(...){cout<<"Exception during optimization"<<endl;}delete[]x;deleteenv;return0;}
/* Copyright 2025, Gurobi Optimization, LLC *//* This example creates a very simple Special Ordered Set (SOS) model. The model consists of 3 continuous variables, no linear constraints, and a pair of SOS constraints of type 1. */usingSystem;usingGurobi;classsos_cs{staticvoidMain(){try{GRBEnvenv=newGRBEnv();GRBModelmodel=newGRBModel(env);// Create variablesdouble[]ub={1,1,2};double[]obj={-2,-1,-1};string[]names={"x0","x1","x2"};GRBVar[]x=model.AddVars(null,ub,obj,null,names);// Add first SOS1: x0=0 or x1=0GRBVar[]sosv1={x[0],x[1]};double[]soswt1={1,2};model.AddSOS(sosv1,soswt1,GRB.SOS_TYPE1);// Add second SOS1: x0=0 or x2=0GRBVar[]sosv2={x[0],x[2]};double[]soswt2={1,2};model.AddSOS(sosv2,soswt2,GRB.SOS_TYPE1);// Optimize modelmodel.Optimize();for(inti=0;i<3;i++)Console.WriteLine(x[i].VarName+" "+x[i].X);// Dispose of model and envmodel.Dispose();env.Dispose();}catch(GRBExceptione){Console.WriteLine("Error code: "+e.ErrorCode+". "+e.Message);}}}
/* Copyright 2025, Gurobi Optimization, LLC *//* This example creates a very simple Special Ordered Set (SOS) model. The model consists of 3 continuous variables, no linear constraints, and a pair of SOS constraints of type 1. */importcom.gurobi.gurobi.*;publicclassSos{publicstaticvoidmain(String[]args){try{GRBEnvenv=newGRBEnv();GRBModelmodel=newGRBModel(env);// Create variablesdoubleub[]={1,1,2};doubleobj[]={-2,-1,-1};Stringnames[]={"x0","x1","x2"};GRBVar[]x=model.addVars(null,ub,obj,null,names);// Add first SOS1: x0=0 or x1=0GRBVarsosv1[]={x[0],x[1]};doublesoswt1[]={1,2};model.addSOS(sosv1,soswt1,GRB.SOS_TYPE1);// Add second SOS1: x0=0 or x2=0GRBVarsosv2[]={x[0],x[2]};doublesoswt2[]={1,2};model.addSOS(sosv2,soswt2,GRB.SOS_TYPE1);// Optimize modelmodel.optimize();for(inti=0;i<3;i++)System.out.println(x[i].get(GRB.StringAttr.VarName)+" "+x[i].get(GRB.DoubleAttr.X));// Dispose of model and environmentmodel.dispose();env.dispose();}catch(GRBExceptione){System.out.println("Error code: "+e.getErrorCode()+". "+e.getMessage());}}}
functionsos()% Copyright 2025, Gurobi Optimization, LLC%% This example creates a very simple Special Ordered Set (SOS)% model. The model consists of 3 continuous variables, no linear% constraints, and a pair of SOS constraints of type 1.model.ub=[112];model.obj=[211];model.modelsense='Max';model.A=sparse(1,3);model.rhs=0;model.sense='=';% Add first SOS: x1 = 0 or x2 = 0model.sos(1).type=1;model.sos(1).index=[12];model.sos(1).weight=[12];% Add second SOS: x1 = 0 or x3 = 0model.sos(2).type=1;model.sos(2).index=[13];model.sos(2).weight=[12];% Write model to filegurobi_write(model,'sos.lp');result=gurobi(model);fori=1:3fprintf('x%d %e\n',i,result.x(i))endfprintf('Obj: %e\n',result.objval);end
#!/usr/bin/env python3# Copyright 2025, Gurobi Optimization, LLC# This example creates a very simple Special Ordered Set (SOS) model.# The model consists of 3 continuous variables, no linear constraints,# and a pair of SOS constraints of type 1.importgurobipyasgpfromgurobipyimportGRBtry:# Create a new modelmodel=gp.Model("sos")# Create variablesx0=model.addVar(ub=1.0,name="x0")x1=model.addVar(ub=1.0,name="x1")x2=model.addVar(ub=2.0,name="x2")# Set objectivemodel.setObjective(2*x0+x1+x2,GRB.MAXIMIZE)# Add first SOS: x0 = 0 or x1 = 0model.addSOS(GRB.SOS_TYPE1,[x0,x1],[1,2])# Add second SOS: x0 = 0 or x2 = 0model.addSOS(GRB.SOS_TYPE1,[x0,x2],[1,2])model.optimize()forvinmodel.getVars():print(f"{v.VarName}{v.X:g}")print(f"Obj:{model.ObjVal:g}")exceptgp.GurobiErrorase:print(f"Error code{e.errno}:{e}")exceptAttributeError:print("Encountered an attribute error")
# Copyright 2025, Gurobi Optimization, LLC## This example formulates and solves the following simple SOS model:# maximize# 2 x + y + z# subject to# x1 = 0 or x2 = 0 (SOS1 constraint)# x1 = 0 or x3 = 0 (SOS1 constraint)# x1 <= 1, x2 <= 1, x3 <= 2library(gurobi)model<-list()model$A<-matrix(c(0,0,0),nrow=1,byrow=T)model$obj<-c(2,1,1)model$modelsense<-'max'model$ub<-c(1,1,2)model$rhs<-c(0)model$sense<-c('=')# First SOS: x1 = 0 or x2 = 0sos1<-list()sos1$type<-1sos1$index<-c(1,2)sos1$weight<-c(1,2)# Second SOS: x1 = 0 or x3 = 0sos2<-list()sos2$type<-1sos2$index<-c(1,3)sos2$weight<-c(1,2)model$sos<-list(sos1,sos2)result<-gurobi(model)print(result$objval)print(result$x)# Clear spacerm(model,result)
' Copyright 2025, Gurobi Optimization, LLC'' This example creates a very simple Special Ordered Set (SOS) model.' The model consists of 3 continuous variables, no linear constraints,' and a pair of SOS constraints of type 1.ImportsSystemImportsGurobiClasssos_vbSharedSubMain()TryDimenvAsNewGRBEnv()DimmodelAsNewGRBModel(env)' Create variablesDimubAsDouble()={1,1,2}DimobjAsDouble()={-2,-1,-1}DimnamesAsString()={"x0","x1","x2"}DimxAsGRBVar()=model.AddVars(Nothing,ub,obj,Nothing,names)' Add first SOS1: x0=0 or x1=0Dimsosv1AsGRBVar()={x(0),x(1)}Dimsoswt1AsDouble()={1,2}model.AddSOS(sosv1,soswt1,GRB.SOS_TYPE1)' Add second SOS1: x0=0 or x2=0Dimsosv2AsGRBVar()={x(0),x(2)}Dimsoswt2AsDouble()={1,2}model.AddSOS(sosv2,soswt2,GRB.SOS_TYPE1)' Optimize modelmodel.Optimize()ForiAsInteger=0To2Console.WriteLine(x(i).VarName&" "&x(i).X)Next' Dispose of model and envmodel.Dispose()env.Dispose()CatcheAsGRBExceptionConsole.WriteLine("Error code: "&e.ErrorCode&". "&e.Message)EndTryEndSubEndClass
Help and Feedback