Moin!
Naja, soo schwer ist das ganze nun auch wieder nicht; sicher, dass du eine Optimierung nicht doch vielleicht hinkriegst?
Konnte mir einfach nicht vorstellen, dass das so schwer sein soll und hab deshalb mal ein kleines Testproggi draus gemacht: ist im Anhang (wenn der Anhang nicht da sein sollte, Seite ggfs. mehrfach neuladen, ist ein Bug in der aktuellen Forensoftware) zum Ausprobieren fertig übersetzt.
Damit ich nicht deine Hausaufgaben mache, werde ich den kompletten Quelltext des Projektes erst nach dem 20.03. hier reinstellen...
Da ich dir aber nicht vorführen will, dass ich sowas kann (davon hast du ja nix

), hier die entscheidende Prozedur (die dir zwar so auch nix nutzt, aber zumindest der MiniMax-Algo sollte sich erkennen lassen; das sind 3 Schleifen, wobei eine davon schon wieder eine Optimierung ist, das ist nicht schwer; der "Trick" liegt einfach in der geschickten Datenhaltung, wie ich schonmal anmerkte):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| procedure TForm1.BtnCalcClick(Sender: TObject); var Soll,i,j: Integer;
function Prio2Kat(const PrioIndex: Integer): Integer; begin Result := Integer(Prio.Items.Objects[PrioIndex]); end;
procedure ResetKat(const Index: Integer); begin Kat[Prio2Kat(Index)].ItemIndex := 0; KatChange(Self); end;
procedure Optimize(const Index: Integer); var ikat: Integer; begin ResetKat(Index); ikat := Prio2Kat(Index); Log.Lines.Add('Optimiere Kategorie '+Werte[ikat].Symbol); while ( (Kat[ikat].ItemIndex < Kat[ikat].Items.Count-1) and (SelValue > Soll) ) do begin Kat[ikat].ItemIndex := Kat[ikat].ItemIndex +1; KatChange(Self); Log.Lines.Add(' '+KatA.Text+','+KatB.Text+','+KatC.Text+' Wert: '+Current.Text); end; end;
begin Log.Clear; Soll := StrToIntDef(Budget.Text,500); Budget.Text := IntToStr(Soll); for i := 0 to 2 do ResetKat(i); Log.Lines.Add('Maximalauswahl getroffen, Wert: '+Current.Text); for i := 2 downto 0 do begin Optimize(i); if (SelValue < Soll) then begin Log.Lines.Add('Soll unterschritten, mögliche Aufwertung prüfen:'); for j := i+1 to 2 do Optimize(j); end; end; if (SelValue > Soll) then Log.Lines.Add('Budget reicht nicht aus!'); end; |
Vielleicht motiviert das ja noch ein bischen. Falls du also doch noch mal an die Optimierung gehen willst, kannst du ja ruhig weiter hier Fragen, wenn dein Code nicht klappen sollte.
cu
Narses
//EDIT: Ich seh grade, dass sich die Unterkategorie-Optimierung noch verbessern ließe, wenn man bei allen bis auf die aktuell untergeordnete Kategorie zuerst das Minimum auswählt und nicht bei der letzten Auswahl belässt (was aber in der Praxis kaum eine Rolle spielen dürfte, theoretisch aber einen Unterschied machen könnte).