# Carrega pacote gráfico
library(plotly)
# Declara funcões
f1 <- function(x, y){ x^2 + y^2 }
f2 <- function(x, y){ (x-3)^2 + y^2 }
f3 <- function(x, y){ x^2 + (y - 2)^2 }
# Declara tamanho da matriz
n <- 100
# Declara x e y
x <- seq(-1, 4, length.out = n)
y <- seq(-1, 4, length.out = n)
# Declara matriz i, j
matriz1 <- matrix(0, ncol = n, nrow = n)
matriz2 <- matrix(0, ncol = n, nrow = n)
matriz3 <- matrix(0, ncol = n, nrow = n)
# Laco popula matriz
for(i in 1:n){
for(j in 1:n){
matriz1[i, j] <- f1(x[j],y[i])
matriz2[i, j] <- f2(x[j],y[i])
matriz3[i, j] <- f3(x[j],y[i])
}
}
# Declara gráfico
plot_ly(showscale = TRUE) %>%
# Superficie funcao 1 x1^2 + x2^2
add_surface(x = x,
y = y,
z = matriz1,
colorscale = list(c(0, 1),
c("blue", "lightgrey")),
name = "x1^2+(X2-2)^2",
contours = list(z = list(show=TRUE,
usecolormap=TRUE,
highlightcolor="#blue",
project=list(z=TRUE)))) %>%
# Superfície função (x-3)^2+y^2
add_surface(x = x,
y = y,
z = matriz2,
colorscale = list(c(0, 1),
c("red", "lightgrey")),
name = "(X1-3)^2+X2^2",
contours = list(z = list(show=TRUE,
usecolormap=TRUE,
highlightcolor="red",
project=list(z=TRUE)))) %>%
# Superfície função x^2+(y-2)^2
add_surface(x = x,
y = y,
z = matriz3,
colorscale = list(c(0, 1),
c("green", "lightgrey")),
name = "X1^2+(X2-2)^2",
contours = list(z = list(show=TRUE,
usecolormap=TRUE,
highlightcolor="green",
project=list(z=TRUE)))) %>%
# Define aparência do gráfico
layout(title = "Gráfico de Superfície",
scene = list(xaxis = list(title = "X1"),
yaxis = list(title = "X2" ),
zaxis = list(title = "Z")))
A função \(f_1(x_1,x_2) = x_1^2 + x_2^2\) apresenta mínimo global no ponto \((0,0)\) e \(f_1(0,0) = 0\).
A função \(f_2(x_1,x_2) = (x_1-3)^2+x_2^2\) apresenta mínimo global no ponto \((3,0)\) e \(f_2(3,0) = 0\).
A função \(f_3(x_1,x_2) = x_1^2+(x_2-2)^2\) apresenta mínimo global no ponto \((0,2)\) e \(f_3(0,2) = 0\).
O conjunto de soluções eficientes são os pontos mais próximos aos mínimos globais das funções.
# tamanho da matriz
n <- 400
# Declara x e y
x <- seq(-0.4, 0.4, length.out = n)
y <- seq(1.5, 2.5, length.out = n)
# Declara matriz i, j
matriz1 <- matrix(0, ncol = n, nrow = n)
matriz2 <- matrix(0, ncol = n, nrow = n)
matriz3 <- matrix(0, ncol = n, nrow = n)
# laco popula matriz
for(i in 1:n){
for(j in 1:n){
matriz1[i, j] <- ifelse(f3(x[j],y[i]) <= 0.1, f1(x[j],y[i]), NA)
matriz2[i, j] <- ifelse(f3(x[j],y[i]) <= 0.1, f2(x[j],y[i]), NA)
matriz3[i, j] <- ifelse(f3(x[j],y[i]) <= 0.1, f3(x[j],y[i]), NA)
}
}
# Gera objeto plotly
plot_ly(showscale = TRUE) %>%
# Superfície da função x^2+(x-2)^2
add_surface(x = x,
y = y,
z = matriz3,
colorscale = list(c(0, 1),
c("green", "lightgrey")),
name = "x1^2+(X2-2)^2"
) %>%
# Superfície da função x^2+y^2
add_surface(x = x,
y = y,
z = matriz1,
colorscale = list(c(0, 1),
c("blue", "lightgrey")),
name = "x1^2+X2^2"
) %>%
# Superfície da função (x-3)^2+x^2
add_surface(x = x,
y = y,
z = matriz2,
colorscale = list(c(0, 1),
c("red", "lightgrey")),
name = "(X1-3)^2+X2^2") %>%
# Define aparência do gráfico
layout(title = "Gráfico de Superfície",
scene = list(xaxis = list(title = "X1"),
yaxis = list(title = "X2" ),
zaxis = list(title = "Z")))
A restrição na imagem de \(f_3\) indica que \(f_1\) e \(f_2\) só seriam consideradas no domínio de \([-0.3,0.3]\) para \(x_1\) e \([1.7, 2.3]\) para \(x_2\)
Nessa região os valores de \(f_1\) variaram no intervalo \([3, 5]\) e os de \(f_2\) no intervalo \([11, 15]\).
Os problemas de otimização multiobjetivo, também conhecidos como problemas \(P_0\), otimização de vetores ou otimização Pareto, consistem em problemas de otimização matemática que possuem mais de uma função objetivo para ser optimizada simultaneamente. Esses tipos de problemas ocorrem em áreas que envolvem a tomada de decisão com respeito a diversos critérios.
A característica principal deste tipo de problema é o fato de que não existe uma solução única que otimize cada objetivo. O espaço de soluções é não dominado, Pareto ótimo, Pareto eficiente, ou não inferior se nenhuma das funções objetivo pode ser melhorada sem degradar as outras funções objetivo. Sem a adição de preferencias subjetivas todas as soluções Pareto ótimas são consideradas igualmente boas.
O intuito das técnicas e métodos construídos para tratar esse tipo de problema é encontrar um conjunto Pareto de soluções ótimas que represente a quantificação das vantagens e desvantagem para acomodar os diferentes objetivos do problema levando em consideração as preferências subjetivas da unidade de decisão.
Em termos matemáticos a optimização de diversos objetivos pode ser formulada como:
\(min(f_1(\overrightarrow{x}),f_2(\overrightarrow{x}),...,f_k(\overrightarrow{x})),\hspace{0.5cm}onde\hspace{0.5cm}\overrightarrow{x}\in X,\hspace{0.5cm}k\ge 2,\hspace{0.5cm}e\hspace{0.5cm}X\subseteq\Re^n\)
\(\overrightarrow{f}: X \rightarrow \Re^k, \overrightarrow{f}(\overrightarrow{x}) = (f_1(\overrightarrow{x}),f_2(\overrightarrow{x}), ..., f_k(\overrightarrow{x}))^t\)
\(\Im m\) X pode ser denotada por \(Y \subseteq \Re^k\)
Um elemento \(\overrightarrow{x}^* \in X\) é chamado de solução factível ou decisão factível.
Um vetor \(\overrightarrow{z}^*\) definido como \(\overrightarrow{f}(\overrightarrow{x}^*) \in \Re^k\) para uma solução factível de \(\overrightarrow{x}^*\) é chamado de vetor objetivo.
Uma solução factível \(\overrightarrow{x_1} \in X\) exerce dominância Pareto sobre \(\overrightarrow{x_2} \in X\) se:
A solução \(\overrightarrow{x}^* \in X\) e a correspondente saída \(\overrightarrow{f}(\overrightarrow{x}^*) \in \Re^k\) é chamada Pareto ótima se não existe outra solução que a domine.
O conjunto de soluções Pareto ótimas consiste na situação em que nenhum critério ou preferência individual pode ser melhorado sem prejudicar os outros critérios.
Supondo que \(w_j\) denota o peso relativo de cada critério \(C_j\) e \(f_{i,j}\) é o valor da performance da alternativa \(A_i\) quando avaliada em termos do critério \(C_j\). O escore \(A_i\) é o total da funções objetivo quando todos os critérios são considerados simultaneamente.
O método pode ser representado pela seguinte formula:
\(A_i = \sum_{j=1}^n w_j * f_{i,j} \hspace{0.5cm} para \hspace{0.5cm} i = 1,2,...,m\) funções objetivo.
A formulação matemática para o método pode ser representada por:
\(min f_1(x)\), com \(x \in X\) tal que as restrições \(f_k(x) \le \epsilon_k\), quando \(k = 2, ..., m\).
O método escalar da soma ponderada apresenta a mesma estrutura de restrições do problema original onde ponderações diferentes podem levar à mesma solução eficiente. Porém este método só gera todas as soluções do conjunto Pareto, se o conjunto de soluções \(P_0\) possuir imagem convexa. Em problemas com muitos objetivos fica difícil controlar a diversidade de soluções encontradas.
Este método só pode ser aplicado quando os dados estão exatamente na mesma unidade de medida. No caso das funções objetivo possuírem semânticas diferentes é necessário a aplicação de alguma transformação nos dados.
O suporte à tomada de decisão pode ser caracterizado pela assistência da unidade de decisão no que diz respeito a análise e avaliação de um objetivo ou restrição, a definição de preferências e prioridades em condições incertas, a indicação de uma lista de alternativas viáveis considerando preferências e restrições, a análise das consequências de uma decisão e a opinião sobre a alternativa mais viável.
O processo de suporte a tomada de decisão apresenta diversos desafios intrínsecos porque lida com a incerteza de sistemas complexos e preferências subjetivas da unidade de decisão. Na maioria dos casos este tipo de processo consiste na avaliação de alternativas para determinar a mais adequada. Essa análise considera as funções objetivo do problema, suas restrições e as preferências do responsável pela decisão. Este tipo de processo pode ser resumido na tarefa de encontrar uma utilidade com o auxílio da unidade de decisão, considerando diversos fatores favoráveis e contrários.
Dois fatores que podem dificultar o suporte da unidade de decisão são o tempo e o consenso. A escassez de tempo da unidade de decisão em participar de todo o processo de otimização, ou mesmo ser consultada diversas vezes ao longo do processo, muitas vezes pode ser um impedimento ao suporte. Se a unidade de decisão for composta de diversos indivíduos distintos, o consenso e a burocracia podem prejudicar o suporte. Diante de fatores como pressão para um breve consenso, pressão da maioria e centralização da informação, pode ser necessária a presença de um árbitro humano ou automatizado que controle o fluxo das informações, bem como o uso de alguma regra majoritária ou prevalência de opinião da autoridade do grupo para facilitar o processo de suporte.
As alternativas de problemas com múltiplos critérios podem ser caracterizadas por discrepância de requisitos, ambiguidade na avaliação dos cenários e erro na escolha das prioridades. A ausência de cuidado nesta etapa de especificações pode levar a decisões de má qualidade. No presente, esses problemas se amplificaram pelo fato de que o número de alternativas viáveis é maior, o custo de erros pode ser alto levando a reações em cadeia e a velocidade da transformação de cenários implica uma agilidade na tomada de decisões que pode prejudicar a qualidade da decisão tomada.
Algumas ações para tratar os problemas de incerteza na toma de decisões seriam garantir que tanto o volume quanto a qualidade das informações sejam suficientes para modelar o problema, certificar que a inclusão das preferência subjetivas dos stakeholders gerem o compartilhamento da responsabilidade na falha ou sucesso das decisões e utilizar a elaboração de estimativas subjetivas pelos especialistas, gerentes e tomadores de decisão para aumentar o nível de confiabilidade sobre a eficiência das alternativas possíveis e a importância dos critérios escolhidos.
A tomada de decisão em grupo se refere a situação em que mais de um decisor está envolvido. Neste caso os membros do grupo reconhecem a existência de um problema comum e procuram consenso sobre a solução do problema. Esse consenso seria caracterizado pela decisão coletiva que concilia da melhor forma possível as diferentes atitudes e motivações dos indivíduos pertencentes a unidade de decisão. Esse tipo de unidade de decisão é necessário quando o problema requer especialistas de várias áreas do conhecimento, força de trabalho diversificada e diferentes perspectivas.
As vantagens das decisões auxiliadas consistem na reunião de maior recurso intelectual, a distribuição do esforço na aquisição e processamento das informações e a presença de interesses divergentes internos que representam melhor os interesses globais da organização.
# Carrega Bibliotecas
library(knitr)
library(tidyverse)
# Declara matriz de comparação de critérios
comp_criterios1 <- matrix(c(1, 5, 3,
1/5, 1, 1/3,
1/3, 3, 1),
byrow = T,
ncol = 3,
nrow = 3) %>%
as_tibble() %>%
rename("Preco" = "V1",
"Revisao" = "V2",
"Seguro" = "V3") %>%
as.data.frame()
# Soma da importância dos Critérios
soma_criterios <- colSums(comp_criterios1)
# Divide cada elemento pela soma da coluna
comp_criterios2 <- comp_criterios1 %>%
mutate(Preco = Preco / soma_criterios[1],
Revisao = Revisao / soma_criterios[2],
Seguro = Seguro / soma_criterios[3])
# Calcula peso dos critérios
pesos_criterios <- rowSums(comp_criterios2) / 3
# Calcula matriz de consistência
consitencia <- comp_criterios1 %>%
mutate(Preco = Preco * pesos_criterios[1],
Revisao = Revisao * pesos_criterios[2],
Seguro = Seguro * pesos_criterios[3])
# Calcula soma do valor ponderado
razao_soma_ponderada <- rowSums(consitencia) / pesos_criterios
# Calcula lambda máximo
lambda_max <- mean(razao_soma_ponderada)
# Calcula índice de consistência
consistencia <- (lambda_max - 3) / 2
# Sorteia pesos aleatórios
indice_aleatorio <- 0.58
# Calcula razão de consistência
razao_consistencia <- consistencia / indice_aleatorio
# Declara tabela de pesos do critérios
tabela_pesos <- tibble(Criterios = c("Preço", "Revisão", "Seguro"),
Pesos = pesos_criterios)
# Altera nome de colunas
colnames(tabela_pesos) <- c("Critérios", "Pesos")
# Imprime tabela
kable(tabela_pesos)
| Critérios | Pesos |
|---|---|
| Preço | 0.6333457 |
| Revisão | 0.1061563 |
| Seguro | 0.2604980 |
# Declara data frame de de critérios sobre os veículos
criterios <- matrix(c(37990, 47590, 44990,38890,
371, 197, 248, 204,
1379, 1923, 1759, 2018),
ncol = 3,
nrow = 4) %>%
as_tibble() %>%
rename("Preco" = "V1",
"Revisao" = "V2",
"Seguro" = "V3")
# Declara função Rij
minimax <- function(x_ij, min_j, max_j){ (x_ij - min_j) / (max_j - min_j ) }
# Laço
for(j in 1:ncol(criterios)){
minimo <- min(criterios[,j])
maximo <- max(criterios[,j])
for(i in 1:nrow(criterios)){
criterios[i,j] <- minimax(criterios[i,j], minimo, maximo)
}
}
# Gera data frame de comparações
comparacoes <- tibble(Preco = 0,
Revisao = 0,
Seguro = 0,
De = rep(c(1,2,3,4), each = 3),
Para = c(2,3,4,1,3,4,1,2,4,1,2,3))
# Laço para relação dos criterios
for(i in 1:12){
for(j in 1:3){
comparacoes[i,j] = criterios[comparacoes$De[i], j] - criterios[comparacoes$Para[i], j]
}
}
# Função de Preferencia substitui negativos por zero
preferencia <- comparacoes %>%
select(c(1,2,3)) %>%
mutate(Preco = ifelse(Preco < 0, 0, Preco),
Revisao = ifelse(Revisao < 0, 0, Revisao),
Seguro = ifelse(Seguro < 0, 0, Seguro))
# Calcula preferência Agregada
preferencia_agregada <- preferencia %>%
mutate(Preco = Preco * pesos_criterios[1],
Revisao = Revisao * pesos_criterios[2],
Seguro = Seguro * pesos_criterios[3])
# Calcula soma de valores das linhas
soma_preferencias <- rowSums(preferencia_agregada)
# Declara matriz de preferências
matriz_preferencias <- tibble(Alternativas = c("HC1", "HC2", "HC3", "HC4"),
HC1 = c(NA, soma_preferencias[1:3]),
HC2 = c(soma_preferencias[4], NA, soma_preferencias[5:6]),
HC3 = c(soma_preferencias[7:8], NA, soma_preferencias[9]),
HC4 = c(soma_preferencias[10:12], NA))
# Calcula fluxos de entrada
fluxos_entrada <- colMeans(matriz_preferencias[,2:5], na.rm = T)
# Calcula fluxos de saída
fluxos_saida <- rowMeans(matriz_preferencias[,2:5], na.rm = T)
# Calcula diferença de fluxo de saída menos fluxo de entrada
dif_fluxos <- fluxos_saida - fluxos_entrada
# Calcula ranking
posicoes <- tibble(Alternativas = c("HC1", "HC2", "HC3", "HC4"),
Fluxos = dif_fluxos) %>%
mutate(Rank = dense_rank(desc(Fluxos))) %>%
arrange(Rank)
# Renomeia colunas
colnames(posicoes) <- c("Alternativas", "Diferença de Fluxos", "Posições")
# Imprime tabela
kable(posicoes)
| Alternativas | Diferença de Fluxos | Posições |
|---|---|---|
| HC1 | 0.5028778 | 1 |
| HC4 | 0.2122265 | 2 |
| HC3 | -0.2193699 | 3 |
| HC2 | -0.4957344 | 4 |