Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Mastermind

unregistriert

31

18.07.2011, 20:41

Ich bin jetzt nicht der Fachmann in Sachen dynamische Programmierung.
Bei Wikipedia steht:

Zitat

"Dynamische Programmierung kann dann erfolgreich eingesetzt werden, wenn das Optimierungsproblem aus vielen gleichartigen Teilproblemen besteht, und eine optimale Lösung des Problems sich aus optimalen Lösungen der Teilprobleme zusammensetzt"


Ist dies denn hier der Fall?

Ich denke nicht! Denn wenn ich z.B. die Karte in zwei Hälften teile und jede davon optimal aufteile, dann kann ich beim Zusammensetzen immer noch durch die Nahtstelle und den damit verbundenen Punktabzug suboptimal werden. Außerdem könnte es sein, dass ich bei einer der beiden Lösungen gezwungenermaßen eine der beiden Zivilisationen benachteilige. Das könnte ich in der anderen Hälfte wieder ausgleichen. Löse ich jedoch beide getrennt, weiß ich davon garnichts und kann das nicht berücksichtigen.

An den oben genannten O(n²)-Algorithmus glaube ich jedenfalls nicht.
Zumal da "n" die Anzahl der Zeilen sein soll - und die Anzahl der Spalten ist dann völlig irrelevant, was die Komplexität angeht?


Ich kenn ne ganze Menge Algorithmen die auf Dynamic Programming basieren, aber ist z.T. schon lange her. Tatsache ist dass DP nicht Divide&Conquer ist (dein Argument richtet sich gegen D&C) und das Otze O(n²*m) behaupten hat (dein Argument richtet sich gegen O(n²)). Davon abgesehen komm ich aber auch nicht drauf. Ich denk noch ein wenig drüber nach...

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

32

18.07.2011, 20:49

@Mastermind:

Ich beziehe mich auf diesen Artikel.

Laut Artikel ist DP anwendbar, wenn das Problem zwei Eigenschaften aufweist:
a) "Optimal substructure means that the solution to a given optimization problem can be obtained by the combination of optimal solutions to its subproblems."
b) "Overlapping subproblems" [...]

Ich bezweifle, dass das Problem die erste Eigenschaft ("Optimal substructure") hat, und wenn das stimmt, dann wäre DP nicht anwendbar, um ein globales Optimum zu finden.
Meine Argumentation dazu habe ich ja schon dargelegt.

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

33

18.07.2011, 20:59

Dürfen wir die Lösung für den Contest in eine Klasse packen und es wird vor Programm-Ausführung ein Objekt dieser Klasse instanziiert ?
Dein benötigtes Interface wäre dann eine statische Member-Funktion.

Du kannst auch einfach eine (lokale, von mir aus auch außerhalb der Funktion befindliche) Klasse definieren und davon dann eine Instanz innerhalb der "dividePlanet" erzeugen und damit machen, was Du willst.
Ich möchte globale Daten initialisieren, aber nicht innerhalb der Funktion.
Alternative ist: Man nimmt halt in Kauf, dass der 1. Durchlauf ggf. zu lange dauert.

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

34

18.07.2011, 21:03

Ich möchte globale Daten initialisieren, aber nicht innerhalb der Funktion.
Alternative ist: Man nimmt halt in Kauf, dass der 1. Durchlauf ggf. zu lange dauert.

Das ist laut Regeln nicht erlaubt. Du musst diese Initialisierungen jedes Mal neu machen.

Mastermind

unregistriert

35

18.07.2011, 21:34

Da ich es wirklich nicht hier zum laufen bringen mag könnte vielleicht jemand angeben, wie die Karten aussehen? Handelt es sich um ein zufälliges Bitmuster der Länge 512² oder gibt es (wie das Bespiel suggeriert) eine Struktur?

For what its worth, das Worst-Case Muster bezüglich der einen Bedingung ist ein Schachbrett, (ggf. 2*2) da man immer mindestens die Hälfte der Punkte falsch klassifiziert, dafür ist dy=0. Das Worst-Case Muster bezüglich der anderen Bedingung sind senkrechte durchgehende Streifen. Perfekte Klassifikation möglich aber dy in jedem schritt maximal.

Was noch relativ spannend ist, ist dass die Zielfunktion recht komisch gewichtet(wenn ich sie nicht falsch verstehe). Eine waagerechte Linie durch WorstCase 2 ergibt eine Punktzahl von 1/2 * 1/2 * 2/3 + 1/3 = 5/12. Die "perfekte" Klassifikation dagegen ergibt 2/3 + (1-(512*512)/2048 )*1/3 = -500/12

Man kann also relativ viel Fehlklassifikation in Kauf nehmen um eine glattere Grenze zu bekommen. Bin nun zu faul das Optimum in Bezug auf die genannte Karte zu bestimmen, die Information wo der "break even" liegt könnte jedoch hilfreich sein.

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

36

18.07.2011, 21:48

Die Karten sind planeten-artig. Schon zufällig, aber nicht so, dass ein Schachbrett dabei herauskommen könnte. Es ist schwer, irgendwelche Angaben über die Struktur zu machen. Es gibt große Kontinente, aber auch mittlere und kleinere Inseln. "Zum laufen bringen" musst Du übrigens garnichts, denn die Planetenkarten sind einfach nur PNG-Bilder.

Ich wäre otze dankbar, wenn er mir die von ihm errechnete opimale Lösung für eine beliebige Karte zukommen lässt (nur die Lösung, nicht den Algorithmus). Schaffen wir es dann, durch manuelles Verändern der Lösung noch etwas zu verbessern, dann war sie wohl nicht optimal. Solange otze das nicht tut, glaube (hoffe!) ich einfach mal, dass er einen Denkfehler gemacht hat.

37

18.07.2011, 23:48

Dürfen wir auch zusätzliche globale Funktionen, die sich an die selben Beschränkungen halten, definieren?

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

38

19.07.2011, 00:09

Dürfen wir auch zusätzliche globale Funktionen, die sich an die selben Beschränkungen halten, definieren?

Ist das denn unbedingt nötig? Definiere doch eine lokale struct innerhalb der Funktion mit einer (statischen) Methode. Dann ist alles schön in der Funktion verpackt.
Aber ja, von mir aus :rolleyes: Dann aber bitte in deinem Namespace.

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

39

19.07.2011, 17:11

Das Experimentier-Tool visualisiert nun die Ausgabe eures Algorithmus.
Dazu wird im C++-Programm der errechnete Grenzverlauf in eine .txt-Datei geschrieben, die so heißt wie das Planetenbild.

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

40

19.07.2011, 22:48

Jetzt müßte man nur noch mal Referenz-Werte für eine Karte veröffentlichen, ich fang mal an mit Planet000 und einem billigen Test-Algorithmus:


(Link)


Ergebnis ist übrigens 0.54849, falls jemand das Bild nicht sieht.

Werbeanzeige