Ergebnis 1 bis 10 von 10

Thema: Frage: CulturalDecay.py

  1. #1
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209

    Frage: CulturalDecay.py

    Als ausgewiesener Python-Fachmann falle ich schon in den ersten Zeilen ratlos auf die Nase

    class CulturalDecay:
    def __init__(self):
    self.Distance = [[0] * 11 for i in range(11)]
    for iX in range(11):
    for iY in range(11):
    if iX in [0, 1] and iY in [0, 1]:
    self.Distance[iX][iY] = 1
    else:
    self.Distance[iX][iY] = int((iX**2 + iY**2)**0.5 + (0.5**2 + 0.5**2)**0.5)

    self.Distance = [[0] * 11 for i in range(11)]
    verblüfft mich. Das erste Element der Liste wird mit 11 multipliziert? Das müsste aber doch immer i=0 sein, oder nicht? Mithin wäre der Initialwert für self.Distance = 0?

    self.Distance[iX][iY] = int((iX**2 + iY**2)**0.5 + (0.5**2 + 0.5**2)**0.5)
    damit komme ich überhaupt nicht mehr klar.
    (iX**2 + iY**2)**0.5
    müsste Wurzel(ix²+ix²) liefern?
    Da für i(x,y)= 0;1 fest der Wert 1 gesetzt wird, müssen wir nun einfach für den nächsten Wert prüfen, und stellen fest, daß der Ausdruck Wurzel(2²+2²) liefert. Das ist Wurzel(8) == 2,828427125

    (0.5**2 + 0.5**2)**0.5
    müsste doch eigentlich immer den konstanten Wert (0,25 + 0,25)**0,5 liefern, also Wurzel aus 0,5 == 0,707106781
    Damit kann das doch als konstanter Ausdruck definiert werden, ohne daß das Programm drei Exponentialfunktionen durchlaufen muß?

    Wenn man sich beide Teilausdrücke im Zusammenhang ansieht, stellt man fest, daß für iX und iY > 1 der kleinste Wert des Gesamtausdrucks
    int(2,828427125 + 0,707106781) == 3 ergibt.

    Wir haben also für einen Sprung von 1 auf 3 zwischen i=1 und i=2.
    self.Distance[iX][iY] müsste dann self.Distance[3][3] sein?

    ja, ich gebe zu, ich bin eine Wurst....


  2. #2
    SDK-Gott Avatar von MatzeHH
    Registriert seit
    31.10.05
    Beiträge
    759
    Zitat Zitat von Commander Bello
    self.Distance = [[0] * 11 for i in range(11)]
    verblüfft mich. Das erste Element der Liste wird mit 11 multipliziert? Das müsste aber doch immer i=0 sein, oder nicht? Mithin wäre der Initialwert für self.Distance = 0?
    Diese Zeile ist irgendwie Quatsch. Da wird scheinbar der Index multipliziert, nicht der Inhalt.

    self.Distance[iX][iY] = int((iX**2 + iY**2)**0.5 + (0.5**2 + 0.5**2)**0.5)
    damit komme ich überhaupt nicht mehr klar.
    (iX**2 + iY**2)**0.5
    müsste Wurzel(ix²+ix²) liefern?
    Da für i(x,y)= 0;1 fest der Wert 1 gesetzt wird, müssen wir nun einfach für den nächsten Wert prüfen, und stellen fest, daß der Ausdruck Wurzel(2²+2²) liefert. Das ist Wurzel(8) == 2,828427125
    Korrekt analysiert. Und wo ist jetzt der Punkt, an dem Du nicht klar kommst?

    (0.5**2 + 0.5**2)**0.5
    müsste doch eigentlich immer den konstanten Wert (0,25 + 0,25)**0,5 liefern, also Wurzel aus 0,5 == 0,707106781
    Damit kann das doch als konstanter Ausdruck definiert werden, ohne daß das Programm drei Exponentialfunktionen durchlaufen muß?
    Auch richtig.

    Wenn man sich beide Teilausdrücke im Zusammenhang ansieht, stellt man fest, daß für iX und iY > 1 der kleinste Wert des Gesamtausdrucks
    int(2,828427125 + 0,707106781) == 3 ergibt.
    Jo.


    Wir haben also für einen Sprung von 1 auf 3 zwischen i=1 und i=2.
    Japp

    self.Distance[iX][iY] müsste dann self.Distance[3][3] sein?
    Häh?

    ja, ich gebe zu, ich bin eine Wurst....
    Jau.

    Habe ich irgendwo Deine Fragen übersehen?

    Matze

  3. #3
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Nö, hast du nicht. Ich bin beim Schreiben des Postings immer wieder mal in diverse Python-Anleitungen gehüpft, um mich zurechtzufinden. Das diente offensichtlich weder der Klarheit meiner Gedanken, noch der klaren Ausdrucksweise

    Außerdem habe ich mich oben natürlich verschrieben, es müsste heißen:
    "self.Distance [iX][iY] müsste dann 3 sein?"

    Aber offensichtlich habe ich zumindest ansatzweise verstanden, wie die Rechung läuft. Außerdem habe ich jetzt meine Bestätigung, daß ich eine Wurst bin

    Jetzt ist nur die Frage, was passiert mit der Indizierung am Anfang, und welche Auswirkungen hat der Sprung beim Wert für self.Distance von 1 auf 3?

    Es gibt viel zu tun, lassen wir's sein....

    Danke aber für deine Antworten, hilft mir schon mal ein wenig weiter auf dem steinigen Wege....


  4. #4
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Wo ich schon mal dabei bin, mich zu blamieren:
    for iX in range(11):

    Heisst das in range (0,10) oder in range (1, 10)?


  5. #5
    the cosmos rocks Avatar von Caesium
    Registriert seit
    08.12.03
    Ort
    Faerûn
    Beiträge
    9.104
    Jetzt bleibt nur die Frage, WARUM du das überhaupt wissen willst?
    Caesium Mod v2.4 (für Civ4 WL v2.13)

  6. #6
    Im Ruhestand Avatar von chemosh
    Registriert seit
    26.04.06
    Ort
    Oldenburg
    Beiträge
    114
    Zitat Zitat von Commander Bello
    Wo ich schon mal dabei bin, mich zu blamieren:
    for iX in range(11):

    Heisst das in range (0,10) oder in range (1, 10)?
    range(11) = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  7. #7
    SDK-Gott Avatar von MatzeHH
    Registriert seit
    31.10.05
    Beiträge
    759
    Zitat Zitat von Commander Bello
    Außerdem habe ich mich oben natürlich verschrieben, es müsste heißen:
    "self.Distance [iX][iY] müsste dann 3 sein?"
    Ja, für iX = 2 und iY = 2 ist self.distance[iX][iY] = 3

    Ich hatte in meiner vorherigen Antwort auch noch einen Denkfehler drin:
    Nur für iX UND iY = [0,1] wird die Rechnung nicht durchgeführt. iX kann also gerne 0 sein, wenn iY > 1 ist und umgekehrt.
    Insgesamt läuft die Rechnung für alle 121 Kombinationsmöglichkeiten der Zahlen 0 bis 10 und nur für die Paare (0,0), (0,1), (1,0) und (1,1) wird der Wert fest zu 1 gesetzt. Tatsächlich würde die Berechnung für die beiden Paare (0,1) und (1,0) ohnehin 1 ergeben. In der Ergebnismenge tauchen alle Zahlen von 1 bis 14 auf, wie sich mit Excel ja schnell berechnen läßt.

    Edit: Hier die Funktion, wie man sie in Excel schreiben würde:
    =WENN(UND(ODER(A13=0;A13=1);ODER(B13=0;B13=1));1;ABRUNDEN(WURZEL(A13^2+B13^2)+WURZEL(0,5^2 +0,5^2);0))

    Wenn in den Spalten A und B alle 121 Kombinationsmöglichkeiten für iX und iY stehen.

    Außerdem habe ich jetzt meine Bestätigung, daß ich eine Wurst bin
    Aber nur eine sehr kleine.

    Jetzt ist nur die Frage, was passiert mit der Indizierung am Anfang,
    Ich denke, ich weiß, was diese merkwürdige Multiplikation am Anfang ist:
    Das ist die Initialisierung des Arrays self.distance. Da wird nur mitgeteilt, daß self.distance ein 11x11 Array ist.

    Matze
    Geändert von MatzeHH (14. Juni 2006 um 10:30 Uhr)

  8. #8
    the cosmos rocks Avatar von Caesium
    Registriert seit
    08.12.03
    Ort
    Faerûn
    Beiträge
    9.104
    Zitat Zitat von MatzeHH
    Ich denke, ich weiß, was diese merkwürdige Multiplikation am Anfang ist:
    Das ist die Initialisierung des Arrays self.distance. Da wird nur mitgeteilt, daß self.distance ein 11x11 Array ist.

    Matze
    Caesium Mod v2.4 (für Civ4 WL v2.13)

  9. #9
    SDK-Gott Avatar von MatzeHH
    Registriert seit
    31.10.05
    Beiträge
    759
    Zitat Zitat von Caesium
    Dann bin ich ja beruhigt. Aber die Syntax ist schon sehr merkwürdig und unübersichtlich. Da bleibe ich lieber bei meinem C++. Apropos C++: ich bin heute Abend gegen 18:00 Uhr wieder zu Hause. Kannst ja schonmal den einzupflegenden Code zusammenstellen.

    Matze

  10. #10
    the cosmos rocks Avatar von Caesium
    Registriert seit
    08.12.03
    Ort
    Faerûn
    Beiträge
    9.104
    Wozu willst du das denn wissen?
    Geändert von Caesium (14. Juni 2006 um 15:57 Uhr)
    Caesium Mod v2.4 (für Civ4 WL v2.13)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •