Sie sind nicht angemeldet.

  • Anmelden

1

28.05.2010, 11:52

Problem algorithmische Geometrie

Hallo,
ich habe zwar wenig Hoffnung, aber da hier ja doch ein paar schlaue Köpfe mit Ahnung von Mathematik/Informatik vertreten sind, probie ich es einfach mal. Und zwar geht es um folgende Aufgabe:

Ich habe als Eingabe r Rechtecke, deren Kanten stets parallel zur x- und y-Achse sind, also Eingabe ist sowas wie:

xmin1, xmax1, ymin1, ymax1
xmin2, xmax2, ymin2, ymax2
[...]

Nun überschneiden sich diese Rechtecke beliebig und ich möchte daraus eben disjunkte Polygone machen, d.h. die Eingabe in eine Reihe von Polygonzügen umwandeln, sodass die Polygone daraus eben paarweise disjunkt sind. Und das soll mit einer möglichst guten Laufzeit passieren, wobei ich glaube, dass es immer Eingaben gibt, wo die Laufzeit quadratisch in r wird (lasse mich da aber gern eines Besseren belehren).

Wenn jemand irgendeinen Hinweis hat, wäre es sehr cool. Muss keine genaue Erklärung sein, aber ein Stichwort zum Nachschauen oder evtl. eine bessere Adresse zum Nachfragen wären schon super. Meine eigenen Gedanken bringen mich nämlich nicht zum Ziel und die Internetsuche brachte bis jetzt auch keine verwertbaren Resultate.

Edit: Im Endeffekt muss ich den ganzen Spaß dann in C programmieren, aber wenn ich weiß, wie ich das algorithmisch machen muss, kriege ich das bestimmt schon irgendwie hin.

MfG plizzz

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »plizzz« (28.05.2010, 11:53)


2

28.05.2010, 12:29

Zitat

wobei ich glaube, dass es immer Eingaben gibt, wo die Laufzeit quadratisch in r wird (lasse mich da aber gern eines Besseren belehren).


Es lassen sich einfach Eingaben konstruieren bei denen die Anzahl der Polygone quadratisch mit r wächst, dh besser als O(r^2) gehts definitiv nicht.

Ist das eine Uni Übung?

3

28.05.2010, 12:32

In welchen Rechenoperationen misst du deine Geschwindigkeit?

Wenn die Rechtecke wie folgend aussehen, wobei ein Tupel immer für ein Rechteck der Form (xmin, xmax, ymin, ymax) steht:

k. Rechteck (k, k+0.5, 0, 1)

Dann sind alle Rechtecke disjunkt, jedes Rechteck ist sein eigener Polygonzug und du bekommst pro neues Rechteck einen Polygonzug der Länge 4 hinzu.

Wenn die Rechtecke sich maximal überschneiden sollen, dann überschneidet das k. Rechteck 4*(k-1) Kanten. Insgesamt hast du also 4*\Sum_{0}^{n-1} (k-1) = 2*n*(n-1) = 2n^2 - 2n Schnittpunkte, d.h. diese Anzahl wächst quadratisch.

Du kannst sich überschneidende Rechtecke doch immer durch einzelne Rechtecke darstellen, d.h. du bleibst bei maximal linearer Laufzeit in r, so wie ich es verstanden habe. Oder musst du gerade Strecken mit Schnittpunkten darauf einzeln darstellen? Dann bist du quadratisch in r.

Was ist denn das Ziel, möglichst wenig lange Polygionzüge? Was verursacht denn die Geschwindigkeitseinbuße?
Ohne diese Angaben ist das Problem imho unvollständig gestellt.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »AtroX_Worf« (28.05.2010, 12:35)


4

28.05.2010, 12:47

Versteh deinen Einwand nicht Worf.

Aus den r gegebenen Rechtecken ergeben sich x eindeutig definierte disjunkte Polygone. Er soll diese Polygone identifizieren und für jedes davon den entsprechende Polygonzug ausgeben. (Ich sehe da eigentlich keinerlei Spielraum?)

5

28.05.2010, 12:59

Ich hatte "disjunkt" überlesen bzw. anders verstanden. ?(
Es geht nicht nur darum, dass die definierenden Eckpunkte des Polygons unterschiedlich sind, sondern die Verbindungsstrecken gehören auch dazu, d.h. disjunkte Polygone dürfen sich auch nirgendwo überschneiden?

Wie bekommt man dann aber geschlossene Bilder von Rechtecken hin?

6

28.05.2010, 13:05

Ich versteh es so:
Die disjunkten Polygone (die Flächen sind gemeint!) an sich sind ja eindeutig. Zu jeder Fläche gibst du einen zugehörigen Polygonzug aus.

eg Eingabe:
0,0.5,0,1
1,1.5,0,1

ergibt:
1: (0,0),(0.5,0),(0.5,1),(0,1),(0,0)
2: (1,0),(1.5,0),(1.5,1),(1,1),(1,0)

Der einzige Spielraum dabei sind Reihenfolge der Polygone bzw Startpunkte und "Richtung" der Polygonzüge?

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »plexiq« (28.05.2010, 13:09)


7

28.05.2010, 13:11

Und wie sieht es bei

(0,2,0,2)
(1,3,1,3)

aus?
Wie bekomme ich da speziell disjunkte Polygone hin?

€dit: Es reicht auch folgendes zu betrachten, ist einfacher:

(0,2,0,1)
(1,2,0,1)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »AtroX_Worf« (28.05.2010, 13:14)


8

28.05.2010, 13:18

Für:
(0,2,0,1)
(1,2,0,1)

Ergeben sich ebenfalls genau 2 Flächen?
1: (0,0),(1,0),(1,1),(0,1),(0,0)
2: (1,0),(2,0),(2,1),(1,1), (1,0)

Wenn du den Satz der Aufgabenstellung änderst is es evtl intuitiver für dich?

Zitat

Nun überschneiden sich diese Rechtecke beliebig und ich möchte daraus eben disjunkte Polygonflächen machen, d.h. die Eingabe in eine Reihe von Polygonzügen umwandeln, sodass die Polygonflächen daraus eben paarweise disjunkt sind.

Das ist zumindest wie ich die Aufgabenstellung verstehe.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »plexiq« (28.05.2010, 13:28)


9

28.05.2010, 14:21

Zitat

Original von plexiq
Für:
(0,2,0,1)
(1,2,0,1)

Ergeben sich ebenfalls genau 2 Flächen?
1: (0,0),(1,0),(1,1),(0,1),(0,0)
2: (1,0),(2,0),(2,1),(1,1), (1,0)

Aber die beiden Rechtecke haben jetzt doch die Kante (1,0),(1,1) gemeinsam, sind also speziell nicht disjunkt.

10

28.05.2010, 14:29

das stimmt! :P

13

28.05.2010, 14:35

Das Problem ist, dass das Rechteck (1,2,0,1) zusammenhängend ist, d.h.
es kann nicht in 2 disjunkte, nichtleere abgeschlossene Mengen aufgespalten werden.

vgl. Def. (3) zusammenhängend

14

28.05.2010, 14:37

Ok, da habe ich etwas geschlampt. In der Tat muss nur das Innere der Rechtecke disjunkt sein, außerdem gibt es keine 1-dimensionsalen Rechtecke (d.h. Liniensegmente).

Das ist ein Teil eines Programmierprojektes (als Veranstaltung an der Uni), bei dem es darum geht, zu einer gegebenen Menge polygonaler Hindernisse, die hier durch die nicht disjunkten Rechtecke dargestellt wird, kürzeste Wege zwischen Punkten zu finden, wobei diese Wege die Hindernisse nicht schneiden dürfen. Sie dürfen aber auf dem Rand eines Hindernisses entlanglaufen.

Wenn ich erstmal die Rechtecke zu Polygonzügen umgewandelt bekäme, wüsste ich grob, wie das zu machen ist. Aber mit der Rechteckeingabe kann ich einfach nichts anfangen. Deshalb versuche ich sie eben umzuwandeln.

Edit:

Zitat

Es lassen sich einfach Eingaben konstruieren bei denen die Anzahl der Polygone quadratisch mit r wächst, dh besser als O(r^2) gehts definitiv nicht.


Das verstehe ich nicht. Die Anzahl der Polygone kann doch nicht größer werden als die Anzahl der Rechtecke. Ich dachte eher, dass es nicht geht, weil sich immer Instanzen mit O(r^2) vielen Rechteckschnittpunkten konstruieren lassen, die man dann braucht, um die Polygone zu bestimmen.

Außerdem habe ich nochmal zum besseren Verständnis ein Beispiel angehängt:

Eingabe:

-6 5 16 18
-6 6 10 12
3 5 10 18
7 9 8 22
-3 13 6 7
11 13 6 14
11 13 14 22
11 19 16 18
6 7 2 7

Bild:http://img690.imageshack.us/img690/1065/inst2m.png

Die schwarzen Linien signalisieren dabei die Rechteckangaben und die blauen Polygone möchte ich halt als Polygonzüge. Die Kreuze sind Anfang und Ziel (habe ich aus der Eingabe rausgenommen).

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »plizzz« (28.05.2010, 14:47)


15

28.05.2010, 14:42

Zitat

Original von plizzz
Ok, da habe ich etwas geschlampt. In der Tat muss nur das Innere der Rechtecke disjunkt sein, außerdem gibt es keine 1-dimensionsalen Rechtecke (d.h. Liniensegmente).

Bei plexiq's Aufspaltung gibt es nur 2-dim Rechtecke, welche allerdings eien Kante gemeinsam haben.

Disjunkt sein ist eine Eigenschaft von 2 Mengen, etwas alleine kann nicht disjunkt sein. Was meinst du also genau?

Zitat

Original von plizzz
Das ist ein Teil eines Programmierprojektes (als Veranstaltung an der Uni), bei dem es darum geht, zu einer gegebenen Menge polygonaler Hindernisse, die hier durch die nicht disjunkten Rechtecke dargestellt wird, kürzeste Wege zwischen Punkten zu finden, wobei diese Wege die Hindernisse nicht schneiden dürfen. Sie dürfen aber auf dem Rand eines Hindernisses entlanglaufen.

Kannst du das genauer erläutern?

€dit: Definiere einfach mal genau, was du mit "2 Polygonzüge müssen disjunkt sein" meinst. Du solltest dafür besser nicht das Wort "disjunkt" benutzen, weil es i.A. schon eine feste Bedeutung hat. Denk dir ein anderes Wort aus, bspw. getrennt, überschneidungsfrei, hübsch etc.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »AtroX_Worf« (28.05.2010, 14:45)


16

28.05.2010, 14:54

Ich habe doch nicht geschrieben, dass die Polygonzüge disjunkt sind. Ich habe geschrieben, dass die Polygone disjunkt sind.

Aber gut: Ich habe eine Menge von Rechtecken im R^2 gegeben. Jedes Rechteck spaltet den R^2 in zwei Teile. Nun nehme ich den inneren Teil jedes Rechtecks (also die innere Fläche / Punktmenge; ohne Rand), also den Teil, der (-infty,infty) nicht enthält. Diese Menge vereinige ich und erhalte eine Punktmenge M in R^2. Allerdings sind die Rechtecke so gegeben, dass die Inneren Flächen der Rechtecke nicht notwendigerweise disjunkt sind.

Ich suche nun eine Menge von Polygonzügen, die folgendes erfüllt: Jeder Polygonzug spaltet den R^2 wieder in zwei Teile. Nehme ich von jedem Polygonzug das Innere, so sind diese Flächen (Punktmengen im R^2) paarweise disjunkt. Die Vereinigung dieser Mengen ergibt M.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »plizzz« (28.05.2010, 14:56)


17

28.05.2010, 15:05

Zitat

Original von plizzz
Ich habe doch nicht geschrieben, dass die Polygonzüge disjunkt sind. Ich habe geschrieben, dass die Polygone disjunkt sind.

Ich habe ja in meinen letzten Postings gezeigt, dass dies bei Polygonen nicht möglich ist. Deswegen sollst du ja sagen, wie du es bei Polygonzügen definierst, dass es da möglich wird.

Zitat

Original von plizzz
Aber gut: Ich habe eine Menge von Rechtecken im R^2 gegeben. Jedes Rechteck spaltet den R^2 in zwei Teile.

Den zweiten Satz verstehe ich nicht ganz. Du meinst, dass du immer den R^2\Rechteck und das Rechteck hast?!

Zitat

Original von plizzz
Nun nehme ich den inneren Teil jedes Rechtecks (ohne Rand), also den Teil, der (-infty,infty) nicht enthält. Diese Menge vereinige ich und erhalte eine Punktmenge M in R^2. Allerdings sind die Rechtecke so gegeben, dass die Inneren Flächen der Rechtecke nicht notwendigerweise disjunkt sind.

Du betrachtest also einfach das Innere der Vereinigung aller Rechtecke, ok.

Zitat

Original von plizzz
Ich suche nun eine Menge von Polygonzügen, die folgendes erfüllt: Jeder Polygonzug spaltet den R^2 wieder in zwei Teile. Nehme ich von jedem Polygonzug das Innere, so sind diese Flächen (Punktmengen im R^2) paarweise disjunkt. Die Vereinigung dieser Mengen ergibt M.

Mit Spalten meinst du, dass die Polygonzüge ein nichtleeres inneres umschließen? Du hast also ganz einfach einen geschlossenen, nicht-entarteten Polygonzug.

Die Vereinigung der offenen Mengen, welche im inneren der geschlossenen Polygonzüge sind, ergibt natürlich nicht deine Menge M, siehe Def. (2) für zusammenhängend.

Ein trivialer Polygonzug wäre der Rand der Menge M, d.h. du schmeißt alle inneren Kanten weg. Dies ist aber wohl nicht Sinn der Übung, also solltest du deine Aufgabenstellung noch weiter präzisieren. Du musst die Polygonzüge ja irgendwie mit den Rechteckskanten in Verbindung bringen.

Das ganze erinnert an ein Graphentheorieproblem. Aber dafür musst du genauer beschreiben, was du willst, damit man Analogien sehen kann. Den aufspannenden Baum suchen ist es nicht, auch nicht die Knotenmenge in disjunkte Teilmengen zerlegen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »AtroX_Worf« (28.05.2010, 15:07)


18

28.05.2010, 15:56

Bin oben davon ausgegangen dass 2 Flächen disjunkt sind gdw die "gemeinsame" Fläche 0 ist? (Sorry falls das eine falsche Definition ist...)

19

28.05.2010, 15:58

Zitat

Original von plexiq
Bin oben davon ausgegangen dass 2 Flächen disjunkt sind gdw die "gemeinsame" Fläche 0 ist? (Sorry falls das eine falsche Definition ist...)

2 Mengen sind disjunkt, wenn sie keine gemeinsamen Punkte haben, nur Fläche reicht also nicht. Es wäre aber die bessere Definition für dieses Problem.

20

28.05.2010, 16:02

Die Aufgabenstellung, wie ich sie geschrieben habe, ist an manchen Stellen wirklich mathematisch nicht 100%ig korrekt. Dennoch kann man sie denke ich verstehen, wenn man sich einen Millimeter aus dem Käfig der Definitionen herauswagt und etwas selbst nachdenkt, anstatt die kursiv gedruckten Sätze aus 1000-seitigen Mathebüchern abzuspulen.

21

28.05.2010, 16:16

Zitat

Original von plizzz
Die Aufgabenstellung, wie ich sie geschrieben habe, ist an manchen Stellen wirklich mathematisch nicht 100%ig korrekt. Dennoch kann man sie denke ich verstehen, wenn man sich einen Millimeter aus dem Käfig der Definitionen herauswagt und etwas selbst nachdenkt, anstatt die kursiv gedruckten Sätze aus 1000-seitigen Mathebüchern abzuspulen.

Aber ein sinnvolles formulieren der Aufgabenstellung zeigt, dass man den Sinn verstanden hat. Erst so kann man die mächtigeren Geschützte der Mathematik benutzen, um das Problem auch zu lösen.

Aber gut, ich bin raus hier.

22

28.05.2010, 16:17

Zitat

Original von plizzz

Zitat

Es lassen sich einfach Eingaben konstruieren bei denen die Anzahl der Polygone quadratisch mit r wächst, dh besser als O(r^2) gehts definitiv nicht.


Das verstehe ich nicht. Die Anzahl der Polygone kann doch nicht größer werden als die Anzahl der Rechtecke. Ich dachte eher, dass es nicht geht, weil sich immer Instanzen mit O(r^2) vielen Rechteckschnittpunkten konstruieren lassen, die man dann braucht, um die Polygone zu bestimmen.


Ich geh mal davon aus dass die Aufgabe so gemeint war wie ich sie anfangs interpretiert hab. (ie überschneidungsfrei statt disjunkt?)

Nimm zB die Eingabesqeuenz:
-(0.5^r), 0.5^r, -(2^r), 2^r

Das r'te element bildet 4(r-1) neue Polygone (alles Rechtecke, in diesem bsp). Die Anzahl der Polygone wächst also quadratisch mit r, somit brauchst du in jedem Fall zumindest O(r^2).

Edit: Ohhh, eine andere Art die Angabe zu interpretieren wäre, dass du nur jeweils die Aussenkanten der Rechteck-Vereinigungen als Polygonzüge darstellen willst. Scheint angesichts deiner letzten Kommentare wahrscheinlicher. Du solltest die Angabe wirklich genauer formulieren, bzw ein paar Beispiele posten.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »plexiq« (28.05.2010, 16:25)


23

28.05.2010, 16:40

Ok, denk ich versteh nun wie die aufgabe gemeint ist. (Siehe edit ^)

Zitat

Original von plizzz
Ich dachte eher, dass es nicht geht, weil sich immer Instanzen mit O(r^2) vielen Rechteckschnittpunkten konstruieren lassen, die man dann braucht, um die Polygone zu bestimmen.


Musst du wirklich alle Schnittpunkte berechnen um die Polygone zu bestimmen? Rein intuitiv würd ich nein sagen.

24

28.05.2010, 16:46

Ok, ehrlich gesagt habe ich es als Klugscheißerei aufgefasst, aber dann war es wohl scheinbar doch schlecht formuliert - sorry dafür, mein Fehler. Manchmal ist der Blick da etwas verstellt, wenn man länger an einer Sache gesessen hat.

Ich versuche es nochmal:
Ich habe wie oben beschrieben eine bestimmte Anzahl Rechtecke mit Eckkoordinaten gegeben. Man kann jetzt für jedes Rechteck die innere Fläche nehmen. Die Eingabe ist nun aber so, dass diese Flächen nicht notwendigerweise disjunkt sind (s. unten Notation). Jetzt vereinige ich diese Fläche und erhalte mehrere Flächen, sodass der Rand jeder einzelnen Fläche ein geschlossener Polygonzug (also eine Abfolge der Außenkanten) ist. Abgesehen vom Startpunkt sind diese Polygonzüge also eindeutig festgelegt. Wenn ich nun von jedem dieser Polygonzüge die innere Fläche nehme, so sind diese Flächen disjunkt - das meinte ich mit disjunkten Polygonen.


Notation:
Bei obiger Benutzung sind Flächen Punktmengen im R^2. In diesem Fall ist das Innere der Rechtecke/Polygone stets eine offene Menge. Wenn zwei Flächen disjunkt sind, heißt es demnach, dass die jeweiligen Punktmengen im R^2 disjunkt sind.

25

28.05.2010, 16:53

Zitat

Original von plexiq
Ok, denk ich versteh nun wie die aufgabe gemeint ist. (Siehe edit ^)

Zitat

Original von plizzz
Ich dachte eher, dass es nicht geht, weil sich immer Instanzen mit O(r^2) vielen Rechteckschnittpunkten konstruieren lassen, die man dann braucht, um die Polygone zu bestimmen.


Musst du wirklich alle Schnittpunkte berechnen um die Polygone zu bestimmen? Rein intuitiv würd ich nein sagen.



Das weiß ich eben nicht. Es war bloß eine Vermutung.
Ich wurde da eben etwas ins kalte Wasser geworfen und inhaltliche Hilfestellung gibt es auch nicht, daher muss ich irgendwie zurechtkommen. Ich habe mir Algorithmen angeeignet, die folgendes machen:

a) für eine Menge von horizontalen und vertikalen Segmenten, die stets parallel zur x- oder y-Achse verlaufen, die Schnittpunkte finden
b) für eine Menge von Rechtecken und Punkte die Inklusionen ausgeben (Punkt p liegt in Rechteck R)
c) für eine Menge von Rechtecken die Paare von sich schneidenden Rechtecken inklusive Schnittpunkten ausgeben

Aber ich weiß nun nicht mal, ob das die richtigen Werkzeuge sind und wenn, dann weiß ich nicht, wie ich sie anwenden soll, um daraus das Ergebnis zu erhalten.

26

28.05.2010, 17:14

Naja, ein intuitiver Lösungsansatz:

Du startest mit einer leeren Menge m an Polygonen.

Für jedes Rechteck r_i der eingabe:
1) Bestimme wieviele Polygone in m das r_i schneidet/berührt
2) Falls r_i kein Polygon schneidet, füge r_i als neues Polygon in m ein. Andernfalls entferne alle schneidenden polygone aus m, und füge die Vereinigung dieser polygone+ri hinzu

Brauchst aber jedenfalls sehr tricky Datenstrukturen wenn das besser als O(r^2) laufen soll, kA obs überhaupt geht.

27

29.05.2010, 14:41

Ok, also ich habe das Problem in diesem http://books.google.de/books?id=uXKyuK0j…epage&q&f=false Buch auf S.270 unter "Konturproblem" gefunden. Scheint allerdings eine recht eigene Bezeichnung zu sein, denn sonst kann man dazu fast nichts ergooglen. Ist aber wohl auf jeden Fall in O(r*log(r) + p) lösbar, wobei p die Anzahl der Segmente der Polygonzüge ist.

Das nur so als Information, falls es jemanden interessiert.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »plizzz« (29.05.2010, 14:42)


28

29.05.2010, 14:45

müsst ihr uns alle so deprimieren, könnt ihr das nicht irgendwo in einem scheiss klugeköpfeforum diskutieren!!!

29

29.05.2010, 15:16

Wenn ich mal verstehen würde, wie das mit den Polygonzügen laufen soll (mach halt ein paar einfache Beispiele), dann könnte ich auch bei den Datenstrukturen helfen.

O(r log r) ist jetzt nicht sonderlich überraschend.
Nur was misst man eigentlich bei der Laufzeit? Einfache Operationen, die Längen der Polygonezüge, die Anzahl der Polygonzüge? Ich habs immer noch nicht verstanden.

30

29.05.2010, 15:41

Was er braucht is folgendes:
Du vereinigst zuerst alle nicht-disjunkten Rechtecke, und gibst dann für jede dabei entstehende Polygonfläche einen entsprechenden Polygonzug aus.

Für:
(0,2,0,1)
(1,2,0,1)

Ergibt sich nur 1 Polygon:
1: (0,0),(2,0),(2,1),(0,1),(0,0)

Für:
(0,2,0,2)
(1,3,1,3)

Ergibt sich ebenfalls nur 1 Polygon:
1: (0,0),(2,0),(2,1),(3,1),(3,3),(1,3),(1,2),(0,2),(0,0)


Die Komplexität wird bzgl einfacher Operationen gerechnet.

Wenn man das Problem nach meinem Ansatz oben lösen möchte, mit laufzeit besser O(r^2) bedeutet das u.a.:
Wir müssen in schneller als O(|m|) berechnen können welche Polygone in m das neue Rechteck schneiden. (ie, wir können nicht einfach mit jedem Polygon in m testen,...)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »plexiq« (29.05.2010, 15:59)