AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bandbreitenoptimierung für Matrizen

Ein Thema von Bjoerk · begonnen am 22. Jun 2015 · letzter Beitrag vom 26. Jun 2015
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Bandbreitenoptimierung für Matrizen

  Alt 22. Jun 2015, 17:55
Ich habe eine Indextabelle (IndexOfU), die folgendermaßen aufgebaut wird:
Delphi-Quellcode:
procedure TFrame.GrowNU(const Index: integer); // Anzahl Unbekannte;
begin
  Inc(FNU);
  FIndexOfU[Index] := FNU;
end;

procedure TFrame.GrowNV(const Index: integer); // Anzahl Auflagergleichungen;
begin
  FIndexOfU[Index] := FN - FNV; // N = DG * Nodes.Count;
  Inc(FNV);
end;

procedure TFrame.CalcIndexOfU;
var
  I, J, Index: integer;
begin
  for I := 1 to FNodes.Count do
    for J := 1 to FDG do // Ebenes Stabwerk 3, Räumliches 6, Ebenes Fachwerk 2, Räumliches 3;
    begin
      Index := FDG * (I - 1) + J;
      if J = 1 then
        if not FNodes.Item[I].Fest.vX then
          GrowNU(Index)
        else
          GrowNV(Index);
      if J = 2 then
        if not FNodes.Item[I].Fest.vY then
          GrowNU(Index)
        else
          GrowNV(Index);
      if FD = 3 then // Räumlich;
      begin
        if J = 3 then
          if not FNodes.Item[I].Fest.vZ then
            GrowNU(Index)
          else
            GrowNV(Index);
        if not FSyst then // Stabwerk;
        begin
          if J = 4 then
            if not FNodes.Item[I].Fest.pX then
              GrowNU(Index)
            else
              GrowNV(Index);
          if J = 5 then
            if not FNodes.Item[I].Fest.pY then
              GrowNU(Index)
            else
              GrowNV(Index);
          if J = 6 then
            if not FNodes.Item[I].Fest.pZ then
              GrowNU(Index)
            else
              GrowNV(Index);
        end;
      end
      else
        if not FSyst and (J = 3) then // Ebenes StabwerK;
        begin
          if not FNodes.Item[I].Fest.pZ then
            GrowNU(Index)
          else
            GrowNV(Index);
        end;
    end;
end;
Nun soll IndexOfU im Bereich 1..NU so "gemischt" werden, so daß NB möglichst klein wird.
Delphi-Quellcode:
procedure TFrame.SimulateLoad(const T1, T2: integer);
var
  k1, k2, i1, i2, Row, Col: integer;
begin
  i1 := FDG * (T1 - 1);
  i2 := FDG * (T2 - 1);
  for k1 := 1 to FDG do
  begin
    Row := FIndexOfU[i1 + k1];
    if Row <= FNU then
      for k2 := 1 to FDG do
      begin
        Col := FIndexOfU[i2 + k2];
        if (Col >= Row) and (Col <= FNU) then
          FNB := Max(FNB, Col - Row + 1);
      end;
  end;
end;

procedure TFrame.CalcNB; // Bandbreite;
var
  I: integer;
begin
  FNB := 0;
  repeat ***
    FIndexOfU := ..
    for I := 1 to FElements.Count do
    begin
      SimulateLoad(FElements.Item[I].Left, FElements.Item[I].Left);
      SimulateLoad(FElements.Item[I].Right, FElements.Item[I].Right);
      SimulateLoad(FElements.Item[I].Left, FElements.Item[I].Right);
      SimulateLoad(FElements.Item[I].Right, FElements.Item[I].Left);
    end;
  until FB möglichst klein; ***
end;
Verstanden was ich meine? Kennt jemand ein Prinzip, nach welchem man NB iterieren könnte (außer Zufallslisten)? BTW, bitte nicht wundern, ist alles 1 basiert.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Bandbreitenoptimierung für Matrizen

  Alt 23. Jun 2015, 06:50
Vermutlich bin ich der Einzige, der das nicht verstanden hat. Es geht ja um irgendwelche Gleichungen, Stabwerke, Fachwerke, Ebenen, Räume oder irgendwie so.

Gibt es eine Möglichkeit, das so zu erklären, das man das versteht? Wenn es nämlich um Optimierungen geht, könnte sich das Problem auf eines der Standardprobleme reduzieren, für die es fertige Lösungen gibt.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: Bandbreitenoptimierung für Matrizen

  Alt 23. Jun 2015, 07:40
Vermutlich bin ich der Einzige, der das nicht verstanden hat.
Nope Vermutlich wäre es auch hilfreich zu wissen, was NB, NV, NU, usw... bedeuten.
  Mit Zitat antworten Zitat
Benutzerbild von frankyboy1974
frankyboy1974

Registriert seit: 7. Apr 2015
Ort: SH
169 Beiträge
 
Delphi XE7 Professional
 
#4

AW: Bandbreitenoptimierung für Matrizen

  Alt 23. Jun 2015, 08:27
Hallo,

ich hab das Ausgangsproblem leider auch nicht verstanden, wenn ich aber etwas von Optimierung und Zufallslisten lese, würden mir spontan Evolutionäre Algorithmen einfallen. Ist nur mal so in den Raum geworfen.

mfg

Frank
Java ist auch eine Insel.
Ist Delphi von Oracle?
In meiner Buchstabensuppen fehlt das C++!
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#5

AW: Bandbreitenoptimierung für Matrizen

  Alt 23. Jun 2015, 08:38
Moin!

Nennt mich jetzt ruhig "kleinlich", aber ein "Hallo; Bitte; Danke; (Tschüss)" wäre auch noch ganz nett, wenn man möchte, dass einem geholfen wird. ( Nicht böse gemeint, also nicht sauer sein )
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
668 Beiträge
 
Delphi 12 Athens
 
#6

AW: Bandbreitenoptimierung für Matrizen

  Alt 23. Jun 2015, 09:03
Ich habe das in etwa verstanden (wir kommen aus der selben Branche, wobei das ja eher ein allgemeines mathematisches Problem ist)

Nochmal zum Verständnis:

Delphi-Quellcode:
procedure TFrame.CalcNB; // Bandbreite;
var
  I: integer;
begin
  FNB := 0;
  repeat ***
    FIndexOfU := ..
    for I := 1 to FElements.Count do
    begin
      SimulateLoad(FElements.Item[I].Left, FElements.Item[I].Left);
      SimulateLoad(FElements.Item[I].Right, FElements.Item[I].Right);
      SimulateLoad(FElements.Item[I].Left, FElements.Item[I].Right);
      SimulateLoad(FElements.Item[I].Right, FElements.Item[I].Left);
    end;
  until FB möglichst klein; ***
end;
Ich nehme an, bei FIndexOfU := soll die Indextabelle in einer geänderten Reigenfolge neu aufgebaut werden. Passiert das durch Aufruf von CalcIndexOfU? Dann könnte man dort vielleicht nicht mit for I := 1 to FNodes.Count über die Nodes laufen, sondern immer möglichst benachbarte Nodes als nächstes einsetzen.

Ansonsten ist auch die Frage, ob die Rechenzeit, die man in eine aufwändige Bandbreitenoptimierung reinsteckt, später bei der eigentlichen Martixberechnung wieder reingeholt wird.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#7

AW: Bandbreitenoptimierung für Matrizen

  Alt 23. Jun 2015, 09:20
Ich verstehe zwar auch nichts, zumal die Struktur der Nodes unklar sind.

Aber wenn es um Performance geht wäre es nicht vielleicht sinnvoll alles in Key/Value Hash-Tabellen umzuprogrammieren
http://docwiki.embarcadero.com/Libra...ns.TDictionary
(

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#8

AW: Bandbreitenoptimierung für Matrizen

  Alt 23. Jun 2015, 10:08
Ok, das hat mich jetzt doch interessiert und ich habe mich etwas eingelesen: Es geht darum die Breite des Bandes einer Bandmatrix zu minimieren.

Imho würde sich ein Branch-and-Bound-Verfahren anbieten: Jeden anfügen eines Elemente ist ein Branch-Schritt.
Wenn du das Minimum (oder einen "akzeptablen" Wert) erreicht hast brichst du ab; wenn du irgendwann beim Sortieren die bisherige obere Schranke überschreitest, kannst du den Branch abschneiden: egal wie du den Suffix sortierst, der Zielwert wird nicht besser.

Eine untere Schranke findet man leicht: Die minimale Breite des Bandes ist die maximale Anzahl von Abhängigkeiten eines Elementes.

Dann wäre es natürlich schön, eine möglichst gute erste obere Schranke zu haben.
Das könntest du mit einem Greedy-Verfahren versuchen: Fange mit einem Element mit maximal vielen Abhängigkeiten an, dann füge immer ein Element hinzu, das die älteste Abhängigkeit von Vorgängern erfüllt. Das Ergebnis ist vermutlich nicht optimal, aber vermutlich besser als ausgewürfelt. Alternativ hast du vielleicht Informationen, die du für eine erste Sortierung nutzen kannst, z.B. räumliche Anordnung.

Geändert von BUG (23. Jun 2015 um 10:34 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Bandbreitenoptimierung für Matrizen

  Alt 23. Jun 2015, 10:35
Am besten, ich mach ein Beispiel. Das Beispiel verwendet 5 Knoten und 4 Stäbe. Ein Knoten hat hier 3 Freiheitsgrade, eine Verschiebung in X-Richtung, eine Verschiebung in Y-Richtung und eine Verdrehung in Z-Richtung (Verdrehung um die Z-Achse). Man gibt die Koordinaten der Knoten vor und man gibt Stäbe an.

Ein Stab hat einen linken und einen rechten Anschlußknoten (FElements.Item[I].Left, FElements.Item[I].Right). Hier Stab 1 von Knoten 1 nach Knoten 2, Stab 2 geht von Knoten 2 nach Knoten 5, Stab 3 von Knoten 5 nach Knoten 3 und Stab 4 von Knoten 3 nach Knoten 4.

Dann gibt man an, welche Freiheitsgrade an Knoten ausgeschlossen werden (Auflager). Im Beispiel sind an den Knoten 1, 4 und 5 die Verschiebungen in Y-Richtung ausgeschlossen, am Knoten 5 zusätzlich die Verschiebung in X-Richtung.

Mit diesen Angaben kann man eine Indexliste aufbauen und damit eine Systemsteifigkeitsmatrix aufstellen. Die Indexliste gibt an, daß z.B. die Reihe/Spalte 2 der Matrix nach Reihe/Spalte 15 zu verschieben ist (IndexOfRow, IndexOfCol). Die Matrix ist symmetrisch und hat eine Bandstruktur. Wie groß die Bandbreite ist kann man berechnen.

Delphi-Quellcode:
procedure TFrame.SimulateLoad(const T1, T2: integer);
var
  k1, k2, i1, i2, Row, Col: integer;
begin
  i1 := FDG * (T1 - 1);
  i2 := FDG * (T2 - 1);
  for k1 := 1 to FDG do
  begin
    Row := FIndexOfU[i1 + k1];
    if Row <= FNU then
      for k2 := 1 to FDG do
      begin
        Col := FIndexOfU[i2 + k2];
        if (Col >= Row) and (Col <= FNU) then
          FNB := Max(FNB, Col - Row + 1);
      end;
  end;
end;

procedure TFrame.CalcNB; // Bandbreite;
var
  I: integer;
begin
  FNB := 0;
  for I := 1 to FElements.Count do
  begin
    SimulateLoad(FElements.Item[I].Left, FElements.Item[I].Left);
    SimulateLoad(FElements.Item[I].Right, FElements.Item[I].Right);
    SimulateLoad(FElements.Item[I].Left, FElements.Item[I].Right);
    SimulateLoad(FElements.Item[I].Right, FElements.Item[I].Left);
  end;
end;
Um die Bandbreite zu optimieren, benennt man die Knoten lediglich anders. Lisa heißt jetzt Petra und Petra Lisa. Damit ergibt sich eine andere Indexliste und eine andere Bandbreite. Man tauscht z.B. die Namen der Knoten von 1 und 5. Damit geht Stab 1 nicht mehr von Knoten 1 nach Knoten 2 sondern von Knoten 5 nach Knoten 2. Mit dieser Knotenbenennung durchläuft man den Algo nochmals. Gesucht ist die Knotenbenennung, die die kleinste Bandbreite ergibt.
Angehängte Dateien
Dateityp: pdf Ebenes Stabwerk Example.pdf (23,1 KB, 15x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#10

AW: Bandbreitenoptimierung für Matrizen

  Alt 23. Jun 2015, 10:44
Wenn ich das richtig verstanden habe, ist das Aufbauen der Indexliste (=> Permutation) quasi das Sortieren der Elemente/Knoten so dass die Bandbreite minimal wird?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz