Notifications
Clear all

SOLVER - MAIS DE 8000 SUBPROBLEMAS

8 Posts
2 Usuários
0 Reactions
1,601 Visualizações
(@hugomoreda)
Posts: 34
Eminent Member
Topic starter
 

Boa tarde,

1 -Como faço para aumentar o limite default do solver no vba para um número maior que 8000 subproblemas?

Já tentei isso aqui: (Nada resolveu)

SolverOptions MaxTime:=180 'Max of 180 Seconds!
SolverOptions Precision:=0.001
MaxSubproblems = 10000000
Iterations = 10000000
MaxIntegerSols = 10000000
MaxTimeNoImp = 180

2 - Como eu faço para que ao rodar o passo final do solver - SolverSolve True - , ele termine de rodar sem que apareça aquela mensagem perguntando se eu quero continuar, parar ou salvar o cenário?

Minha macro é para otimizar uma margem bruta em uma planilha de precificação de seguros, de modo que eu aumente a produção e diminua o sinistro:

Sub PARAMETROS_SOLVER_PSS()
Dim NUMERO As Double
Dim DESC_MAX, AGRV_MAX As String
Dim ultimalinha, primeiroregistro, primeiralinha, x As Integer
Dim a As Variant


DESC_MAX = "$C$6"
AGRV_MAX = "$C$7"

Sheets("SIMULADOR").Select
    
ultimalinha = Cells(Rows.Count, 22).End(xlUp).Row

    Range("V40").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    SolverReset             'Limpa todas as configurações do Solver
    
[b]   SolverOptions MaxTime:=180 
   SolverOptions Precision:=0.001
   MaxSubproblems = 10000000
   Iterations = 10000000
   MaxIntegerSols = 10000000
   MaxTimeNoImp = 180[/b]
    
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''MAXIMIZAR A MARGEM DA PROJEÇÃO'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    SolverOk SetCell:="$F$33", MaxMinVal:=1, ValueOf:=0, ByChange:="$V$40:$V$62" _
        , Engine:=3, EngineDesc:="Evolutionary"
        
       
    SolverAdd CellRef:="$G$30", Relation:=3, FormulaText:=0
    SolverAdd CellRef:="$G$32", Relation:=1, FormulaText:=0
    SolverAdd CellRef:="$G$33", Relation:=3, FormulaText:=0

    SolverAdd CellRef:="$V$40", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$41", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$42", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$43", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$44", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$45", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$46", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$47", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$48", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$49", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$50", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$51", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$52", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$53", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$54", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$55", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$56", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$57", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$58", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$59", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$60", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$61", Relation:=1, FormulaText:=AGRV_MAX
    SolverAdd CellRef:="$V$62", Relation:=1, FormulaText:=AGRV_MAX

    SolverAdd CellRef:="$V$40", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$41", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$42", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$43", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$44", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$45", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$46", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$47", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$48", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$49", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$50", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$51", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$52", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$53", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$54", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$55", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$56", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$57", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$58", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$59", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$60", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$61", Relation:=3, FormulaText:=DESC_MAX
    SolverAdd CellRef:="$V$62", Relation:=3, FormulaText:=DESC_MAX
    
     
[b]    Application.DisplayAlerts = False
    SolverSolve True
    'SolverSolve UserFinish:=True
    'iSolution = SolverSolve(True)[/b]
    
    Sheets("SIMULADOR").Select

End Sub
 
Postado : 09/11/2016 1:25 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa tarde Hugomoreda,

1) O Solver que vem junto com o Excel (versão não paga) é limitado a 200 variáveis.

Sobre os SubProblemas (restrições), você pode escrever de forma diferente. Ao invés de selecionar célula por célula como você está fazendo você pode por exemplo selecionar uma área de células:

SolverAdd CellRef:="$V$40:$V$62", Relation:=3, FormulaText:=DESC_MAX

Transformado esse monte de linhas de restrições em apenas 3 (notei que tem três restrições).

----

Disponibilize um arquivo de exemplo, assim fica mais fácil ajudar.

att,

 
Postado : 09/11/2016 1:48 pm
(@hugomoreda)
Posts: 34
Eminent Member
Topic starter
 

Fala Bruno, muito obrigado pela resposta.

O problema é que eu queria aumentar bastante o número de iterações E não mostrar a telinha que pergunta se eu quero continuar, parar ou salvar o cenário.

 
Postado : 09/11/2016 1:52 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Hugo,

Você pode disponibilizar a planilha (não precisa ser com os dados originais)?

Eu uso mais o solver para programação linear (Simplex), no seu caso está usando o Evolutionary. Você pode tentar ir aumentando as iterações até descobrir o limite da versão não paga.

att,

 
Postado : 09/11/2016 1:59 pm
(@hugomoreda)
Posts: 34
Eminent Member
Topic starter
 

Bruno, não da. Os dados são sigilosos e estão em tabela dinâmica com conexão odbc. Não seria fácil alterar a plan para enviar.

1 -Como faço para aumentar o limite default do solver no vba para um número maior que 8000 subproblemas?
2 - Como eu faço para que ao rodar o passo final do solver - SolverSolve True - , ele termine de rodar sem que apareça aquela mensagem perguntando se eu quero continuar, parar ou salvar o cenário?

 
Postado : 09/11/2016 2:17 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Hugo,

Só vou padronizar as palavras, SUBPROBLEMAS = Restrições.

1 -Como faço para aumentar o limite default do solver no vba para um número maior que 8000 subproblemas?
2 - Como eu faço para que ao rodar o passo final do solver - SolverSolve True - , ele termine de rodar sem que apareça aquela mensagem perguntando se eu quero continuar, parar ou salvar o cenário?

Para a primeira pergunta você pode ir juntando as restrições por blocos de células como eu mostrei no post acima, você está colocando restrição célula por célula. A restrições do seu exemplo podem ser reduzidas para 3 blocos.
Mesmo que você agrupe as células em algum momento você vai atingir o limite da versão free do Solver (não sei quantas restrições no máximo essa versão aceita), sei que o limite de variáveis é 200.

Sobre a segunda pergunta, normalmente eu uso no 'Simplex' e só vai aparecer a mensagem uma vez quando termina de rodar o modelo. No seu caso está aparecendo enquanto realiza o processo ainda?

att,

 
Postado : 09/11/2016 3:42 pm
(@hugomoreda)
Posts: 34
Eminent Member
Topic starter
 

Desculpa Bruno, na minha opinião você classificou erroneamente.

Tenho 4 restrições, mas o que eu queria era aumentar a quantidade de iterações. Acho que o excel chama as iterações de subproblemas.

 
Postado : 10/11/2016 11:54 am
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa tarde Hugomoreda,

As suas restrições nesse seu código caso são:

SolverAdd CellRef:="$G$30", Relation:=3, FormulaText:=0

SolverAdd CellRef:="$G$32", Relation:=1, FormulaText:=0

SolverAdd CellRef:="$G$33", Relation:=3, FormulaText:=0

SolverAdd CellRef:="$V$40:$V$62", Relation:=3, FormulaText:=DESC_MAX

SolverAdd CellRef:="$V$40:$V$62", Relation:=1, FormulaText:=DESC_MAX

Você pode substituir o código que coloquei acima no seu.

No seu código está:

MaxSubproblems = 10000000
Iterations = 10000000

As iterações deve estar relacionadas ao algoritmo genético

EngineDesc:="Evolutionary"

, a versão free do Solver deve ter um limite que desconheço.

Sem ver um arquivo de exemplo posso apenas especular.

att,

 
Postado : 12/11/2016 1:18 pm