Movatterモバイル変換


[0]ホーム

URL:


ContentsMenuExpandLight modeDark modeAuto light/dark mode
Gurobi Example Tour
Light LogoDark Logo
Gurobi
Back to top

Diet Examples#

This section includes source code for all of the Gurobi diet examples.The same source code can be found in theexamples directory of theGurobi distribution.

diet#

/* Copyright 2025, Gurobi Optimization, LLC *//* Solve the classic diet model, showing how to add constraints   to an existing model. */#include<stdlib.h>#include<stdio.h>#include<math.h>#include"gurobi_c.h"intprintSolution(GRBmodel*model,intnCategories,intnFoods);intmain(intargc,char*argv[]){GRBenv*env=NULL;GRBmodel*model=NULL;interror=0;inti,j;int*cbeg,*cind,idx;double*cval,*rhs;char*sense;/* Nutrition guidelines, based on     USDA Dietary Guidelines for Americans, 2005     http://www.health.gov/DietaryGuidelines/dga2005/ */constintnCategories=4;char*Categories[]={"calories","protein","fat","sodium"};doubleminNutrition[]={1800,91,0,0};doublemaxNutrition[]={2200,GRB_INFINITY,65,1779};/* Set of foods */constintnFoods=9;char*Foods[]={"hamburger","chicken","hot dog","fries","macaroni","pizza","salad","milk","ice cream"};doublecost[]={2.49,2.89,1.50,1.89,2.09,1.99,2.49,0.89,1.59};/* Nutrition values for the foods */doublenutritionValues[][4]={{410,24,26,730},{420,32,10,1190},{560,20,32,1800},{380,4,19,270},{320,12,10,930},{320,15,12,820},{320,31,12,1230},{100,8,2.5,125},{330,8,10,180}};/* Create environment */error=GRBloadenv(&env,"diet.log");if(error)gotoQUIT;/* Create initial model */error=GRBnewmodel(env,&model,"diet",nFoods+nCategories,NULL,NULL,NULL,NULL,NULL);if(error)gotoQUIT;/* Initialize decision variables for the foods to buy */for(j=0;j<nFoods;++j){error=GRBsetdblattrelement(model,"Obj",j,cost[j]);if(error)gotoQUIT;error=GRBsetstrattrelement(model,"VarName",j,Foods[j]);if(error)gotoQUIT;}/* Initialize decision variables for the nutrition information,     which we limit via bounds */for(j=0;j<nCategories;++j){error=GRBsetdblattrelement(model,"LB",j+nFoods,minNutrition[j]);if(error)gotoQUIT;error=GRBsetdblattrelement(model,"UB",j+nFoods,maxNutrition[j]);if(error)gotoQUIT;error=GRBsetstrattrelement(model,"VarName",j+nFoods,Categories[j]);if(error)gotoQUIT;}/* The objective is to minimize the costs */error=GRBsetintattr(model,"ModelSense",GRB_MINIMIZE);if(error)gotoQUIT;/* Nutrition constraints */cbeg=malloc(sizeof(int)*nCategories);if(!cbeg)gotoQUIT;cind=malloc(sizeof(int)*nCategories*(nFoods+1));if(!cind)gotoQUIT;cval=malloc(sizeof(double)*nCategories*(nFoods+1));if(!cval)gotoQUIT;rhs=malloc(sizeof(double)*nCategories);if(!rhs)gotoQUIT;sense=malloc(sizeof(char)*nCategories);if(!sense)gotoQUIT;idx=0;for(i=0;i<nCategories;++i){cbeg[i]=idx;rhs[i]=0.0;sense[i]=GRB_EQUAL;for(j=0;j<nFoods;++j){cind[idx]=j;cval[idx++]=nutritionValues[j][i];}cind[idx]=nFoods+i;cval[idx++]=-1.0;}error=GRBaddconstrs(model,nCategories,idx,cbeg,cind,cval,sense,rhs,Categories);if(error)gotoQUIT;/* Solve */error=GRBoptimize(model);if(error)gotoQUIT;error=printSolution(model,nCategories,nFoods);if(error)gotoQUIT;printf("\nAdding constraint: at most 6 servings of dairy\n");cind[0]=7;cval[0]=1.0;cind[1]=8;cval[1]=1.0;error=GRBaddconstr(model,2,cind,cval,GRB_LESS_EQUAL,6.0,"limit_dairy");if(error)gotoQUIT;/* Solve */error=GRBoptimize(model);if(error)gotoQUIT;error=printSolution(model,nCategories,nFoods);if(error)gotoQUIT;QUIT:/* Error reporting */if(error){printf("ERROR: %s\n",GRBgeterrormsg(env));exit(1);}/* Free data */free(cbeg);free(cind);free(cval);free(rhs);free(sense);/* Free model */GRBfreemodel(model);/* Free environment */GRBfreeenv(env);return0;}intprintSolution(GRBmodel*model,intnCategories,intnFoods){interror,status,i,j;doubleobj,x;char*vname;error=GRBgetintattr(model,"Status",&status);if(error)returnerror;if(status==GRB_OPTIMAL){error=GRBgetdblattr(model,"ObjVal",&obj);if(error)returnerror;printf("\nCost: %f\n\nBuy:\n",obj);for(j=0;j<nFoods;++j){error=GRBgetdblattrelement(model,"X",j,&x);if(error)returnerror;if(x>0.0001){error=GRBgetstrattrelement(model,"VarName",j,&vname);if(error)returnerror;printf("%s %f\n",vname,x);}}printf("\nNutrition:\n");for(i=0;i<nCategories;++i){error=GRBgetdblattrelement(model,"X",i+nFoods,&x);if(error)returnerror;error=GRBgetstrattrelement(model,"VarName",i+nFoods,&vname);if(error)returnerror;printf("%s %f\n",vname,x);}}else{printf("No solution\n");}return0;}

diet2#

#!/usr/bin/env python3# Copyright 2025, Gurobi Optimization, LLC# Separate the model (dietmodel.py) from the data file (diet2.py), so# that the model can be solved with different data files.## Nutrition guidelines, based on# USDA Dietary Guidelines for Americans, 2005# http://www.health.gov/DietaryGuidelines/dga2005/importdietmodelimportgurobipyasgpfromgurobipyimportGRBcategories,minNutrition,maxNutrition=gp.multidict({"calories":[1800,2200],"protein":[91,GRB.INFINITY],"fat":[0,65],"sodium":[0,1779],})foods,cost=gp.multidict({"hamburger":2.49,"chicken":2.89,"hot dog":1.50,"fries":1.89,"macaroni":2.09,"pizza":1.99,"salad":2.49,"milk":0.89,"ice cream":1.59,})# Nutrition values for the foodsnutritionValues={("hamburger","calories"):410,("hamburger","protein"):24,("hamburger","fat"):26,("hamburger","sodium"):730,("chicken","calories"):420,("chicken","protein"):32,("chicken","fat"):10,("chicken","sodium"):1190,("hot dog","calories"):560,("hot dog","protein"):20,("hot dog","fat"):32,("hot dog","sodium"):1800,("fries","calories"):380,("fries","protein"):4,("fries","fat"):19,("fries","sodium"):270,("macaroni","calories"):320,("macaroni","protein"):12,("macaroni","fat"):10,("macaroni","sodium"):930,("pizza","calories"):320,("pizza","protein"):15,("pizza","fat"):12,("pizza","sodium"):820,("salad","calories"):320,("salad","protein"):31,("salad","fat"):12,("salad","sodium"):1230,("milk","calories"):100,("milk","protein"):8,("milk","fat"):2.5,("milk","sodium"):125,("ice cream","calories"):330,("ice cream","protein"):8,("ice cream","fat"):10,("ice cream","sodium"):180,}dietmodel.solve(categories,minNutrition,maxNutrition,foods,cost,nutritionValues)

diet3#

#!/usr/bin/env python3# Copyright 2025, Gurobi Optimization, LLC# Use a SQLite database with the diet model (dietmodel.py).  The database# (diet.db) can be recreated using the included SQL script (diet.sql).## Note that this example reads an external data file (..\data\diet.db).# As a result, it must be run from the Gurobi examples/python directory.importosimportsqlite3importdietmodelimportgurobipyasgpcon=sqlite3.connect(os.path.join("..","data","diet.db"))cur=con.cursor()cur.execute("select category,minnutrition,maxnutrition from categories")result=cur.fetchall()categories,minNutrition,maxNutrition=gp.multidict((cat,[minv,maxv])forcat,minv,maxvinresult)cur.execute("select food,cost from foods")result=cur.fetchall()foods,cost=gp.multidict(result)cur.execute("select food,category,value from nutrition")result=cur.fetchall()nutritionValues=dict(((f,c),v)forf,c,vinresult)con.close()dietmodel.solve(categories,minNutrition,maxNutrition,foods,cost,nutritionValues)

diet4#

#!/usr/bin/env python3# Copyright 2025, Gurobi Optimization, LLC# Read diet model data from an Excel spreadsheet (diet.xlsx).# Pass the imported data into the diet model (dietmodel.py).## Note that this example reads an external data file (..\data\diet.xlsx).# As a result, it must be run from the Gurobi examples/python directory.## This example uses Python package 'openpyxl', which isn't included# in most Python distributions.  You can install it with# 'pip install openpyxl'.importosimportopenpyxlimportdietmodel# Open 'diet.xlsx'book=openpyxl.load_workbook(os.path.join("..","data","diet.xlsx"))# Read min/max nutrition info from 'Categories' sheetsheet=book["Categories"]categories=[]minNutrition={}maxNutrition={}forrowinsheet.iter_rows():category=row[0].valueifcategory!="Categories":categories.append(category)minNutrition[category]=row[1].valuemaxNutrition[category]=row[2].value# Read food costs from 'Foods' sheetsheet=book["Foods"]foods=[]cost={}forrowinsheet.iter_rows():food=row[0].valueiffood!="Foods":foods.append(food)cost[food]=row[1].value# Read food nutrition info from 'Nutrition' sheetsheet=book["Nutrition"]nutritionValues={}forrowinsheet.iter_rows():ifrow[0].value==None:# column labels - categoriescats=[v.valueforvinrow]else:# nutrition valuesfood=row[0].valueforcolinrange(1,len(row)):nutritionValues[food,cats[col]]=row[col].valuedietmodel.solve(categories,minNutrition,maxNutrition,foods,cost,nutritionValues)

Help and Feedback

On this page

[8]ページ先頭

©2009-2025 Movatter.jp