Stack Overflow em Português Asked by Raquel Santos on December 5, 2021
Preciso colocar essa função objetivo no Julia. Alguém pode me ajudar?
Comecei a fazer assim, mas não sei como unir as funções objetivos como na imagem acima.
using JuMP, Cbc
Model1 = Model(with_optimizer(Cbc.Optimizer))
CR = [11; 11; 11; 11; 11]
CO = [50; 50; 50; 50; 50]
A = 1:80 #atividades
T = 1:18 #peírodo de tempo
W = 1:5 #centro de trabalho
@variable(Model1,r[A,T], lower_bound=0)
@variable(Model1,o[A,T], lower_bound=0)
@variable(Model1,wr[W,T], lower_bound=0)
@variable(Model1,wo[W,T], lower_bound=0)
@objective(Model1,Min,sum(CR[w]*(r[a,t]+o[a,t])+CO[w]*o[a,t] for w in W, a in
A, t in T))
@objective(Model1,Min,sum(CR[w]*(wr[w,t]+wo[w,t])+CO[w]*wo[w,t] for w in W, t
in T))
Uma sugestão para solucionar equações complexas é "quebrá-las" em partes menores, depois ir montando e testando o programa aos poucos, para cada item que você insere, e evitar chegar no final e ocorrer um erro que vai ser difícil de localizar (e isso vale para qualquer linguagem de programação).
Vamos lá!
Supondo que a declaração das variáveis esteja correta, para montar a função objetivo você pode seguir os seguintes passos:
A partir da equação original:
Montando apenas a primeira parte:
O código fica da seguinte forma:
@objective(Model1, Min, sum(CR[widx]
for widx in W))
Você também pode colocar tudo em uma linha só, porém, desta forma fica mais fácil para visualizar.
Neste ponto, a dica é utilizar nomes diferentes para as variáveis do looping (widx
, por
exemplo, ao invés de w
que pode ser confundido com W
).
Em seguida, acrescentar a parte da equação que está dentro do primeiro parênteses:
@objective(Model1, Min, sum(CR[widx] * (r[aidx, tidx] + o[aidx, tidx])
for widx in W for aidx in A for tidx in T))
Aqui, já foram incluídas as duas variáveis restantes da somatória a
e t
, com os nomes aidx
e tidx
, respectivamente.
Os 3 loopings da primeira somatória (a,w,t)
já estão definidos, então fica mais simples para montar o restante dessa primeira somatória:
@objective(Model1, Min, sum(CR[widx] * (r[aidx, tidx] + o[aidx, tidx]) +
CO[widx] * o[aidx, tidx])
for widx in W for aidx in A for tidx in T))
A segunda somatória segue a mesma linha de desenvolvimento (somada com a primeira):
@objective(Model1, Min, sum(CR[widx] * (r[aidx, tidx] + o[aidx, tidx]) +
CO[widx] * o[aidx, tidx]
for widx in W for aidx in A for tidx in T) +
sum(CR[widx]
for widx in W))
Após acrescentar o índice widx
da segunda somatória e testar, basta acrescentar a próxima variável t
(definida no código como tidx
) e terminar de montar a equação completa:
@objective(Model1, Min, sum(CR[widx] * (r[aidx, tidx] + o[aidx, tidx]) +
CO[widx] * o[aidx, tidx]
for widx in W for aidx in A for tidx in T) +
sum(CR[widx] * (wr[widx, tidx] + wo[widx, tidx]) +
CO[widx] + wo[widx,tidx]
for widx in W for tidx in T))
Supondo que o seu modelo não tenha nenhuma restrição (constraint), basta chamar a função de otimização:
julia> optimize!(Model1)
Welcome to the CBC MILP Solver
Version: 2.10.3
Build Date: Jan 1 1970
command line - Cbc_C_Interface -solve -quit (default strategy 1)
Empty problem - 0 rows, 3060 columns and 0 elements
Optimal - objective value 0
Optimal objective 0 - 0 iterations time 0.002
Total time (CPU seconds): 0.03 (Wallclock seconds): 0.03
E verificar o resultado final da otimização:
julia> termination_status(Model1)
OPTIMAL::TerminationStatusCode = 1
Outra dica é que o parâmetro with_optimizer
dentro da função Model agora é obsoleto, portanto, você pode definir o seu model da seguinte forma:
Model1 = Model(Cbc.Optimizer)
E para definir os vetores, você pode utilizar vírgula ,
, ao invés de ;
.
Exemplo:
CR = [11, 11, 11, 11, 11]
Answered by Gomiero on December 5, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP