Este trabalho trata-se de uma atividade proposta na disciplia de Teoria da Decição II, ministrada
pela professora Luciane Alcoforado, na Pós-Civil - UFF.
Uma agência de casamento procura promover a melhor união possível entre os casais de seu banco de dados. Para a solução desse problema existe uma série de critérios a adotar.O índice de compatibilidade final, que é calculado levando em conta vários condicionantes, é o fator preponderante.
O sistema de dados da agência pode facilmente obter a adequação feminina fij, ou seja, a variável que diz o quanto a moça i é adequada ao rapaz j, e a masculina, hij, que expressa a situação inversa. Quando os valores de f e h estão entre determinados limites, o casal pode ser formado, sendo formação cada vez mais adequada, na medida do crescimento da soma desses fatores.
Além desse indicador, existe uma enorme condicionante econômica a ser levada em conta: a casa própria. As experiências dessa agência dizem queumcasal só é admissível quando ambos possuem interesse pela mesma casa, ela puder ser disponibilizada e seu preço estiver dentro da poss do casal. Existem W = {1, … , w} casas no banco de dados.
Formular o problema de maximizar o número de uniões estáveis dentro do banco de dados.
No atual banco de dados, estão cadastrados, Ana, Bia, Cida, Dan, Edu e Fábio.
Ana tem 25 anos, é servidora pública e tem remuneração mensal de 2600 reais.
Bia tem 24 anos, é decoradora e tem remunarção mensal de 1800 reais.
Cida tem 22 anos, é maquiadora e tem remuneração mensal média de 1500 reais.
Dan tem 27 anos, é vendedor e tem remuneração mensal de 1900 reais.
Edu tem 25 anos, é bancário e tem remuneração mensar de 2200 reais.
Fábio tem 26 anos, é técnico de enfermagem e tem remuneração mensal de 1700 reais.
Além disso, se encontram disponíveis as casa X, Y e Z.
A casa X está avaliada em 400 mil reais com financiamento aprovado em parcelas no valor de 2600 reais.
A casa Y está avaliada em 300 mil reais com financiamento aprovado em parcelas no valor de 2090 reais.
A casa Z está avaliada em 240 mil reais com financiamento aprovado em parcelas no valor de 1500 reais.
\(x147\) = Casamento de Ana e Dan na casa X
\(x148\) = Casamento de Ana e Dan na casa Y
\(x149\) = Casamento de Ana e Dan na casa Z
\(x157\) = Casamento de Ana e Edu na casa X
\(x158\) = Casamento de Ana e Edu na casa Y
\(x159\) = Casamento de Ana e Edu na casa Z
\(x167\) = Casamento de Ana e Fábio na casa X
\(x168\) = Casamento de Ana e Fábio na casa Y
\(x169\) = Casamento de Ana e Fábio na casa Z
\(x247\) = Casamento de Bia e Dan na casa X
\(x248\) = Casamento de Bia e Dan na casa Y
\(x249\) = Casamento de Bia e Dan na casa Z
\(x257\) = Casamento de Bia e Edu na casa X
\(x258\) = Casamento de Bia e Edu na casa Y
\(x259\) = Casamento de Bia e Edu na casa Z
\(x267\) = Casamento de Bia e Fábio na casa X
\(x268\) = Casamento de Bia e Fábio na casa Y
\(x269\) = Casamento de Bia e Fábio na casa Z
\(x347\) = Casamento de Cida e Dan na casa X
\(x348\) = Casamento de Cida e Dan na casa Y
\(x349\) = Casamento de Cida e Dan na casa Z
\(x357\) = Casamento de Cida e Edu na casa X
\(x358\) = Casamento de Cida e Edu na casa Y
\(x359\) = Casamento de Cida e Edu na casa Z
\(x367\) = Casamento de Cida e Fábio na casa X
\(x368\) = Casamento de Cida e Fábio na casa Y
\(x369\) = Casamento de Cida e Fábio na casa Z
R1 \(9x14k + 7x24k + 8x34k \geq 7\)
R2 \(9x15k + 8x25k + 7x35k \geq 7\)
R3 \(7x16k + 7x26k + 8x36k \geq 7\)
R4 \(7x14k + 10x15k + 6x16k \geq 6\)
R5 \(9x24k + 8x25k + 9x26k \geq 6\)
R6 \(8x34k + 9x35k + 6x36k \geq 6\)
para \(k = {7, 8, 9}\)
R7 \(x14k + x15k +x16k \leq 1\)
R8 \(x24k + x25k +x26k \leq 1\)
R9 \(x34k + x35k +x36k \leq 1\)
R10 \(x14k + x24k +x34k \leq 1\)
R11 \(x15k + x25k +x35k \leq 1\)
R12 \(x16k + x26k + x36k \leq 1\)
para \(k = {7, 8, 9}\)
R13 \(45x147+48x157 + 43x167 + 37x247 + 40x257 + 35x267 + 34x347 + 37x357 +32x367\geq 26\)
R14 \(45x148+48x158 + 43x168 + 37x248 + 40x258 + 35x268 + 34x348 + 37x358 +32x368 \geq 20.9\)
R15 \(45x149+48x159 + 43x169 + 37x249 + 40x259 + 35x269 + 34x349 + 37x359 +32x369\geq 15\)
R16 \(x147+x157+x167+x247+x257+x267+x347+x357+x367\leq1\)
R17\(x148+x158+x168+x248+x258+x268+x348+x358+x368\leq1\)
R18\(x149+x159+x169+x249+x259+x269+x349+x359+x369\leq1\)
\(max z = x147 + x148 + x149 + x157 + x158 + x159 + x167 + x168 + x169 + x247 + x248 + x249 + x257 + x258 + x259 + x267 + x268 + x269 + x347 + x248 + 249 + x347 + x348 + x349 + x357 + x358 + x359 + x367 + x368 + x369\)
Todas as variávei e restrições do problema foram tabeladas em uma planilha para melhor organização do programa.
######## Carregar pacotes lpSolve#################
suppressMessages(require(lpSolve))
######## Dados do problema #######################
library(readxl)
Dados <- read_excel("restcasa.xlsx")
kableExtra::kable(Dados)
| restr | x147 | x148 | x149 | x157 | x158 | X159 | X167 | X168 | X169 | X247 | X248 | X249 | X257 | X258 | X259 | x267 | x268 | x269 | x347 | x348 | x349 | x357 | x358 | x359 | x367 | x368 | x369 | direcoes | limite |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| R1 | 9 | 9 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | 7 | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | 8 | 8 | 0 | 0 | 0 | 0 | 0 | 0 | >= | 7.0 |
| R2 | 0 | 0 | 0 | 9 | 9 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | 8 | 8 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | 7 | 7 | 0 | 0 | 0 | >= | 7.0 |
| R3 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | 7 | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | 9 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | 8 | 8 | >= | 7.0 |
| R4 | 7 | 7 | 7 | 10 | 10 | 10 | 6 | 6 | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | >= | 6.0 |
| R5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | 9 | 9 | 8 | 8 | 8 | 9 | 9 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | >= | 6.0 |
| R6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | 8 | 8 | 9 | 9 | 9 | 6 | 6 | 6 | >= | 6.0 |
| R7 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | <= | 1.0 |
| R8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | <= | 1.0 |
| R9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <= | 1.0 |
| R10 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | <= | 1.0 |
| R11 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | <= | 1.0 |
| R12 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | <= | 1.0 |
| R13 | 45 | 0 | 0 | 48 | 0 | 0 | 43 | 0 | 0 | 37 | 0 | 0 | 40 | 0 | 0 | 35 | 0 | 0 | 34 | 0 | 0 | 37 | 0 | 0 | 32 | 0 | 0 | >= | 26.0 |
| R14 | 0 | 45 | 0 | 0 | 48 | 0 | 0 | 43 | 0 | 0 | 37 | 0 | 0 | 40 | 0 | 0 | 35 | 0 | 0 | 34 | 0 | 0 | 37 | 0 | 0 | 32 | 0 | >= | 20.9 |
| R15 | 0 | 0 | 45 | 0 | 0 | 48 | 0 | 0 | 43 | 0 | 0 | 37 | 0 | 0 | 40 | 0 | 0 | 35 | 0 | 0 | 34 | 0 | 0 | 37 | 0 | 0 | 32 | >= | 15.0 |
| R16 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | <= | 1.0 |
| R17 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | <= | 1.0 |
| R18 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | <= | 1.0 |
# coeficientes na função objetivo
func.objetivo = rep(1, 27)
# coeficientes nas restrições.
coeficientes.restricoes = as.matrix(Dados[2:28])
# sinal das restrições. Deve obedecer a ordem da matriz de coeficientes
direcao.restricoes = Dados$direcoes
# limite das restrições. Deve obedecer a ordem da matriz de coeficientes
limites.restricoes = Dados$limite
######## Solução ###############
solucao.problema <- lpSolve::lp(direction = "min",
objective.in = func.objetivo,
const.mat = coeficientes.restricoes,
const.dir = direcao.restricoes,
const.rhs = limites.restricoes,
all.bin = T)
######### Resultado #############
# valor da função objetivo na solução
solucao.problema$objval
[1] 3
# Valores para as variáveis de escolha que geram máximo ou mínimo dependendo do problema
solucao.problema$solution
[1] 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
Após rodar o algoritmo, obtemos três resultados possíveis:
Casamento de Ana e Dan morando na casa X;
Casamento de Bia e Edu morando na casa Y;
Casamento de Cida e Fábio morando na casa Z.
######## Solução ###############
solucao.problema <- lpSolve::lp(direction = "min",
objective.in = func.objetivo,
const.mat = coeficientes.restricoes,
const.dir = direcao.restricoes,
const.rhs = limites.restricoes,
all.int = T)
######### Resultado #############
# Valores para as variáveis de escolha que geram máximo ou mínimo dependendo do problema
solucao.problema$solution
[1] 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Outra possibilidade também pode ser esses mesmos casamentos, porém para outras casas:
Casamento de Ana e Dan morando na casa Z;
Casamento de Bia e Edu morando na casa X;
Casamento de Cida e Fábio morando na casa Y.
Analizando a situação financeira dos casais, a agência acredita que a primeira possibilidade é a mais favorável.
Goldbarg, Marco Cesar. Otimização combinatória e programação linear: modelos e algoritmos / Marco Cesar Goldbarg, Henrique Pacca L. Luna. -2.ed. – Rio de Janeiro: Elsevier, 2005