Formulação de ração com o R

Formular ração é uma atividade rotineira na vida de um zootecnista. Basicamente este processo consiste em definir a quantidade de cada um dos diferentes alimentos disponíveis a serem misturados em função de sua composição nutricional, de forma que a mistura atenda as necessidades nutricionais dos animais ao menor custo possível, dadas as limitações impostas pelo sistema (exigências nutricionais, nível máximo/mínimo de inclusão do alimento na dieta, não negatividade dos valores, mínimo custo da ração).

O processo de formulação de ração de custo mínimo constitui-se em um problema de programação linear onde desejamos encontrar a combinação de alimentos que minimiza a função objetivo (custo), sujeito as limitações do sistema descrita acima. Este método é conhecido como ração de custo mínimo (RCM) . O R dispoe de ferramentas que permitem encontrar solução para esse tipo de problema. No post de hoje irei mostrar como formular ração no R utilizando o pacote linprog, o qual utiliza o algoritmo simplex para a otimização de problemas de programação linear. Vamos ver o seu funcionamento através de um exemplo retirado do capítulo “Formulação de dietas para bovinos leiteiros”, escrito pelo professor Iran Borges e disponível gratuitamente no livro Alimentação de gado Leiteiro.

Ração para bovinos cuja exigência é:

IMS (kG) PB(KG) NDT(KG) Ca (KG) P (KG)
16,48 2,72 11,67 0,10 0,06

Tendo disponível os seguintes Alimentos

Alimentos NDT(KG) PB(KG) MS(KG) Ca (KG) P (KG) R$/KG
Silagem de Milho(SM) 62,00 8,10 29,00 0,34 0,19 0,15
Braquiária(BR) 54,50 9,0 27,90 0,22 0,16 0,08
Farelo de Milho 85,0 10,0 88,0 0,02 0,29 0,55
Polpa Cítrica (PC) 77,0 6,70 91,00 1,84 0,12 0,40
Farelo de Soja (FS) 82,00 45,00 89,00 0,30 0,68 0,45
Soja Grão (SG) 91,00 42,30 92,00 0,27 0,65 0,91
Fosfato bicálcico (FB) 98,00 23,30 0,18 1,35
Calcário Calcítido (CC) 100,00 38,50 0,04

Sendo que o capim braquiária deve preencher 10% da MS da ração e o conteúdo de FB e CC deve ser no máximo 5% da MS da ração

Basicamente o problema a ser otimizado pode ser expresso da seguinte forma:

Encontrar a combinação de alimentos que torne mínima a função custo:

Sujeito as seguintes restrições:

Em notação matricial,fica mais fácil a compreensão de como a função R trabalha:

Função objetivo

Limitações:

Repare que basicamente necessitamos: (1) Um vetor contendo os custos dos ingredientes da ração, (2) uma matriz contendo os coeficientes das limitações (lado esquerdo), sendo uma linha para cada limitação, (3) vetor contendo o valor das restrições/exigências (lado direito),(4) um vetor de caractere indicando as relações das restrições. A solução é então obtida pelo seguinte código. O manual da função pode ser obtido aqui.

install.packages("linprog")
library(linprog)
cvec<-c(0.15,0.08, 0.55,0.40,0.75,0.91,1.35,0.042) # parâmetros da
#função objetivo (R$/Kg Alimento)
names(cvec)<-c(SM,BR,FM,PC,FS,SG,FB,CC) #nomeia vetor
#----------------------Restricoes-------------------------------------
proteina<-c(0.0542,0.09,0.10,0.067,0.45,0.423,0,0)
NDT<-c(0.457,0.545,0.778,0.77,0.82,0.91,0,0)
MS<-c(0.29,0.279,0.88,0.91,0.89,0.92,0.98,1)
Ca<-c(0.0034,0.0022,0.0002,0.0184,0.0030,0.0027,0.233,0.385)
P<-c(0.0019,0.0016,0.0029,0.0012,0.0068,0.0065,0.0018,0)
BR<-c(0,1,0,0,0,0,0,0) #limitacao da qtde de braquiaria utilizada 10% MS
FB<-c(0,0,0,0,0,0,1,0)#limite maximo do uso de fosfato 5% MS
CC<-c(0,0,0,0,0,0,0,1)#limite maximo do uso de calcario 5% MS
#---------------------Matriz de coeficiente de restrições-------------------------------------------
Amat<-rbind(proteina,NDT,MS,Ca,P,BR,FB,CC)
#Vetor contendo os valores das restricões (exigencias e limites de inclusão, na ordem que
#aparecem na matriz-----------------------------------------------------------
bvec<- c(2.715,11.67,16.48,0.0997,0.0632,1.648,0.824,0.824)
names(bvec)<-c(PB,NDT,MS,Ca,P,BR,FB,CC)#nomeia vetor
#------------------------------Solução----------------------------------------
Resultado<-solveLP(cvec ,bvec,Amat,const.dir=c(>=,>=,>=,==,==,<=,<=,<=),lpSolve=T)
print(Resultado)

#---------------------------Resultado-------------------------------
Results of Linear Programming / Linear Optimization
(using lpSolve)

Objective function (Minimum): 9.75222 

Solution
        opt
SM  6.35614
BR  1.64800
FM 10.24838    # Quantidade de cada alimento na ração
PC  3.58884
FS  2.12642
SG  0.00000
FB  0.00000
CC  0.00000

Constraints
   actual dir    bvec    free
1  2.7150       2.7150 0.00000
2 16.2832       11.6700 4.61322  # Comparação entre a composição da
3 16.4800       16.4800 0.00000  #ração obtida e esperada
4  0.0997        0.0997 0.00000  # A coluna free é resultado da subtra
5  0.0632        0.0632 0.00000  #ção entre o obtido e a exigência es-
6  1.6480        1.6480 0.00000  #perada. Observe que o conteúdo de NDT
7  0.0000        0.8240 0.82400  #ultrapassou a exigência em 4,61 Kg
8  0.0000        0.8240 0.82400
Anúncios
Esse post foi publicado em Aplicacao. Bookmark o link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s