REKLAMA

DANE_35170_DoOBL_b.xls

Excel-Solver - Makro wielokortnie uruchamiające Solver

Moja nieudolna próba podejścia do takiego zadania w załączniku (będzie to Makro1 w module2). Regulując parametr DOKL regulujemy precyzję. W makrze tym brakuje jakiejkolwiek inteligencji, więc działa bardzo wolno. Sprawdza wszystkie wartości od 0 do 180 podstawiając je do O/P i w konsekwencji po 180*180 iteracjach (dla DOKL=1.0) albo 1800*1800 (dla DOKL=0.1) wypluwa odpowiednie wartości. Na szybkim komputerze przez noc dla wartości 0.1 da się policzyć. Ewentualnie krok 0.25 czy 0.5 również można przyjąć - zależnie od tego, jaka dokładność jest wymagana. Jeśli jest potrzebna większa dokładność to jest problem. Można byłoby dorobić dodatkowy "fine tuning" polegający na przykład na zgrubnym policzeniu z krokiem co 1.0 całego arkusza, po czym przeliczenia go ponownie tym razem przyjmując dla O i P wartości nie 0..180 a +/-1 od znalezionych przy zgrubnym poszukiwaniu, ale tym razem z większą dokładnością. To tylko przykład, ale przy większych dokładnościach już powinien znacznie przyspieszyć proces. Jeśli makro uzyska dwa takie same wyniki U dla różnych O/P - w odpowiedzi uwzględni pierwszą znalezioną parę. Pewnie ktoś napisze coś mądrzejszego albo uruchomi poprawnie Solvera może :) /Edit Jako że zaimplementowanie funkcji liczącej dokładniej to, co opisałem jako sugerowaną poprawkę nie jest trudne - zrobiłem też drugie makro. Działa ono zdecydowanie szybciej, ale działa ono na danych policzonych już przez Makro1. Robi po prostu "fine tuning" do 6-go miejsca po przecinku. Algorytm działania, który założyłem (tu Kolega zadecyduje czy słuszny) wygląda następująco: Makro1 liczy z rozdzielczością 1, tak więc można się spodziewać, że gdzieś w okolicy wynik +/- 1 może znaleźć się lepszy wynik. Makro2 zatem "dostraja" parametry O/P najpierw w zakresie +/-1 co 0.1, potem znaleziony wynik dostraja +/-0.1 z krokiem co 0.01 i tak dalej aż do 6 miejsca po przecinku. Liczenie każdego dodatkowego miejsca na tej zasadzie to dokładnie 20 iteracji (powinno być właściwie 18, bo przy 20 graniczne były przecież wcześniej już liczone). Ogólnie zagęściło to jakoś wyniki. Spróbuję jeszcze zredukować makro 1 do liczenia zgrubnie z dokładnością 10 (a nie 1) i porównam zaraz wyniki, czy przypadkiem nie będą takie same jak przy długim liczeniu pierwszego etapu z dokładnością 1. /Edit2: Z ciekawostek - przeliczenie z dokładnością zgrubną 10 a także 1 a później fine-tuning dał nieco "gorsze" wyniki niż sporo dłuższe przeliczenie z dokładnością 0.5+fine tuning. Różnice (U) zwykle były na jednym bądź dwóch ostatnich miejscach dziesiętnych, ale znalezione parametry O/P mogły być zupełnie odmienne (przykład - dokładniejsze makro w pierwszej linii ustawiło O/P na 11.0/144.5, drugie na 77.0/0.0 uzyskując ten sam wynik 0.000001, inny przykład: komórka U27 uzyskała w "lepszym" przebiegu wartość 0.000301 (O/P = 177.5/11.0), w gorszym 0.000285 (O/P = 80.000300/80.006300) - czyli to nie są drobne przesunięcia, tylko zupełnie inne pary liczb. Arkusz w załączniku jest po przejechaniu makrem liczącym z dokładnością 0.5 i po fine tuningu drugim makrem. Przy okazji: teraz zwróciłem uwagę, że stała DOKL w drugim makro nic nie robi. Precyzję definiuje pierwsza pętla For zz = 1 To 6 i oznacza, że makro będzie kolejno liczyć dokładniej od pierwszego do szóstego miejsca po przecinku. Aby zwiększyć dokładność do większej ilości miejsc można zmienić na 1 to 10 czy jakkolwiek potrzeba.


Pobierz plik - link do postu

" $O$8:$P$8 przez " , " (Wszystko) "
" Etykiety wierszy " , " $T$8 " , " $U$8 "
" 1 " , " 0.158456589870906 " , " 6.3822999384171e-07 "
" Maksima " , " -0.00709526 " , " -2.47685e-07 "
" Microsoft Excel 14.0 Raport wyników "
" Arkusz: [DANE_35170_DoOBL.xlsm]DANE_35170_DoOBL "
" Raport utworzony: 2013-12-07 22:32:05 "
" Wynik: Dodatek Solver znalaz? rozwi?zanie. Wszystkie ograniczenia i warunki optymalizacji s? spe?nione. "
" Aparat dodatku Solver "
, " Aparat: Nieliniowa GRG "
, " Czas rozwi?zania: 0 sek. "
, " Liczba iteracji: 0 Podproblemy: 0 "
" Opcje dodatku Solver "
, " Maksymalny czas Nieograniczone, Iteracje Nieograniczone, Precision 0.000001, U?yj skalowania automatycznego "
, " Zbie?no?? 0.0001, Rozmiar populacji 100, Inicjator losowy 0, Pochodne w przód, Wymagaj granic "
, " Maksymalna liczba podproblemów Nieograniczone, Maksymalna liczba rozwi?za? ca?kowitoliczbowych Nieograniczone, Tolerancja ca?kowitoliczbowa 1%, Rozwi?? bez ogranicze? ca?kowitoliczbowych "
" Komórka celu (Maks) "
, " Komórka " , " Nazwa " , " Warto?? pocz?tkowa " , " Warto?? ko?cowa "
, " $U$8 " , " EpsE " , " 0 " , " 0 "
" Komórki zmiennych "
, " Komórka " , " Nazwa " , " Warto?? pocz?tkowa " , " Warto?? ko?cowa " , " Ca?kowite "
, " $O$8 " ,, " 5.39347247471729 " , " 5.39347247471729 " , " Ci?g?e "
, " $P$8 " , " 0r " , " 1.89365322789813 " , " 1.89365322789813 " , " Ci?g?e "
" Ograniczenia "
, " Komórka " , " Nazwa " , " Warto?? komórki " , " Formu?a " , " Stan " , " Zapas czasu "
, " $O$8 " ,, " 5.39347247471729 " , " $O$8 & lt; =180 " , " Niewi???ce " , " 174.606527525283 "
, " $O$8 " ,, " 5.39347247471729 " , " $O$8 & gt; =0 " , " Niewi???ce " , " 5.39347247471729 "
, " $P$8 " , " 0r " , " 1.89365322789813 " , " $P$8 & lt; =180 " , " Niewi???ce " , " 178.106346772102 "
, " $P$8 " , " 0r " , " 1.89365322789813 " , " $P$8 & gt; =0 " , " Niewi???ce " , " 1.89365322789813 "