| Autor |
Nachricht |
SeppJ
Moderator
Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17956
|
SeppJ Moderator
20:33:05 03.05.2012 Titel: |
Schema gesucht: Sehr teure Gleichungen parallel lösen, ohne viel Rechenzeit zu verschwenden |
Zitieren |
Achtung, jetzt wird es erst einmal mathematisch (aber nicht schwer! Bloß abstrakt), ich suche aber einen Algorithmus, daher frage ich hier:
Ich habe eine Funktion §E(x)§. Die Funktionswerte sind sehr sehr teuer zu berechnen, sagen wir ein CPU-Tag, nicht parallelisierbar. Aber ich kann mehrere §E(x)§ gleichzeitig parallel berechnen.
Nun habe ich eine weitere Funktion
§F(E(x_1),E(x_2)) \text{ mit } x_1 < x_2§,
die auf diesen §E(x)§ operiert. Diese Funktion ist billig. Es gilt (falls es hilft):
§F(E(x), E(x+\delta x_1)) < F(E(x), E(x+\delta x_2)), \text{dann und genau dann, wenn } \delta x_1 < \delta x_2§
In Worten: F ist monoton, wenn man eines der Argumente festhält. (Da gibt's bestimmt auch noch Fachsprech für, das mir gerade nicht einfällt)
Außerdem ist F stetig, (numerisch) differenzierbar und alles was man sich sonst noch so wünschen kann.
Problemstellung:
Nun möchte ich eine Kette von x'en §(x_0 = x_{start}, x_1, x_2, \dots , x_{end})§ mit vorgegebenem §x_{start}§ und einem ungefähren Wunschwert §x_{end}§ erzeugen. Als Nebenbedingung soll dabei gelten
§F(E_{x_i}, E_{x_{i+1}}) = C§
wobei §C§ eine vorgegebene Konstante ist. Wegen der oben angegebenen Eigenschaft der Funktion F ist es immer möglich, zu einem gegebenen §x_i§ ein (eindeutiges) §x_{i+1}§ zu finden, für das diese Bedingung exakt erfüllt ist. Aber eine Approximation reicht mir! Sie muss noch nicht einmal besonders gut sein. Wie genau formuliert werden soll, wann eine Approximation ausreichend ist, lasse ich erst einmal offen. Meinetwegen kann man es so formulieren, dass ich eine vorgegebene Abweichung §\delta C§ toleriere.
Bedingungen an den Algorithmus:
Ich möchte nun möglichst effizient herausfinden, welchen Wert diese §x_i§ ungefähr haben müssen. Dabei möchte ich von dem Algorithmus zwei Dinge:
1. Ich will nicht ewig auf das Ergebnis warten. Ich erwarte, dass die Kette 10-50 Werte enthalten wird.Die Angabe oben mit dem einen Tag pro §E(x_i)§ war nicht übertrieben, eher untertrieben. Ich sag mal, ein bis zwei Wochen kann ich mich gedulden.
2. Ich habe nicht unendlich Ressourcen. Ja, ich kann Rechenzeit verschwenden, es muss nicht jeder berechnete Wert am Ende im Ergebnis auftauchen. Aber ich kann nicht einfach das Zielintervall in 10.000 Schritte aufteilen, zu jedem Schritt das §E§ ausrechnen und mir dann die passenden Werte rauspicken. Es muss schon irgendwie halbwegs gezielt passieren. Aber ein paar Dutzend Schüsse ins Blaue sind noch ok. Sagen wir ein paar CPU-Monate sollten insgesamt nicht überschritten werden.
So, nun suche ich Ideen, wie man das möglichst effizient machen könnte. Bitte keine ganz naiven Vorschläge, die euch beim ersten Querlesen gekommen sind. Ich habe schon eine ganze Weile darüber nachgedacht und das Problem ist nicht einfach. Ich habe aber auch nie eine informatische Algorithmenvorlesung besucht, also wenn euch die Problemstellung bekannt vorkommt, dann nur raus damit.
Was ich bisher gemacht habe:
Es gibt hier zwei/drei Probleme:
1. Eine iterative Lösung ist halbwegs schwer, da man dafür normalerweise die Ableitung von F berechnen müsste. Und dazu braucht man mehrere E. Und dann wird's teuer. Außerdem kann die Ableitung vom F durchaus wild sein, eine Approximation durch zwei weit auseinanderliegende Werte könnte schlecht sein. Aber wie schon gesagt, so schrecklich genau braucht es nicht zu sein.
2. Die Kettenbildung scheint mir inhärent seriell. Ich muss bei §x_{start}§ anfangen und mich dann von x zu x weiterhangeln. Wenn ich zwischendurch E's berechne, dann kann ich mir diese zwar merken und später vielleicht nochmal nutzen. Aber insgesamt scheint mir dadurch doch die Zeitbeschränkung schwer. Die E's die ich berechne sollten also möglichst gut angelegt sein.
(3. Metaproblem: Solche Arten von Problemen algorithmisch zu lösen habe ich nie gelernt. Hier ist man mal ganz praktisch durch Hardware und Zeit beschränkt. Ich brauche eine Lösung die in der Praxis gut funktioniert, nicht in meinem Theoretikerturm, indem ich mich bisher so wohl gefühlt habe)
Naiver Algorithmus, den ich mir ausgedacht habe:
Starte bei §x_i§. Gucke schon berechnete §E(x > x_i)§ an und bestimme so ein Intevall, in dem §x_{i+1}§ liegen muss. Dann Intervallschachtelung. Oder vielleicht besser ein Newtonverfahren? Ist halt nichtlinear . Zwischendurch berechnete E's natürlich aufheben.
Nachteil: Ich nutze nicht die Möglichkeit, dass ich mehrere E's parallel berechnen kann, da dieser Algorithmus seriell ist.
Mögliche Verbesserung: Es könnte was bringen, das Zielintervall (sowohl das konkrete Intervall zum Berechnen des nächsten §x_{i+1}§, als auch das noch übrige Gesamtintervall, in dem §x_{i+2}§ und folgende liegen werden) im Vorhinein schon grob einzuteilen und einfach auf gut Glück ein paar E's darin verteilt zu berechnen. Das lässt aber zwei Fragen offen:
1. Ist das gut angelegte Rechenzeit? Kann ich leider gar nicht einschätzen.
2. Wie diese Werte verteilen? Ich weiß a priori gar nichts über das F, außer den oben angegebenen Bedingungen. Verteilt man die spekulativen Werte dann gleichmäßig auf dem Intervall? Oder gibt es da was besseres? |
_________________ Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
Zuletzt bearbeitet von SeppJ am 20:34:43 03.05.2012, insgesamt 1-mal bearbeitet |
|
 |
cooky451
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 6870
|
cooky451 Mitglied
21:02:53 03.05.2012 Titel: |
|
Zitieren |
Ich kann dir wahrscheinlich nicht wirklich weiterhelfen, einfach weil mir der mathematische Hintergrund fehlt. Mich würde aber E(x) interessieren. Kannst (darfst) du die Funktion posten? |
_________________ Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
Keksverteilungsbeauftragter
|
|
 |
SeppJ
Moderator
Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17956
|
SeppJ Moderator
21:31:52 03.05.2012 Titel: |
|
Zitieren |
|
 |
SideWinder
Moderator
Benutzerprofil
Anmeldungsdatum: 19.10.2001
Beiträge: 18704
|
SideWinder Moderator
21:42:45 03.05.2012 Titel: |
|
Zitieren |
Kann man bzgl. E gar keine Annahmen treffen? Die Funktion springt wild umher, ist weder approximierbar noch sonstwie monoton, stetig, etc.?
Wenn du nämlich "F(E(x), E(x+1)) = C +- deltaC" haben willst, und F monoton wachsend ist, dann kannst du ja ein ungefähres Wachstum von F angeben, oder? Bspw. ob F exponentiell steigt, etc.
Wenn man nun über E besser Bescheid wüsste, könnte man ja sicher eine gute Heuristik zum Raten bauen, oder?
MfG SideWinder |
_________________ http://www.dilbert.com/2009-06-11/
http://www.dilbert.com/2009-06-14/
|
|
 |
SeppJ
Moderator
Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17956
|
SeppJ Moderator
22:09:39 03.05.2012 Titel: |
|
Zitieren |
Das E ist stetig, es ist differenzierbar und sonstwie gutartig.
Das E ist sicherlich auch nicht wild, sprich: Die erste und zweite Ableitung ist eher klein. Man kann erwarten, dass es im Gesamtintervall vielleicht ein bis zwei "Schwingungen" macht. (kein ganz zutreffendes Wort, da es keine reelle Zahl ist, aber das trifft's ganz gut)
Wie könnte mir das helfen? Heuristik klingt gut. Man könnte die auch ein bisschen anfüttern, indem man vorher das Gesamtintervall grob absteckt.
Was dem jedoch zuwieder läuft: In das F fließen immer zwei E's ein, es zählt eher so etwas wie die Differenz zweier Werte (ist leider etwas komplizierter). Daher nützt mir der absolute Wert des E nicht so viel, es zählt eher das Verhalten. Könnte jedoch gehen, indem man die erste Ableitung abschätzt. |
_________________ Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
|
|
 |
knivil
Mitglied
Benutzerprofil
Anmeldungsdatum: 11.02.2009
Beiträge: 5861
|
knivil Mitglied
22:21:42 03.05.2012 Titel: |
|
Zitieren |
§F(E_{x_i}, E_{x_{i+1}}) - C = 0§ Damit reduziert es sich auf das Finden von Nullstellen, da §x_i§ bzw. §x_{start}§ vorgegen ist. Wenn F, wie du sagst, billig ist, kann der Wer von §E(x_{i+1})§ berechnet werden. Dann bleibt §0 = E(x) - E(x_{i+1})§ wieder als Nullstellenproblem uebrig. ... so als Anzatz. |
_________________ If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
Zuletzt bearbeitet von knivil am 22:27:02 03.05.2012, insgesamt 3-mal bearbeitet |
|
 |
SeppJ
Moderator
Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17956
|
SeppJ Moderator
23:22:30 03.05.2012 Titel: |
|
Zitieren |
| knivil schrieb: | | §F(E_{x_i}, E_{x_{i+1}}) - C = 0§ Damit reduziert es sich auf das Finden von Nullstellen, da §x_i§ bzw. §x_{start}§ vorgegen ist. Wenn F, wie du sagst, billig ist, kann der Wer von §E(x_{i+1})§ berechnet werden. Dann bleibt §0 = E(x) - E(x_{i+1})§ wieder als Nullstellenproblem uebrig. ... so als Anzatz. | Kapier ich gerade irgendwie nicht.
| Zitat: | | Wenn F, wie du sagst, billig ist, kann der Wer von §E(x_{i+1})§ berechnet werden. | Jain. Ein nötiger Wert kann berechnet werden. Es gibt aber mehrere Möglichkeiten dafür. Ich weiß aber nur, dass konstruktionsbedingt eine dieser Möglichkeiten auftreten wird. Aber nehmen wir mal an, ich kenne das nötige §E(x_{i+1})§, dann will ich ja wissen, was §x_{i+1}§ ist:
| Zitat: | | Dann bleibt §0 = E(x) - E(x_{i+1})§ wieder als Nullstellenproblem uebrig. | Ja. Aber das zu lösen ist doch gerade mein Problem, bloß umformuliert. |
_________________ Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
|
|
 |
Michael E.
Mitglied
Benutzerprofil
Anmeldungsdatum: 25.10.2003
Beiträge: 5712
|
Michael E. Mitglied
23:58:21 03.05.2012 Titel: |
|
Zitieren |
Seien §x_1 < x_2 < x_3§. Wenn man §F(E(x_1), E(x_2))§ und §F(E(x_1), E(x_3))§ hat, welche Aussagen kann man dann für §F(E(x_2), E(x_3))§ machen? |
_________________ Your password must be at least 18770 characters and cannot repeat any of your previous 30689 passwords. Please type a different password. Type a password that meets these requirements in both text boxes. (http://support.microsoft.com/kb/276304/en-us/)
Zuletzt bearbeitet von Michael E. am 23:59:48 03.05.2012, insgesamt 1-mal bearbeitet |
|
 |
knivil
Mitglied
Benutzerprofil
Anmeldungsdatum: 11.02.2009
Beiträge: 5861
|
knivil Mitglied
00:06:10 04.05.2012 Titel: |
|
Zitieren |
| SeppJ schrieb: | | Ja. Aber das zu lösen ist doch gerade mein Problem, bloß umformuliert. | Ja, aber es steht jetzt explizit als Nullstellenproblem da. Nunn kannst du beispielsweise Intervallschachtelung anwenden und parallelisierst diese. Normalerweise berechnest du den naechsten Punkt E(x') und entscheidest dann, ob mit E(x+dx) oder E(x-dx) fortgefahren wird. E(x'), E(x+dx) und E(x-dx) kannst du parallel berechnen. PS: Das ist ein sehr naiver Ansatz. |
_________________ If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
Zuletzt bearbeitet von knivil am 00:06:50 04.05.2012, insgesamt 1-mal bearbeitet |
|
 |
audacia
Mitglied
Benutzerprofil
Anmeldungsdatum: 05.02.2005
Beiträge: 4140
|
audacia Mitglied
02:17:48 04.05.2012 Titel: |
|
Zitieren |
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|