Hallo!
Ich habe hier das Problem, das ich einerseits in der Compare_ Funktion eine EInvalidOp
Exception erhalte, andererseits auch noch eine EInvalidOp
Delphi-Quellcode:
type
PObjStruct = ^TObjStruct;
TObjStruct =
record
useability,mass,optimum: Extended;
end;
TObjects =
class(TList)
function Add(Item: Pointer): Integer;
end;
function TObjects.Add(Item: Pointer): Integer;
begin
PObjStruct(Item).optimum := PObjStruct(Item)^.useability / PObjStruct(Item)^.mass;
Result :=
inherited Add(PObjStruct(Item));
end;
function Compare_(Item1,Item2: Pointer): Integer;
begin
if PObjStruct(Item1)^.optimum < PObjStruct(Item2)^.optimum
then Result := -1
else
if PObjStruct(Item1)^.optimum > PObjStruct(Item2)^.optimum
then Result := +1
else //EInvalidOp in der zweiten Vergleichsoperation
Result := 0;
end;
procedure Optimize(
var AObjects,AList: TList; AMaxMass: Extended);
var i,j: Integer; amass: Extended;
begin
amass := 0.0;
AList.Sort(Compare_);
i := AList.Count-1;
while i > 0
do
begin
amass := amass + PObjStruct(AList.Items[i])^.mass;
//EInvalidOp
if amass<=AMaxMass
then AObjects.Add(PObjStruct(AList.Items[i]))
else
begin
j:=i;
while (amass>AMaxMass)
and (j>0)
do
begin
amass := amass - PObjStruct(AList.Items[j])^.mass;
amass := amass + PObjStruct(AList.Items[j-1])^.mass;
if amass<=AMaxMass
then AObjects.Add(PObjStruct(AList.Items[j-1]));
Dec(j);
end;
end;
Dec(i);
end;
end;
Ich habe mich hier mal drangemacht, das Rucksackproblem zu lösen, das ein anderes Mitglied der
DP hier erfragt hatte als ich vor einigen Tagen seit langem mal wieder hier vorbeigeschaut habe. Die Procedure Optimize hat folgende Parameter:
AObjects: Die fertige Liste mit den Objekten, die die Gewichtsschranke einhalten
AList: Die Liste mit den Objekten, aus denen passende ausgewählt werden
AMaxMass: Die Gewwichtsschranke
Leider hänge ich nun fest am Probelem des Zugriffs auf die Recordvariablen in der liste.
Wer kann mir hier helfen? Sobald das Problem gelöst ist, soll die Optimize-Prozedur hier in die CodeLibrary aufgenommen werden.
schöni
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.