Einzelnen Beitrag anzeigen

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