Maksymalne wykorzystanie możliwości komputera do obliczeń

2015-01-21 10:38
0

Mam 7 lub 8 parametrów, których wartość musi się mieścić w zakresie <1; 200>. Wszystkie są użyte w jednym równaniu. Chciałbym policzył dla jakich wartości tych parametrów działanie będzie miało największy wynik. W tym celu zrobiłem 7 pętli for parametr_n := 1 to 200 do. Każda kolejna jest wpisana w poprzednią, a w ostatniej jest działanie. O ile sam program działa dobrze, bo sprawdziłem to na mniejszym zakresie to po prostu strasznie wolno to oblicza. Zresztą na mniejszym zakresie trwało to ponad pół godziny, W końcu jest to bardzo dużo obliczeń. Chciałbym zapytać czy można w jakiś sposób to przyśpieszyć? Program po uruchomieniu zużywa ok 12-15% procesora i 2 MB pamięci. Co ważne, ten program jest tylko pomocniczy dla mnie i nie ma być uruchamiany na innym komputerze. Więc chciałbym wykorzystać możliwości mojego w jak największym stopniu.

Pozostało 580 znaków

2015-01-21 11:19
0

Wielowątkowość albo OpenCL

Pozostało 580 znaków

2015-01-21 12:06
0

http://pl.wikipedia.org/wiki/Programowanie_liniowe
http://www.coderscity.pl/sutra204614.html


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2015-01-21 12:30
0

Najlepiej jakbyś pokazał szczegóły problemu. Jak wyglądają te równania, jaką wartość masz maksymalizować itp.
Po tym się okaże jak najlepiej do tego podejść: siłowo (OpenCL) czy może miękko (algorytm genetyczny), a może jakaś inna prosta metoda optymalizacji (np Newtona).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2015-01-21 12:40
2

Szybkie wyliczenie dla 7 parametrów, 2007 = 12800000000000000 = 12 800 000 miliardów
Gdyby więc twoje równanie dało się policzyć w ciągu 1 taktu procesora a twój procesor miał 5GHz to zajęłoby to 2560000 sekund czyli 30 dni.
Gdyby parametrów było 8 to zajęłoby to oczywiście 200 razy dłużej. Powodzenia.

Miej na uwadze że twój procesor zapewne ma ~3GHz a wyliczenie równania zajmuje przynajmniej kilkadziesiąt taktów, a może i kilkaset, zależnie od poziomu skomplikowania. Więc realnie czas obliczeń będzie przynajmniej o rząd/dwa rzędy wielkości większy...


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2015-01-21 12:42
Kombinacja 7 elementowa zbioru 200 elementowego z powtórzeniami daje 98 619 368 491... hm... wyczuwam zło w problemie... - Koziołek 2015-01-21 15:13
Gorzej bo to przecież wariacja w powtórzeniami :P Przecież ma znaczenie który parametr ma którą wartość i dodatkowo autor nigdzie nie powiedział że dana wartość może być przyporządkowana jednemu parametrowi. - Shalom 2015-01-21 15:17

Pozostało 580 znaków

2015-01-21 13:04
0

Jakiś algorytm genetyczny powinien dać dobrą heurezę.


"A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects." Robert Heinlein.

Pozostało 580 znaków

2015-01-21 15:17
1

Pytanie czy funkcja, która jest wyliczana może zostać przetransformowana zgodnie z zasadą:

F(a_{1}, ... , a_{n}) = \sum\limits_{i=1}^n G_{i}(a_{i})

inaczej mówiąc czy można ją pociąć na sumę funkcji o mniejszej ilości parametrów.

edytowany 3x, ostatnio: Koziołek, 2015-01-21 15:20
Jasnowidz? Popatrz na tą jego funkcję... ;] - Shalom 2015-01-21 19:03

Pozostało 580 znaków

2015-01-21 18:18
0
MarekR22 napisał(a):

Najlepiej jakbyś pokazał szczegóły problemu. Jak wyglądają te równania, jaką wartość masz maksymalizować itp.
Po tym się okaże jak najlepiej do tego podejść: siłowo (OpenCL) czy może miękko (algorytm genetyczny), a może jakaś inna prosta metoda optymalizacji (np Newtona).

Wartosc := ((A / 100) * (SumaD - SumaM)) + ((B / 100) / CiagD * CiagM) + ((C / 100) * SumaM) + ((D / 100) * SumaD) + ((E / 100) / Maks * CiagM) + ((F / 100) * (0.25 - SumaM));

To jest działanie. Zmienne A-F to parametry które muszę obliczyć, tak aby Wartosc była największa. Na razie jest to 6 parametrów. To jest minimalna ilość, aby mogło zadziałać. Ale optymalnie by było dołożyć jeszcze 1 może dwa.

Tak, wiem, że jest to bardzo dużo obliczeń i zdaje sobie sprawę z tego, że może to długo potrwać. Nie liczę na wynik w ciągu kilku sekund. Ale też czekanie kilkudziesięciu dni wydaje mi się przesadą. Jedyne co mogę zmienić to jeszcze zakres dla każdego parametru z 200 do 150. Mimo wszystko jeśli się okaże, że nie będzie możliwe policzenie tego w szybszym tempie to będę musiał znaleźć inny sposób.

edytowany 1x, ostatnio: dani17, 2015-01-21 18:18

Pozostało 580 znaków

2015-01-21 18:45
0

@dani17 moje obliczenia były dla bardzo optymistycznego przypadku, realnie spodziewałbym się że potrwa to przynajmniej z rok ;)

Prosty przykład: jeśli twoje obliczenia dla 6 parametrów wykonywałyby się w ciągu 1 sekundy to obliczenia dla 7 parametrów w 3,5 minuty a dla 8 prawie 12 godzin. Oczywiście nie ma takiej możliwości bo żeby obliczenia dla 6 parametrów trwały 1 sekundę potrzebowałbyś procesora z zegarem 64 000 GHz liczącego całe to wyrażenie w 1 takcie ;)

A czym są te wartości SumaD, SumaM, CiagD itd. One są zależne od parametrów jak rozumiem?


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-01-21 18:47
0

To są zmienne, obliczone z innej części na podstawie danych wprowadzonych przeze mnie.

W momencie uruchomienia funkcji która próbuje napisać one są już stałe i się nie zmieniają. Zmieniać maja się tylko parametry A-F, no i oczywiście Wartosc.

edytowany 1x, ostatnio: dani17, 2015-01-21 18:49

Pozostało 580 znaków

2015-01-21 18:52
1

Żartujesz sobie? Bo ja tu w takim razie widzę wyrażenie:
wynik = f(A) + g(B) + h(C) + ...
Którego maksimum zawsze będzie sumą maksimów poszczególnych funkcji. Chyba że ja czegoś nie widzę... Co więcej tak na oko to każda z tych funkcji jest silnie monotoniczna i ma tylko dwa ekstrema -> dla mininalnej i dla maksymalnej wartości parametru. Jeśli ta druga część którą sobie wyliczasz wcześniej jest dodatnia do maksiumum występuje dla największej wartości parametru a jeśli ujemna to maksimum uzyskasz dla mininalnej wartości parametru.

No bo przecież jak znajdziesz maksimum f(A) = ((A / 100) * (SumaD - SumaM)) to masymalna suma Wartosc ZAWSZE będzie zawierać maksimum tej funkcji. A f(A) ma przecież postać: A*stała/100 czyli de facto A/stała więc siłą rzeczy ma wartość maksymalną dla dużego A o ile stała jest dodatnia, lub dla małego A jeśli stała jest ujemna.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 2x, ostatnio: Shalom, 2015-01-21 18:56

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0