PDA

Vollständige Version anzeigen : Attribute und Kombinationen, beste Kombination


Tobi6678
23.01.2019, 13:06
Hallo zusammen,

ich hätte auch mal eine möglicherweise große Aufgabe.
Im Anhang seht ihr das Projekt.

Mehrere Attribute, mehrere Kombinationen möglich, was ist das beste Ergebnis?
Die Personenanzahl kann dabei bis zu 30 steigen.

Wie kann man sowas programmieren? Mir fällt leider nichts dazu ein...

VG

R J
23.01.2019, 13:43
Hi Tobi,

da braucht es keinen Code. Gehe über Daten, Filter, wähle für die entsprechende Spalte "Zahlenfilter" --> Top 10 und gib an, welche Höchstwerte (also bei Attribut A = 2) angezeigt werden sollen.
Dann wirst Du auch feststellen, dass bei Attribut A eben nicht nur 2 sondern 3 Personen (2, 6, und 9) in Frage kämen.
Falls es doch ein Makro werden soll, aufzeichnen und anpassen....

Tobi6678
23.01.2019, 14:29
Hi RJ,

ne, so meine ich das nicht.

Es dürfen Personen je Attribut nicht mehrfach verwendet werden. Person 1 also nur 1 mal. Person 2 nur 1 mal.

Person 9, z. b., hat ja Topwerte A B und D., Person 4 Topwerte bei D und E...

Verstehst du was ich meine? Ist ein "wenig" komplizierter ...

Mc Santa
23.01.2019, 14:41
Ich habe noch keine Lösung aber zumindest schon einmal ein besseres Ergebnis gefunden:
<style>.mcs{margin-top:5pt;}.mcs table{border-collapse:collapse;}.mcs table td{border:1px solid #999999;color:#000000;background-color:#FFFFFF;font:11pt Calibri, sans-serif;padding:1pt 2pt;text-align:left;vertical-align:middle;}.mcs .foot td{border:0;font-size:9pt;color:#888888;padding:0;}.mcs .foot{clear: both;}.mcs .foot td{background-color:transparent;}.mcs .sheet td:first-child{background-color:#ddddee;text-align:center;}.mcs .sheet tr:first-child td{background-color:#ddddee;text-align:center;}.mcs .r{text-align:right;}.mcs .formulas tr:first-child td{background-color:#eeaaaa;}.mcs .cond tr:first-child td{background-color:#aaaaee;}.mcs .valid tr:first-child td{background-color:#aaeeee;}.formats, .names, .formulas, .cond, .fonts, .valid, .notice{float: none;margin: 10pt 10pt 0 0;}</style><div class='mcs'><table class='sheet'><colgroup><col width='28pt'><col width='80pt'><col width='80pt'></colgroup><tr><td></td><td>I</td><td>J</td></tr><tr><td>15</td><td>Person</td><td>Punkte</td></tr><tr><td>16</td><td class='r'>9</td><td class='r'>9</td></tr><tr><td>17</td><td class='r'>6</td><td class='r'>8</td></tr><tr><td>18</td><td class='r'>2</td><td class='r'>10</td></tr><tr><td>19</td><td class='r'>10</td><td class='r'>9</td></tr><tr><td>20</td><td class='r'>7</td><td class='r'>10</td></tr><tr><td>21</td><td class='r'>1</td><td class='r'>9</td></tr><tr><td>22</td><td class='r'>5</td><td class='r'>9</td></tr><tr><td>23</td><td class='r'>8</td><td class='r'>9</td></tr><tr><td>24</td><td class='r'>11</td><td class='r'>7</td></tr><tr><td>25</td><td class='r'>4</td><td class='r'>8</td></tr><tr><td>26</td><td class='r'></td><td class='r'>88</td></tr></table><table class='formulas' style='word-break: break-all;'><colgroup><col width='40pt'><col></colgroup><tr><td>Zelle</td><td>Formel</td></tr><tr><td>J26</td><td><Span style='color:#222222'>=SUMME</Span><Span style='color:#0000DD'>(J16:J25)</Span><Span style='color:#222222'></Span></td></tr></table></div>

R J
23.01.2019, 15:34
Verstehst du was ich meine? Ist ein "wenig" komplizierter ...

...ich verstehe (jetzt) was Du meintest. Das ging aber aus Deiner Ausgangserklärung nicht einmal ansatzweise hervor.
Und selbst jetzt bleiben noch Fragen. Z. Bsp.:
Sind die Werte in Spalte D ab Zeile 16 nun Vorgabe oder Ergebnis? Nach welcher Wichtung soll denn bei gleichen Werten vorgegangen werden?
Wo sollen denn die Ergebnisse am Ende stehen? In den Spallten A bis F können sie jedenfalls nicht bleiben...
Also, bevor Du eine Frage stellst, solltest Du Dir schon Gedanken darüber machen, was Du genau vorhast und wie es umgesetzt werden sollte. Das erspart allen Beteiligten enorm viel Zeit und so einiges an unnötigem Frust wegen mangelhafter Problembeschreibung...

Oge
23.01.2019, 15:59
Hallo T...,

A) Verständnis
ich nehme an, dass
1. die Anzahl der Personen pro Attribut vorgegeben ist und
2. jede Person nur einmal in der Ergebnisliste vorkommen darf.
Ist das so richtig?

B) dein Beispiel
In deinem Beispiel werden 10 aus 11 Personen über 5 Attribute ausgewählt.
Es gibt 8,3E+05 mögliche Kombinationen, die man mit VBA alle auswerten könnte.
Selbst im ungünstigsten Fall (für jedes Attribut 2) sind es "nur" 1,3E+06 mögliche Kombinationen, die mit VBA auf heutigen Rechnern wohl in weniger als einer Minute durchprobiert werden können.

C) bis zu 30 Personen
1. Wenn 10 aus 30 Personen über 5 Attribute ausgewähl werden sollen, gibt es bis zu 3,4E+12 mögliche Kombinationen. Um alle Kombinationen in Excel auszuprobieren müstest du sehr lange warten.
Aber wenn die Daten wie im Beispiel verteilt sind (relativ viele kleine und nur wenige grosse Werte) und man die Daten sortiert bearbeitet, müssen nicht alle Kombinationen ausprobiert werden. Man kann vorzeitig erkennen, dass in diesem Zweig das bisher günstigste Ergebnis nicht mehr erreicht werden kann. Das ist wohl möglich.

2. Wenn zB 25 aus 30 Personen über 5 Attribute ausgewähl werden sollen, gibt es bis zu 8,9E+19 mögliche Kombinationen. Hier sehe ich keine Möglichkeit in Excel das Optimum zu berechnen. Man kann aber eine Berechnung wie unter 1 beschrieben durchführen und nach vorgegebener Zeit mit einem wahrscheinlich gutem Wert abbrechen.

Tobi6678
23.01.2019, 15:59
Oh ha, sorry, hast´ natürlich recht.

Ab D16 die Werte sind flexibel und sollen änderbar sein.
Bei gleichen Werten, ich vermute das kommt nicht vor, soll meinetwegen immer der erste Wert genommen werden.
Das Ergebis ist ja praktisch in F-H, ab Zeile 15. Es ist mir aber letzendlich egal, wo das Ergebnis steht.

Zu Oges Anmerkungen:

zu a)
1. Jede Person hat jedes Attribut, nur mit unterschiedlichen Werten.
2. ja so ist es, maximal einmal, aber auch keinmal möglich

zu b)
okay, das es viele Möglichkeiten gibt war mir klar

zu c)
es werden 10 Personen gewählt, nach Vorgabe aus Zeile D16 - D20.
Ja, an eine Filtermöglichkeit habe ich auch schon gedacht, zB prüfen, ob der Wert größer ist als 5.

VG

Oge
23.01.2019, 19:34
Hallo T...,

in der Anlage einmal ein erster Programmvorschlag.

Ich bin überrascht wie schnell der einfache Algorithmus viele Zweige abschneidet.
Daher habe ich auf eine programminterne Sortierung nach einem Attributswechsel noch verzichtet.

Hier einige Bemerkungen:

1. Das Programm arbeitet mit vier benannten Zellen "Liste", "Attribute", "Ausgabe" und "Sekunden".
Sie können beliebig in dem Workbook positioniert werden (auch in andere Arbeitsblätter).

2. Da das Programm die Daten um die ersten drei Namen mit ".CurrentRegion" liest oder löscht darf in den Zeilen/Spalten direkt vor und hinter diesen Bereichen keine Zelle belegt sein.

3.
a) Die Anzahl und Position der auszuwertenden Attribute wird über die Anzahl der Zeile des Bereiches Attribute bestimmt. Der Bereich "Liste" muss mindestens eine Spalte mehr haben als der Bereich "Attribute" Zeilen hat.
b) Die Anzahl der auszuwertenden Personen wird über die Anzahl der Zeilen im Bereich "Liste" bestimmt.
c) Die Anzahl der auszuwählenden Personen wird über die Summe der Werte des Bereiches "Attribute" bestimmt.

4. Wenn das Programm zum Ende eine Sekundenanzahl > der vorgegebenen "max Sekunden" anzeigt, kann es sein, dass das Optimum noch nicht erreicht wurde.

Tobi6678
23.01.2019, 20:14
Wahnsinn!!!!!
:boah: :boah:

Ich habe mal die Datei mit Leben gefüllt.

Bei um die 28 Sekunden hat er alle Möglichkeiten gerechnet.

Wüsste nicht, was man da noch besser machen kann.

Vielen DANK!!!

Oge
23.01.2019, 21:28
Hallo T...,

zu Wüsste nicht, was man da noch besser machen kann.

hier mal einige Vorschläge (der zweite ist wichtig, drei und vier können hilfreich sein):

1. ;) Einen schnelleren Rechner anschaffen. Auf meinem sieben Jahre alten Rechner dauert dein Beispiel "nur" 16 Sekunden.

2. Die nicht benötigten Zellen (unter "Mens") löschen, damit sie nicht mit ausgewertet werden. Halbiert die Zeit auf meinem Rechner auf 8 Sekunden.

3. Das Attribut mit der höchsten Anzahl (in deinem Fall Attribut D) in die erste Spalte setzen. Auf meinem Rechner nur noch 1,2 Sekunden.

4. Die Liste dann nach dem ersten Attribut absteigend sortieren. Auf meinem Rechner nur noch 0,4 Sekunden.

5. ;) Eine richtige Programmiersprache nutzen. Auf modernen Rechnern sollte ein Zeitfaktor von 100 möglich sein.

6. Eventuell programmintern nach einem Attributswechsel die Zeilen neu sortieren.

Ich denke aber für deine Mengen sollte es reichen wenn du 2.-4. berücksichtigst.

zu
Bei um die 28 Sekunden hat er alle Möglichkeiten gerechnet.
Nein, das Programm berechnet nicht alle Kombinationen. Wenn abzusehen ist, dass das bisher beste Ergebnis im aktuellen Zweig nicht mehr verbessert werden kann, bricht das Programm diesen Zweig ab.

Tobi6678
25.01.2019, 16:10
Hallo,

ich hätte da mal noch einen Wunsch an die Experten.
Im Anhang befindet sich nochmal die Datei I20 - R25 sind nun die Attributskombination aufgelistet.
Ich habe versucht ein Makro zu schreiben. Das Makro soll dazu da sein, um diese Attributskombination am Stück auszurechnen.

Irgendwie geht es aber nicht so wie ich möchte.

Oge
26.01.2019, 05:20
Hallo T...,

1. Dein Makro
Du hattest das Makro zwar richtig aufgezeichnet, aber der Aufruf des Button "tuwat" wird nicht mitgeschrieben. Du müstest an diesen Stellen immer eine Zeile mit "Call Machs" schreiben.

2. Achtung !!!!
Ich habe gerade gesehen, dass du auch Werte mit Nachkommastellen hast. Das hat das alte Programm nicht richtig bearbeitet. In der neuen Datei habe ich es korrigiert. Dadurch ändern sich die optimalen Zusammenstellungen.

Tobi6678
26.01.2019, 11:10
Oge, einmal mehr "ganz große Klassen und vielen Dank".

Nur noch zwei Frage:
1. Besteht die Möglichkeit das Anzeigen der Sekunden zwischen den Berechnungen zu deaktivieren?
2. Wenn ich zusätzliche Personen hätte, kann ich die Personen dann einfach hinzufügen oder muss ich Zeilen einfügen?
3. Wenn das Programm nicht nur die Gesamtsumme kopieren würde, sondern auch die Namen.

VG

Oge
26.01.2019, 14:00
Hallo T...,

zu 1.
Siehe Anlage. Da ich jetzt nicht mehr anhand der Zeitausgabe erkennen kann welche Berechnung abgebrochen wurde, gebe ich das in einer Zusatzzeile aus.

zu 2.
Einfach hinzufügen reicht, da der Zugriff vom Programm über "CurrentRegion" erfolgt.
Auch eine Spalte für ein Attribut kann einfach hinzugefügt werden. Nur must du dann auch eine Zeile im Bereich "Wiederholen" hinzufügen um diese Spalte zu nutzen.
Auch eine Spalte für "Wiederholen" kann einfach hinzugefügt werden.

Da viele Zugriffe über benannte Zellen und "CurrentRegion" (ausser "Summe" und "Sekunden") erfolgen, müssen die Zeilen und Spalten direkt vor, unter, hinter und über den Bereichen leer sein.

zu 3.
siehe Anlage. Die Anzahl der Personen müssen nicht für jede Spalte im Bereich "Wiederholen" gleich sein.

Tobi6678
26.01.2019, 15:19
Klasse!
:happy: