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

# diet.m

    function diet()
    % Copyright 2025, Gurobi Optimization, LLC
    %
    % Solve the classic diet model

    % Nutrition guidelines, based on
    % USDA Dietary Guidelines for Americans, 2005
    % http://www.health.gov/DietaryGuidelines/dga2005/

    ncategories = 4;
    categories = {'calories'; 'protein'; 'fat'; 'sodium'};
    %             minNutrition maxNutrition
    categorynutrition = [ 1800 2200;   % calories
                          91   inf;    % protein
                          0    65;     % fat
                          0    1779];  % sodium

    nfoods = 9;
    foods = {'hamburger';
             'chicken';
             'hot dog';
             'fries';
             'macaroni';
             'pizza';
             'salad';
             'milk';
             'ice cream'};

    foodcost = [2.49;  % hamburger
                2.89;  % chicken
                1.50;  % hot dog
                1.89;  % fries
                2.09;  % macaroni
                1.99;  % pizza
                2.49;  % salad
                0.89;  % milk
                1.59]; % ice cream

                      % calories protein fat sodium
    nutritionValues = [ 410      24      26  730;   % hamburger
                        420      32      10  1190;  % chicken
                        560      20      32  1800;  % hot dog
                        380      4       19  270;   % fries
                        320      12      10  930;   % macaroni
                        320      15      12  820;   % pizza
                        320      31      12  1230;  % salad
                        100      8       2.5 125;   % milk
                        330      8       10  180];  % ice cream
    nutritionValues = sparse(nutritionValues);
    model.modelName = 'diet';

    % The variables are layed out as [ buy; nutrition]
    model.obj   = [ foodcost;         zeros(ncategories, 1)];
    model.lb    = [ zeros(nfoods, 1); categorynutrition(:, 1)];
    model.ub    = [  inf(nfoods, 1);  categorynutrition(:, 2)];
    model.A     = [ nutritionValues' -speye(ncategories)];
    model.rhs   = zeros(ncategories, 1);
    model.sense = repmat('=', ncategories, 1);

    function printSolution(result)
        if strcmp(result.status, 'OPTIMAL')
            buy       = result.x(1:nfoods);
            nutrition = result.x(nfoods+1:nfoods+ncategories);
            fprintf('\nCost: %f\n', result.objval);
            fprintf('\nBuy:\n')
            for f=1:nfoods
                if buy(f) > 0.0001
                    fprintf('%10s %g\n', foods{f}, buy(f));
                end
            end
            fprintf('\nNutrition:\n')
            for c=1:ncategories
                fprintf('%10s %g\n', categories{c}, nutrition(c));
            end
        else
            fprintf('No solution\n');
        end
    end

    % Solve
    results = gurobi(model);
    printSolution(results);

    fprintf('\nAdding constraint at most 6 servings of dairy\n')
    milk = find(strcmp('milk', foods));
    icecream = find(strcmp('ice cream', foods));
    model.A(end+1,:) = sparse([1; 1], [milk; icecream], 1, ...
            1, nfoods + ncategories);
    model.rhs(end+1) = 6;
    model.sense(end+1) = '<';

    % Solve
    results = gurobi(model);
    printSolution(results)

    end

Help and Feedback

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