/* Copyright 2025, Gurobi Optimization, LLC *//* This example formulates and solves the following simple QP model: minimize x^2 + x*y + y^2 + y*z + z^2 + 2 x subject to x + 2 y + 3 z >= 4 x + y >= 1 x, y, z non-negative It solves it once as a continuous model, and once as an integer model.*/#include<stdlib.h>#include<stdio.h>#include"gurobi_c.h"intmain(intargc,char*argv[]){GRBenv*env=NULL;GRBmodel*model=NULL;interror=0;doublesol[3];intind[3];doubleval[3];intqrow[5];intqcol[5];doubleqval[5];charvtype[3];intoptimstatus;doubleobjval;/* Create environment */error=GRBloadenv(&env,"qp.log");if(error)gotoQUIT;/* Create an empty model */error=GRBnewmodel(env,&model,"qp",0,NULL,NULL,NULL,NULL,NULL);if(error)gotoQUIT;/* Add variables */error=GRBaddvars(model,3,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);if(error)gotoQUIT;/* Quadratic objective terms */qrow[0]=0;qrow[1]=0;qrow[2]=1;qrow[3]=1;qrow[4]=2;qcol[0]=0;qcol[1]=1;qcol[2]=1;qcol[3]=2;qcol[4]=2;qval[0]=1;qval[1]=1;qval[2]=1;qval[3]=1;qval[4]=1;error=GRBaddqpterms(model,5,qrow,qcol,qval);if(error)gotoQUIT;/* Linear objective term */error=GRBsetdblattrelement(model,GRB_DBL_ATTR_OBJ,0,2.0);if(error)gotoQUIT;/* First constraint: x + 2 y + 3 z <= 4 */ind[0]=0;ind[1]=1;ind[2]=2;val[0]=1;val[1]=2;val[2]=3;error=GRBaddconstr(model,3,ind,val,GRB_GREATER_EQUAL,4.0,"c0");if(error)gotoQUIT;/* Second constraint: x + y >= 1 */ind[0]=0;ind[1]=1;val[0]=1;val[1]=1;error=GRBaddconstr(model,2,ind,val,GRB_GREATER_EQUAL,1.0,"c1");if(error)gotoQUIT;/* Optimize model */error=GRBoptimize(model);if(error)gotoQUIT;/* Write model to 'qp.lp' */error=GRBwrite(model,"qp.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,sol);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",sol[0],sol[1],sol[2]);}elseif(optimstatus==GRB_INF_OR_UNBD){printf("Model is infeasible or unbounded\n");}else{printf("Optimization was stopped early\n");}/* Modify variable types */vtype[0]=GRB_INTEGER;vtype[1]=GRB_INTEGER;vtype[2]=GRB_INTEGER;error=GRBsetcharattrarray(model,GRB_CHAR_ATTR_VTYPE,0,3,vtype);if(error)gotoQUIT;/* Optimize model */error=GRBoptimize(model);if(error)gotoQUIT;/* Write model to 'qp2.lp' */error=GRBwrite(model,"qp2.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,sol);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",sol[0],sol[1],sol[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;}
Help and Feedback