Impostare Risolutore

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
napo1985
00sabato 6 maggio 2017 19:16
Ciao a tutti,
impostando il risolutore (io utilizzo OpenOffice Calc) nel foglio allegato denominato FRONTIERA i seguenti vincoli:

1) CELLA DI DESTINAZIONE: K30
2) OTTIMIZZA RISULTATO: MASSIMO
3) RIFERIMENTO CELL:

K22;K26 >= 0
K27 = 1
K31 = J31

4) TRAMITE MODIFICA CELLE: K22;K26

Non capisco perché, volendo massimizzare la cella K30 (ossia ottenere un valore maggiore rispetto a quello nella cella J30) e mantenere identici i valori delle celle K31 e J31, ottengo invece come risultato finale un valore di K30 minore di J30 ed un valore di K31 diverso da quello di J31.

Grzie.....
dodo47
00sabato 6 maggio 2017 20:02
Ciao
a me restituisce un valore superiore: 4,92% ed i valori in riga 31 restano uguali.

Nota che le celle J, K di riga 31 devono essere matriciali, nel tuo allegato non lo erano.

saluti


napo1985
00sabato 6 maggio 2017 20:36
GRAZIEEEEEEEEEEEEEEEE!!!!!

Non ho capito bene dove avevo sbagliato. Posso chiederti nel dettaglio cosa dovrei correggere?


gentilissimo
dodo47
00domenica 7 maggio 2017 09:25
Ciao
io mi sono limitato a ricostruire i dati del risolutore così come li hai descritti.

Inoltre, come detto, nel file che hai inviato le 4 celle J,K di riga 30 e 31 davano errore in quanto vanno inserite come matrice, cioè con ctrl shift invio non con il solo invio.

saluti

napo1985
00domenica 7 maggio 2017 16:26
Grazie, sei molto gentile.

Posso approfittare per chiederti le ultime due cose, se possibile:

1) Nel foglio GRAFICO, imposto la creazione di un grafico "XY (DISPERSIONE)", fleggo LINEE SMORZATE, imposto come serie dati K36;L42 del foglio FRONTIERA. Sull'asse delle X metto poi L36;L42 (foglio FRONTIERA) e sull'asse delle Y metto K36;K42 (foglio FRONTIERA);

Il risultato, tuttavia, mi viene una linea retta e non una liena curva (allego pdf dell'immagine di un esempio preso da youtube di come dovrebbe venire la curva del grafico).

In cosa sbaglio?


2) Se volessi periodicamente aggiornare il foglio FRONTIERA aggiungendo dei valori nelle colonne B21, C21, D21, E21, F21, e così via, sarebbe possibile che tutti i calcoli eseguiti nei vari fogli si aggiornassero in automatico, compreso il grafico finale?


grazie,
buona domenica
dodo47
00domenica 7 maggio 2017 17:28
Ciao
non sbagli nulla, l'andamento "sinuoso" è dato dai valori del grafico. Infatti se sostituisci ai tuoi valori, quelli dell'esempio trovato in internet, il tuo grafico appare come vedi.

Per quanto riguarda l'aggiornamento automatico delle formule, devi usare dei nomi.

Ti faccio un esempio:
- crei un nome chiamato: BreveTermine con la seguente formula:

=SCARTO(FRONTIERA!$B$1;0;0;CONTA.VALORI(FRONTIERA!$B:$B);1)

Nel foglio FRONTIERA, in J2 J3, al posto di B2:B20 ci scrivi BreveTermine, quindi in J2 la formula sarà:

=MEDIA(BreveTermine)*12

Lo stesso devi fare per le altre colonne (da C a F)
Quindi dovrai sostituire in tutte le formule, i range con i nomi assegnati.

NOTA:per la tabella, quel modo di creare il nome non funziona, quindi fai così:
in A1 ci scrivi: =CONTA.VALORI(B:B) (da utilizzare come cella d'appoggio);
poi crei un nome (es: MiaTabella) con la seguente formula:
=INDIRETTO("B2:F"&FRONTIERA!$A$1)

Nella tabella matriciale che va da J4 a N18 sostituisci B2:B20 CON MiaTabella.
E, visto che ci sei, sostituisci quel /19 con:
($A$1-1), almeno tutte le volte che aggiungi dati, non sei costretto a cambiare la formula.


saluti

(Modificato)
napo1985
00domenica 7 maggio 2017 18:14
Grazie delle dritte.

Purtoppo sto prpvando ma non mi riesce. Forse, azni sicuramente, si tratta di un livello di dimestichezza con excel per me troppo alto!....


Se hai qualche minuto di tempo libero e riuscissi a impostarmi il foglio di lavoro con tali modifiche te ne sarei davvero grato. Ma non voglio abusare del tuo tempo, sei stato davvero molto cortese a rispondere a tutte le mie domande.
dodo47
00domenica 7 maggio 2017 18:23
Ciao
Forse non sono stato chiaro, ma la procedura è quella descritta nell'altro post.
1) si crea un nome con quella formula
2) si sostituisce nelle formule il range con il relativo nome.
Non sembra difficile.

Comunque, leggi bene i nomi assegnati ed i range di riferimento, nonché le variazioni apportate alle formule.

...E Controlla....

C'è un foglio1 che puoi cancellare dove ho fatto le prove del grafico. Vedrai che se ci metti i tuoi valori, verrà una riga diritta.

saluti

dodo47
00domenica 7 maggio 2017 19:08
Leggi QUI come fare ad inserire un nome.

(devi approfondire un po' la tua conoscenza di excel, almeno le basi essenziali....)

saluti

napo1985
00domenica 7 maggio 2017 22:21
ok.


Sono arrivato finalmente alla fine dell'applicativo che volevo costruire. E' possibile con excel creare un "pulsante" nel foglio EFFICIENTAMENTO, con scritto "RISOLVI", per cui cliccandolo si attiva in automatico il risolutore?

le caratteristiche del risolutore dovrebbero essere:

1) CELLA DI DESTINAZIONE: B15
2) OTTIMIZZA RISULTATO: MINIMO
3) RIFERIMENTO CELL:

B7;B11 >= 0
B12 = 1
B14 = B2

4) TRAMITE MODIFICA CELLE: B7;B11



in tal modo, basterebbe che io inserissi manualmente il valore che vorrei ottenere nella cella B2 e, cliccando sul pulsante "RISOLVI", avere la distribuzione delle percentuali nelle celle B7;B12.


saluti
dodo47
00lunedì 8 maggio 2017 09:17
Ciao
lo fai facilmente attivando il registratore di macro e facendo passo passo quanto hai detto. Alla fine, interrompi la registrazione e tra i moduli del vbe avrai la tua macro che potrai legare ad un pulsante.

Non basta: sul tuo pc nella finestra del vbe devi attivare il riferimento al Solver dal menu strumenti > riferimenti.
Ricordati ad inizio macro di aggiungere il reset del solver con:
SolverReset

NOTA: Nel tuo allegato le formule in B14 e B15 danno #VALORE...ne avevamo già parlato, devono essere matriciali.


saluti


napo1985
00lunedì 8 maggio 2017 17:07
Ciao,
non capisco come mai io nel file non ho nessuna cella con VALORE. Secondo te, la mancata attivazione delle matrici può dipendere dal fatto che utilizzo Office Calc?

Quando digito ctr+shift+invio, dopo aver impostato la formula con le matrici, nel caso ad esempio dell'efficientamento della cella K30 del foglio FRONTIERA, ottengo un risultato diverso rispetto a quello che sei riuscito ad ottenere tu!

A me esce come risultato K30= 4,84 e k31=5,06, mentre dovrebbe uscire il risultato k30=4,92 e k31=5,11, eppure sul risolutore ho inserito il vincolo k31=j31 (in cui j31 ha un valore di 5,11!).

Non riesco proprio a capire il motivo!

dodo47
00lunedì 8 maggio 2017 17:28
Ciao
che dire, non mi sono accorto che utilizzi Office Calc, altrimenti ti avrei risposto che non conoscendolo, non garantivo i risultati dei miei interventi, a me (come credo tu abbia notato) escono 4,92 e 5,11.


Però qui a circa metà dicono che vanno inserite con una sequenza diversa da quella di Excel:

"....make sure to enter it as matrix formula with Shift+Ctrl+Enter..."
ma, come detto, non conosco Office Calc

saluti

Edit: però in excel ctrl+shift+invio oppure shift+ctrl+invio sono uguali....non saprei proprio (anche perché dici che il mio foglio funziona....)
dodo47
00lunedì 8 maggio 2017 17:52
Ciao
... non sono convinto:
tuoi valori da P14 a P18:
-0,10%
2,27%
3,86%
8,03%
10,47%

tuoi valori da K22 a K26:
14,75%
0,00%
60,39%
0,00%
24,86%

moltiplicando le due matrici (quindi simulando MATR.PRODOTTO(MATR.TRASPOSTA(.....) e facendo la somma si ottiene: 4,92
-0,10% x 14,75% = -0,01&
2,27% x 0,00% = 0,00%
3,86% x 60,39% = 2,33%
8,03% x 0,00% = 0,00%
10,47% x 24,86% = 2,60%

TOTALE è............ 4,92


ora perché tu ottieni: 4,84 ???
napo1985
00mercoledì 10 maggio 2017 22:03
ciao dodo47,
vorrei chiederti, cortesemente, se posso approfittare della tua abilità e chiederti di apportare al file allegato le seguenti modifiche (chiaramente se la cosa è per te possibile):

1) sul foglio MAX RENDIMENTO vorrei creare un pulsante, con scritto CALCOLA, che attivi un risolutore con i seguenti vincoli:

A)CELLA DI DESTINAZIONE: B15
B)OTTIMIZZA RISULTATO: MINIMO
C)TRAMITE MODIFICA CELLE: B7;B11

D)RIFERIMENTO CELLE:
B12=1
B7;B11>= 0
B14=B2

In tal modo, potrei inserire manualmente il valore atteso nella cella B2, cliccare sul pulsante CALCOLA e avere immediatamente il risultato atteso;


2) sul foglio FRONTIERA vorrei creare un altro pulsante nella casella M58, con scritto CALCOLA, che attivi un risolutore con i seguenti vincoli:

A)CELLA DI DESTINAZIONE: M55
B)OTTIMIZZA RISULTATO: MASSIMO
C)TRAMITE MODIFICA CELLE: M48;M52

D)RIFERIMENTO CELLE:
M53=1
M48;M52>= 0
M56=L56

3) sul foglio FRONTIERA vorrei creare un ultimo pulsante nella casella M71, con scritto CALCOLA, che attivi un risolutore con i seguenti vincoli:

A)CELLA DI DESTINAZIONE: M69
B)OTTIMIZZA RISULTATO: MINIMO
C)TRAMITE MODIFICA CELLE: M461;M65

D)RIFERIMENTO CELLE:
M66=1
M61;M65>= 0
M68=L55


Grazie per tutto l'aiuto e il supporto, preziosissimo, che mi stai dando.





dodo47
00giovedì 11 maggio 2017 17:21
Re:
Ciao
ti avevo detto di farlo in autonomia, attivando il registratore di macro.

dodo47, 08/05/2017 09.17:

Ciao
lo fai facilmente attivando il registratore di macro e facendo passo passo quanto hai detto. Alla fine, interrompi la registrazione e tra i moduli del vbe avrai la tua macro che potrai legare ad un pulsante.

Non basta: sul tuo pc nella finestra del vbe devi attivare il riferimento al Solver dal menu strumenti > riferimenti.
Ricordati ad inizio macro di aggiungere il reset del solver con:
SolverReset....




In modo particolare io non posso fare per te la seconda parte (...sul tuo pc...ecc..ecc)

Quindi attiva il registratore di macro, registrala e, se non funziona invii il file con la macro e vedremo il da farsi.

saluti

(tra l'altro usi Open Off.Calc e non so quanto le macro siano compatibili)

Questo è un esempio della prima richiesta (Foglio max rendimento).
Sub Test
    SolverReset
    SolverOk SetCell:="$B$15", MaxMinVal:=2, ValueOf:=0, ByChange:="$B$7:$B$11", _
        Engine:=1, EngineDesc:="GRG Nonlinear"
    SolverAdd CellRef:="$B$12", Relation:=2, FormulaText:="1"
    SolverAdd CellRef:="$B$7:$B$11", Relation:=3, FormulaText:="0"
    SolverAdd CellRef:="$B$14", Relation:=2, FormulaText:="$B$2"
    SolverOk SetCell:="$B$15", MaxMinVal:=2, ValueOf:=0, ByChange:="$B$7:$B$11", _
        Engine:=1, EngineDesc:="GRG Nonlinear"
    SolverOk SetCell:="$B$15", MaxMinVal:=2, ValueOf:=0, ByChange:="$B$7:$B$11", _
        Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve
End Sub

Alla quale andrà aggiunta una gestione di eventuali errori che ti darò in seguito quando (e se) ti funzionerà).

Ma il codice non ti funzionerà se non attivi il riferimento di cui sopra.

Comunque è meglio se la fai con il tuo registratore di macro in modo da poter comparare eventuali differenze di istruzioni.
napo1985
00venerdì 12 maggio 2017 09:25
Mi sono dotato di Office 2010 e seguendo, passo passo, quello che mi hai scritto sono riuscito a far funzionare il tutto.

Se sei d'accordo, una volta che ho completato il tutto allego il file per una revisone finale!
dodo47
00venerdì 12 maggio 2017 09:40
Ciao, bene. Così avrai modo di testarlo anche con ooo.

Ti suggerisco quanto segue:
1) all'inizio di ognuna delle 3 macro inserisci:

Sub TuaMacro()
Dim answer As Integer
.....

2) elimina l'ultima istruzione prima di End Sub: SolverSolve e la sostituisci con queste 2:

answer = SolverSolve(True, "ShowTrial")
ShowTrial answer


3) aggiungi questa funzione che gestisce eventuali errori del solver. La puoi mettere nello stesso modulo delle 3 sub.

saluti

Function ShowTrial(Reason As Integer)
If Reason = 0 Then
    MsgBox ("Solver found a solution. All constraints and optimality conditions are satisfied.")
End If
If Reason = 1 Then
    MsgBox ("Solver has converged to the current solution. All constraints are satisfied")
End If
If Reason = 2 Then
    MsgBox ("Solver cannot improve the current solution. All constraints are satisfied.")
End If
If Reason = 3 Then
    MsgBox ("Stop chosen when the maximum iteration limit was reached.")
End If
If Reason = 4 Then
    MsgBox ("The Set Cell values do not converge.")
End If
If Reason = 5 Then
    MsgBox ("Solver could not find a feasible solution.")
End If
If Reason = 6 Then
    MsgBox ("Solver stopped at user's request.")
End If
If Reason = 7 Then
    MsgBox ("The conditions for Assume Linear Model are not satisfied.")
End If
If Reason = 8 Then
    MsgBox ("The problem is too large for Solver to handle.")
End If
If Reason = 9 Then
    MsgBox ("Solver encountered an error value in a target or constraint cell.")
End If
If Reason = 10 Then
    MsgBox ("Stop chosen when maximum time limit was reached.")
End If
If Reason = 11 Then
    MsgBox ("There is not enough memory available to solve the problem.")
End If
If Reason = 12 Then
    MsgBox ("Another Excel instance is using SOLVER.DLL. Try again later.")
End If
If Reason = 13 Then
    MsgBox ("Error in model. Please verify that all cells and constraints are valid.")
End If
If Reason = 14 Then
    MsgBox ("Solver found an integer solution within tolerance.  All constraints are satisfied.")
End If
If Reason = 15 Then
    MsgBox ("Stop chosen when the maximum number of feasible [integer] solutions was reached.")
End If
If Reason = 16 Then
    MsgBox ("Stop chosen when the maximum number of feasible [integer] subproblems was reached.")
End If
If Reason = 17 Then
    MsgBox ("Solver converged in probability to a global solution.")
End If
If Reason = 18 Then
    MsgBox ("All variables must have both upper and lower bounds.")
End If
If Reason = 19 Then
    MsgBox ("Variable bounds conflict in binary or alldifferent constraint.")
End If
If Reason = 20 Then
    MsgBox ("Lower and upper bounds on variables allow no feasible solution.")
End If
 
    ShowTrial = True
End Function
napo1985
00venerdì 12 maggio 2017 12:59
Ciao dodo47,
ho provato ad aggiungere questo ultimo passaggio ma il VBA mi da errore. Mi potresti dire dove sto sbagliando? dai che ci siamo! sono contentissimo!

allego schermata errore e schermata con inserimento delle forumle.
dodo47
00venerdì 12 maggio 2017 14:18
leggi bene quello che scrivo:

- perché ci hai messo l'apice in Dim answer as integer ?
- perché hai messo l'apice a SolverReset ?
- dov'è: answer = SolverSolve(True, "ShowTrial") ??

se te lo scrivo ci sarà pure un motivo no?







napo1985
00martedì 16 maggio 2017 20:02
Ciao,
ho rifatto il file con i tre pulsanti. Posso chiederti un controllo per sapere se ho fatto tutto bene?

Hai qualche idea per formattare meglio il foglio di come ho fatto io?


grazie,
dodo47
00martedì 16 maggio 2017 20:24
Ciao
non vedo pulsanti da nessuna parte.

Nota:

la Function ShowTrial deve stare solo in un modulo (magari quello delle altre sub)

uno dei due file restituisce errore 400

invia 1 solo file completo

che fine ha fatto la sub del foglio MAX RENDIMENTO ??

Per quanto riguarda il layout è soggettivo. Normalmente si mette nella parte sinistra del foglio i valori che devono essere "consultati" ed i relativi pulsanti; tutto quello che sono tabelle di calcolo andrebbero "fuori vista" se non servono effettivamente alla consultazione. Vedi tu.

saluti
napo1985
00giovedì 18 maggio 2017 16:26
Perdona la domanda, ma ogni volta che allego il VBA ai pulsanti che ho creato quest'ultimi dopo un pò di volte che riapro il file excel spariscono e devo reimpostare il tutto.

Sapresti dirmi cosa sbaglio? è possibile salvare i pulsanti con allegate le macro solo per un singolo file excel senza che questi compaiano in tutti i file excel che apro?
dodo47
00giovedì 18 maggio 2017 18:48
Ciao
come faccio a sapere che succede da te o cosa sbagli? E' molto strano quello che dici e direi poco probabile.

Ti ripeto: che fine ha fatto la sub del foglio MAX RENDIMENTO ??

Comunque tutte le macro vanno in un solo modulo.

Ti allego esempio

saluti

napo1985
00giovedì 18 maggio 2017 19:03
Io avevo collegato la registrazione della matrice ad una nuova scheda all'interno della barra multifunzion, in quanto non ero riuscito ad impostare un pulsante all'interno del foglio excel come hai fatto tu! non credevo che si potesse!

che cosa vuol dire che "fine ha fatto la sub del Max Rendimento?"... perdonami, mi sento un inetto!... scusa
dodo47
00giovedì 18 maggio 2017 19:58
Ciao
nei file che mi hai mandato tu c'erano le seguenti macro:

Sub RENDIMENTO() che aveva come cella destinazione: $M$55, quindi faceva riferimento al foglio FRONTIERA cella M55
(la mia si chiama:Sub Ris_Foglio_Front_M55)

Sub RISCHIO() che aveva come cella destinazione: $M$69, quindi faceva riferimento al foglio FRONTIERA cella M69
(la mia si chiama: Sub Ris_Foglio_Front_M69)

POI c'era: Sub MASSIMIZZA()che aveva come cella destinazione: $K$84, quindi faceva riferimento al foglio FRONTIERA cella K84
(io non ce l'ho quindi l'hai fatta tu...bene!!)


la domanda è:
che fine ha fatto la macro che aveva come cella di riferimento B15 del foglio MAX RENDIMENTO ??

Nel file che ti ho inviato c'è e si chiama: Sub Ris_Foglio_Max

Spero di aver chiarito.

saluti

napo1985
00lunedì 10 luglio 2017 20:11
Ciao,
torno di nuvo su questa discussione in quanto, non so cosa ho combinato, ma se inserisco manualmente nel "box" EFFICINTAMENTO, del foglio FRONTIERA, dei valori in K48-K52 e digito poi sul pulsante CALCOLA (celle N54-55) il risultato della somma delle celle N48-N52 non coincide con N53.

Non so se sono stato chiaro. Nel caso cerco di spiegarmi meglio.
Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 14:41.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com