|
| Moritz Klussmann Netspire GmbH & Co. KG |
Geschrieben am: Fr 5.05.2006, 13:37
|
![]() AyomRank 5 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 238 Mitglied seit: 6.10.2005 |
Hallo allerseits!
Folgendes Problem (so wie bei openBC zu sehen): User können sich miteinander "verbinden". Man kann auf einen User klicken und sehen, über welche andere Personen man mit diesem User verbunden ist. Dies möchte ich auch realisieren und zwar auf mehreren Ebenen. Momentan fällt mir da nur eine unelegante Lösung ala alle Verbindungen ausprobieren ein. Gibt es dafür evtl. einen eleganteren Lösungsweg? Gruß Moritz. -------------------- JurNW - Das Juristennetzwerk
Segel T-Shirts und Teamkleidung Xola - Regattakalender und Vorschoterbörse |
![]() |
| hatschi1810 |
#2 Geschrieben am: Fr 5.05.2006, 13:51 (+00:14)
|
![]() AyomRank 6 Gruppe: Experten Entwicklung (Mod) Beiträge: 638 Mitglied seit: 20.01.2004 |
Hört sich nach einem klassischen „traveling salesman“ Problem an, danach in Kombination mit "Graph" zu suchen sollte dir einige gute Methoden liefern.
|
![]() |
| Sascha Ahlers |
#3 Geschrieben am: Fr 5.05.2006, 18:58 (+05:06)
|
![]() AyomRank 8 Gruppe: Experten Entwicklung Beiträge: 1699 Mitglied seit: 27.12.2004 |
Hallo,
das Thema hatten wir bereits mal angeschnitten, vielleicht hilft es ja etwas auf die Sprünge, ob ein Algorithmus nun besonders gut ist, kann ich so nun nicht sagen, da ich es selber wohl noch nie realisiert habe. Es war aber mal ein kurzes Gedankenspiel von mir, wie man es vielleicht machen könnte. http://www.ayom.com/topic-10876.html MfG Sascha Ahlers -------------------- Joseph Joubert: "Der Verstand kann uns sagen, was wir unterlassen sollen. - Aber das Herz kann uns sagen, was wir tun müssen."
Sicherheit beim Programmieren: Top 10 application vulnerabilities in 2007 |
![]() |
| Moritz Klussmann Netspire GmbH & Co. KG |
#4 Geschrieben am: Mo 8.05.2006, 16:18 (+2d 21:20)
|
![]() AyomRank 5 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 238 Mitglied seit: 6.10.2005 |
Habe mir gestern Nacht zu diesem Thema noch ein paar Gedanken gemacht. Wenn ich davon ausgehe, dass das Projekt 10.000 User hat, die sich untereinander verlinken, denke ich nicht, dass es gut wäre jedes mal die Verbindung mit einen Algorithmus zu überprüfen. Das würde einfach zu lange dauern.
Andere Möglichkeit wäre, dass ich drei Tabellen anlege: Ebene1: User1, User2 Ebene2: User1, Link1, User2 Ebene3: User1, Link1, Link2, User3 Gehen wir davon aus, dass es keine Überschneidungen der Freundeskreise gibt (unrealistisch, aber nur zum Rechnen) und jeder User hat 20 Freunde, die wiederum 20 Freunde haben. Bei drei Ebenen gibt es pro User 20*20*20 = 8000 Datensätze * 10.000 User = 80.000.000 Datensätze. Nun, ich habe schon Projekte in MySQL durchgeführt, die bis zu drei Millionen Datensätze in einer Tabelle haben. Aber wie sieht es aus, wenn man von >100 Millionen ausgeht? Ist dann noch eine ausreichende Performance gegeben? Was haltet ihr von diesen Ansatz? -------------------- JurNW - Das Juristennetzwerk
Segel T-Shirts und Teamkleidung Xola - Regattakalender und Vorschoterbörse |
![]() |
| sd12 |
#5 Geschrieben am: Mo 8.05.2006, 16:25 (+00:06)
|
![]() AyomRank 9 Gruppe: Moderatoren Beiträge: 3581 Mitglied seit: 3.03.2004 |
Ich hab mal eine TV Doku gesehen, in der eklärt wird, wie der Navi Algo funktionerit. Im Prinzip suchst du einen solchen Algorythmus.
-------------------- ************************
Treiber f[r das Kezboard ist [berfl[ssig. |
![]() |
| Sascha Ahlers |
#6 Geschrieben am: Mo 8.05.2006, 16:27 (+00:02)
|
![]() AyomRank 8 Gruppe: Experten Entwicklung Beiträge: 1699 Mitglied seit: 27.12.2004 |
Das hört sich irgendwie nach einer Menge überflüssiger Daten an, wobei die Proformence durch die Größe der Tabelle bei schlechter Struktierung (, wenn eine solche Tabelle überhaupt gut strukturiert werden kann,) auch leidet.
MfG Sascha Ahlers -------------------- Joseph Joubert: "Der Verstand kann uns sagen, was wir unterlassen sollen. - Aber das Herz kann uns sagen, was wir tun müssen."
Sicherheit beim Programmieren: Top 10 application vulnerabilities in 2007 |
![]() |
| Moritz Klussmann Netspire GmbH & Co. KG |
#7 Geschrieben am: Mo 8.05.2006, 16:30 (+00:03)
|
![]() AyomRank 5 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 238 Mitglied seit: 6.10.2005 |
Meinst du mit Navi Algorithmus den für Navigationsinstrumente? Das wäre dann ja der Travelling Salesman, wenn ich mich nicht irre.
Aber mein Gedanke ist, dass es besser ist, die Verbindungen in einer "Ebene2" und "Ebene3" Tabelle abszuspeichern, als nur eine "Ebene1" Tabelle zu haben und diese dann immer mit einen Algorithmus auszugeben. Das Problem bei drei Ebenen Tabellen wäre halt die ungeheure Menge von Datensätzen.... @Sascha: Ja, das ist es natürlich. Aber evtl. trotzdem schneller als die Bearbeitung mit dem Travelling Salesman Algo? -------------------- JurNW - Das Juristennetzwerk
Segel T-Shirts und Teamkleidung Xola - Regattakalender und Vorschoterbörse |
![]() |
| Sascha Ahlers |
#8 Geschrieben am: Mo 8.05.2006, 16:46 (+00:16)
|
||
![]() AyomRank 8 Gruppe: Experten Entwicklung Beiträge: 1699 Mitglied seit: 27.12.2004 |
Kann es sein, dass das Travelling Salesman Algorithmus im Deutschen dem Ameisenalgorithmus [1] entspricht? Nach meinen ersten gefunden Informationen hat es auf jedenfall den Anschein. Ich würde aber mal behaupten, dass ich es nicht direkt nach diesen Algorithmus bzw. zumindestens in ziemlich abgeänderter Weise lösen würde, aber die Speicherung unmengen von Datensätzen würde mir auch ziemlich widerstreben. MfG Sascha Ahlers [1] Wikipedia: Ameisenalgorithmus -------------------- Joseph Joubert: "Der Verstand kann uns sagen, was wir unterlassen sollen. - Aber das Herz kann uns sagen, was wir tun müssen."
Sicherheit beim Programmieren: Top 10 application vulnerabilities in 2007 |
||
![]() |
| Moritz Klussmann Netspire GmbH & Co. KG |
#9 Geschrieben am: Mo 8.05.2006, 17:03 (+00:16)
|
||
![]() AyomRank 5 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 238 Mitglied seit: 6.10.2005 |
Ja, der Ameisenalgorithus ist ein Lösungsweg. Ich hatte mich falsch ausgedrückt: Es gibt das Travelling Salesman Problem (nicht Algorithmus), für das es halt mehrere Lösungswege gibt. Ich bin mir jetzt wirklich unsicher, wie ich vorgehen soll... Ich werde mir die Algorithmen noch einmal genauer angucken.... -------------------- JurNW - Das Juristennetzwerk
Segel T-Shirts und Teamkleidung Xola - Regattakalender und Vorschoterbörse |
||
![]() |
| hatschi1810 |
#10 Geschrieben am: Mo 8.05.2006, 18:35 (+01:31)
|
![]() AyomRank 6 Gruppe: Experten Entwicklung (Mod) Beiträge: 638 Mitglied seit: 20.01.2004 |
Das Problem selbst ist ja eigentlich nicht ein genaues Travelling Salesman Problem, da er ja nicht alle Punkte abgehen will, sondern „nur“ die kürzeste Verbindung zweier Punkte gesucht wird. (Dijkstra Algorithmus http://www.graph-magics.com/articles/shortest_path.php).
Mein Hinweis war eigentlich ungenau weil ich das Problem nicht genau genug angesehen hatte. Trotzdem ist es schon ein Klassiker in der Graphentheorie, das Problem ist wohl nicht mal so sehr das effizient abzuarbeiten. Das aber Datenbankfreundlich zu machen ist sicher nicht ganz so einfach. |
![]() |
| sd12 |
#11 Geschrieben am: Mo 8.05.2006, 21:46 (+03:11)
|
||
![]() AyomRank 9 Gruppe: Moderatoren Beiträge: 3581 Mitglied seit: 3.03.2004 |
genau, den meinte ich mit Navi.... -------------------- ************************
Treiber f[r das Kezboard ist [berfl[ssig. |
||
![]() |
| Alain_Aubert |
#12 Geschrieben am: Di 9.05.2006, 12:58 (+15:11)
|
|
Ayom Slave Gruppe: Admin Beiträge: 4823 Mitglied seit: 25.09.2003 |
Mein FF hat meine Antwort verschluckt, also nochmal eher kurz:
Dein Graph ist unzusammenhängen, ungerichtet und ungewichtet. Es handelt sich in der Tat nicht um TS, sondern um ein shortest path problem. Dijkstra (Ford-Bellmann etc.) bringen nichts, weil sie für gewichtete Kanten sind. Spannbäume kannst Du auch nicht machen, da der Graph nicht vollständig ist. Imho kannst Du iterieren und cachen, oder Du beschränkst Dich darauf die Distanz zw. Dir und dem andern Mitlgied anzuzeigen. Da kannst Du mittel dynamischer Rekursion einigermassen Performant einen zweiten Graph bauen (den Distanzgraph) indem Du die Distanz zwischen 2 Leuten solange berechnest, indem Du bei jedem Schritt prüfst ob es diese Distanz schon gibt. Ich bin an diesem Punkt der Meinung, dass es quasi unmöglich ist einen wirklich effektiven Algo zu bauen, solange der Graph unvollständig ist. Die Zerlegung in vollständige Graphen ist auch sinnlos. Mach Dir vor allem Überlegungen zum Datentyp. Manchmal ist es sehr viel schneller, wenn Du eine Adjazenten-Matrix generierst und damit rechnest, anstelle für jede Ebene eine Query an die DB zu sendne. |
![]() |
| Moritz Klussmann Netspire GmbH & Co. KG |
#13 Geschrieben am: Di 9.05.2006, 13:09 (+00:11)
|
||
![]() AyomRank 5 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 238 Mitglied seit: 6.10.2005 |
Leider weiß ich nicht, was eine Adjazenten-Matrix ist... -------------------- JurNW - Das Juristennetzwerk
Segel T-Shirts und Teamkleidung Xola - Regattakalender und Vorschoterbörse |
||
![]() |
| hatschi1810 |
#14 Geschrieben am: Di 9.05.2006, 13:48 (+00:39)
|
![]() AyomRank 6 Gruppe: Experten Entwicklung (Mod) Beiträge: 638 Mitglied seit: 20.01.2004 |
Eigentlich kann man bei einem ungewichteten Graphen immer vom Gewicht 1 ausgehen ;-)
Ich habe mal für einen Verkehrsverbund an einer Fahrplanabfrage gearbeitet. Da hat man sich letztlich dafür entschieden, dass man alle Varianten berechnet und abspeichert da es in diesem Fall nicht so oft zu Änderungen kam die eine neue Berechnung notwendig machten. Die Theorie läst sich mit den gefallenen Stichworten jetzt wohl wirklich leicht finden. |
![]() |
| Alain_Aubert |
#15 Geschrieben am: Di 9.05.2006, 23:00 (+09:11)
|
||
|
Ayom Slave Gruppe: Admin Beiträge: 4823 Mitglied seit: 25.09.2003 |
Eine A-Matrix in Deinem Fall musst Du Dir so vorstellen: Für jedes Mitglied i, dass mit dem Mitglied j verbunden ist, steht in der i-ten Zeile und der j-ten Spalte eine 1. Sonst 0. Für weitere Erklärungen, bitte googlen. Da Du sehr viele Nullen und sehr wenig 1en hast, ist Dein Graph nicht vollständig (d.h. nicht jedes Mitgl. kann von jedem Mitgl. aus erreicht werden). Deshalb wäre [sparse Matrix] für eine Implementation in Betracht zu ziehen. Wenn ich richtig davon ausgehe, dass Dein Graph ungerichtet ist (wenn ich mich mit Dir verbinde, bist auch automatisch Du mit mir verbunden), dann kannst Du Dich auf eine obere (untere) Dreiecksmatrix beschränken.
;-) Genau das macht den Dijkstra unnütz, weil er sich den kürzesten Weg am gesammten Gewicht des bisherigen Weges sucht. Das ist aber ein obsoleter Informationsvorsprung wenn alle Kanten dasselbe Gewicht haben und der schöne Algo wird naiv zur Breiten- bzw. Tiefensuche, weil wir alle Äste ablaufen müssen. A propos Dijkstra, sehr schöne Erklärung [manderby dijkstra] von ehm. zürcher Stud. D.h. wir rechnen am Ende doch alles durch und cachen... Ich empfehle wirklich @Moritz, dass Du Dich darauf beschränkst die Distanz zu berechnen. Methoden mittels Herauschlösung von Kanten findest Du [kürzester weg ungewichtet graph]. Aber das ist nicht ganz einfach und Du müsstest Sonderbehandlungen einführen, weil Dein Graph nicht zusammenhängt. Allgemeine Algos um [Spannbäume] (auch [minimaler Spannbaum]) zu berechnen (wahrscheinlich würde ich es so probieren?) sind [Algorithmus von Kruskal] und [Algorithmus von prim]. Dabei ist der Krux aber, dass Dein Graph noch immer nicht gewichtet ist. Wg. des nicht-zusammenhängen musst Du hier wieder schauen, dass Du schnell genug abbrichst, wenn der Erfolg ausbleibt. Was Sascha im gelinkten Post gepostet hat kann dabei nützlich sein. [bidirectional search] D.h. mir fällt ganz ernsthaft kein Musterbuch Algorithmus ein, der Dein Problem löst. Es wäre möglich die Anzahl der Kontakte eines Mitgliedes als Kantengewicht zu benutzen, da darin naiv die Whk beschrieben ist, dass ein gesuchtes Mitglied vorkommt. Das hat den unübersehbaren Nachteil, dass dort entsprechend viele weitere Varianten zur nächsten Iteration fällig werden. Wie sieht denn Dein Datentyp aus? Alternativ könntest Du - ähnlich wie Google mit Blockrank - versuchen die Mitliedern in Kästchen (also in Untergruppen) einzuteilen, weil Du mit dieser Info den kürzesten Weg schneller berechnen könntest. Das hätte den Vorteil, dass man schnell nach Connectivität zw den beiden Kästchen suchen kann in denen die beiden Mitgliedern sind. Allerdings rate ich davon ab. Hm, ich weiss wirklich nicht recht. Ich würde mich darauf beschränken die nächsten 6 Ebenen pro Mitglied zu holen (max 12. min 1 queries) und diese zu schneiden. Implementier das mal, das sollte sehr einfach sein, und dann implementierst Du Caching. Evtl. gibt es rein mathematische Lösungen....? PS: Alles in [] bezeichnet eine Suchabfrage, d.h. Texte in eckigen Klammern sind an Google zu füttern. (Das könnte man grad in den bb Code implementieren...) |
||
![]() |
1 Monat später...
| mrblond |
#16 Geschrieben am: So 11.06.2006, 08:56 (+1m )
|
|
AyomRank 1 ![]() ![]() Gruppe: Member (inaktiv) Beiträge: 1 Mitglied seit: 2.06.2006 |
Hallo,
@Moritz: Hast Du mittlerweile eine Lösung für das Problem gefunden? Ich sitze im Moment am gleichen Projekt, sprich will die kürzesten Wege zwischen Communitymitgliedern anzeigen lassen. Das imho größte Problem besteht hierbei darin, daß es ständig Änderungen gibt, ich also oft (am besten in Echtzeit) Updates in der Datenbasis berücksichtigen muß. Wäre da eine Adjazentenmatrix eine elegante Lösung? Sprich wie lange würde es dauern, diese aus der Datenbanktabelle zu generieren? Sollte ja eigentlich überschaubar sein (ich rechne für mein Projekt ebenfalls mit 10.000 Mitgliedern mit jeweils im Schnitt 20 Kontakten). Als Suchalgorithmus erscheint mir eine iterative Tiefensuche (Branch-and-Bound) derzeit am besten. Was meint Ihr? Weiß jemand zufällig, auf welche Weise das bei OpenBC realisiert wurde? Viele Grüße... |
![]() |
1 Monat später...
| wifi |
#17 Geschrieben am: So 23.07.2006, 11:03 (+1m )
|
||
|
AyomRank 1 ![]() ![]() Gruppe: Member (inaktiv) Beiträge: 4 Mitglied seit: 23.07.2006 |
möchte sowas auch realisieren (~10.000 member geplant) mein bisheriger pseudocode-ansatz:
-> wie kann ich das optimieren/wie lese ich da die zwischenkontakte aus? |
||
![]() |
| pangu |
#18 Geschrieben am: Di 25.07.2006, 22:13 (+2d 11:10)
|
![]() AyomRank 6 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 836 Mitglied seit: 29.07.2005 |
http://de.wikipedia.org/wiki/Algorithmus_v...yd_und_Warshall scheint auch ganz hilfreich, blicke da aber noch nicht ganz durch..
-------------------- Jonglieren lernen ♥nette Community rund ums Jonglieren °°°
|
![]() |
| Joel Enzian Media GmbH |
#19 Geschrieben am: Mi 26.07.2006, 07:47 (+09:33)
|
![]() AyomRank 7 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 1441 Mitglied seit: 17.06.2004 |
Es gibt übrigens auch ein Visualisierungswerkzeug in Java für Beziehungen:
http://www.jibble.org/piespy/ http://www.jibble.org/shakespeare/ -------------------- EagleFind.com - Die visuelle Suchmaschine
Enzian Media bietet Entwicklung von Websites, Videos und Webcam-Streaming. Suxedoo- Werbekampagne im Wert von 5000.- jetzt Gewinnen! Nur für im Handelsregister eingetragene Frimen! |
![]() |
| pangu |
#20 Geschrieben am: Mi 26.07.2006, 15:28 (+07:41)
|
![]() AyomRank 6 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 836 Mitglied seit: 29.07.2005 |
um die hirachie des graphen zu gewähleisten, muss ich jede freundschaft auch doppelt in der datenbank anlegen,oder?
also: id | user | freund 1 | testperson_a | testperson_b 2 | testperson_b | testperson_a -------------------- Jonglieren lernen ♥nette Community rund ums Jonglieren °°°
|
![]() |
Thema wird von 0 Benutzer(n) gelesen (0 Gäste und 0 anonyme Benutzer)
0 Mitglieder:
Trackback-Url: http://www.ayom.com/track/t/11914
Seiten: (2) [1] 2 |
![]() ![]() ![]() |
| Themen Titel | Autor | Views | Antworten | Letzte Aktion |
| google-Algorithmus: Listung bei kleinen Serps | jAuer | 121 | 2 | Sa 22.11.2008, 23:49 |
| Algorithmus des kuerzesten Weges | Sancheck | 275 | 8 | Mi 23.07.2008, 12:36 |
| Preisvergleich-Algorithmus in PHP | slayter | 187 | 0 | Sa 26.01.2008, 16:50 |
| Google interessiert sich für den Social Graph | Lucas Wyrsch | 673 | 3 | Sa 10.11.2007, 16:40 |
| Google Pagerank-Algorithmus | - Matthias - | 389 | 2 | Fr 3.08.2007, 14:02 |
| Effektiver Schutz vor Multiaccounts | cd_brenner | 445 | 9 | Mi 6.09.2006, 20:55 |
| Adsense - Effektiver CPM | ! Wasi.li ! | 1182 | 4 | Do 8.07.2004, 23:01 |
| Veränderter Google Algorithmus und PR-Update | Remo Uherek | 2804 | 6 | So 7.12.2003, 17:03 |
Anzeige - [Hier werben / Mediadaten]






















