TransWikia.com

Como usar o somatório em Julia?

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?

inserir a descrição da imagem aqui

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))

One Answer

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:

Equação matemática original

Montando apenas a primeira parte:

primeira parte da equação

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:

segunda parte da equação

@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:

primeira somatória da equação

@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):

primeira parte da segunda 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) + 
                        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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP