Supportnet / Forum / Skripte(PHP,ASP,Perl...)
Lösungshilfe gesucht
Frage
Hallo zusammen,
ich habe ein kleines Problem für eine Exceltabelle. Dies wird vermutlich nur mit VBS zu lösen sein, was aber meinen Kenntnisstand etwas übersteigt.
Folgendes Problem ist vorhanden.
Es gibt mehrere Felder die Ganzzahlen zwischen 0 und 127 enthalten.
Dann gibt es noch 2 Felder die eine Ober- und eine Untergrenze beinhalten. Ebenfalls im Bereich 0 bis 127
Die Aufgabe wäre jetzt alle möglichen Kombinationen aufzulisten, bei der die Summe aus den ersten Feldern im Bereich der 2 Felder für Ober- und Untergrenze liegt.
z.B. Feld A = 5, Feld B = 4, Feld C = 3, Feld D = 2
Obergrenze 9, Untergrenze 8
Ausgegeben werden sollen in dem Fall die Namen A+B, A+C, B+C+D
Als Besonderheit sollte ein Feld, daß den Wert 0 enthält, nicht berücksichtigt werden.
Über Hilfe hierzu wäre ich euch dankbar.
Antwort 1 von Firedart65
Wer nur einen Lösungsansatz für die mathematische Vorgehensweise liefern kann, hilft mir auch schon deutlich weiter.
Antwort 2 von gast444
hi :-)
ist eine echte knobelaufgabe
vorgehensweise ist eigentlich klar denk ich
1 2 3 4 einer pos vergleich
12 34 13 24 zweier pos vergleich
123 234 134 dreier pos vergleich
usw.
ich wuerde vorschlagen ein array zu nutzen ,da es recht rechenintensiv werden wird, je nach anzahl der summanten
bei sehr vielen summanten ein dictionary objekt nutzen
gruss gast
ist eine echte knobelaufgabe
vorgehensweise ist eigentlich klar denk ich
1 2 3 4 einer pos vergleich
12 34 13 24 zweier pos vergleich
123 234 134 dreier pos vergleich
usw.
ich wuerde vorschlagen ein array zu nutzen ,da es recht rechenintensiv werden wird, je nach anzahl der summanten
bei sehr vielen summanten ein dictionary objekt nutzen
gruss gast
Antwort 3 von Firedart65
Danke für deine Antwort. Die vorgeschlagene Vorgehensweise wird wohl nur über verschachtelte for-next-Schleifen zum addieren und vergleichen funktionieren.
Bei einem positivem Vergleich müsste dann ein String mit den Feldnamen erzeugt, bzw. ergänzt/erweitert, werden.
Das war auch meine prinzipielle Überlegung im Vorfeld.
Ich hatte gehofft, daß es evtl. für diese Art der Auswertung andere mathematische oder programmtechnische Lösungsansätze gibt, als mit Gewalt alle möglichen Varianten durchlaufen zu lassen und das Ergebnis zu überprüfen.
Gruss von Firedart65
Bei einem positivem Vergleich müsste dann ein String mit den Feldnamen erzeugt, bzw. ergänzt/erweitert, werden.
Das war auch meine prinzipielle Überlegung im Vorfeld.
Ich hatte gehofft, daß es evtl. für diese Art der Auswertung andere mathematische oder programmtechnische Lösungsansätze gibt, als mit Gewalt alle möglichen Varianten durchlaufen zu lassen und das Ergebnis zu überprüfen.
Gruss von Firedart65
Antwort 4 von gast123
hi all
prob ist eigentlich nur wenn du eine unbestimmte anzahl an summanten hast
gruss gast123
prob ist eigentlich nur wenn du eine unbestimmte anzahl an summanten hast
gruss gast123
Antwort 5 von Firedart65
O.K., so unbestimmt ist die Anzahl nicht.
Die als "Feld xyz" bezeichnete Anzahl Felder wird maximal 10 betragen, von daher kann man dies gleich auf 10 festlegen und ggf. den Wert 0 eintragen wenn weniger verwendet werden.
Somit ergeben sich bei dem Verfahren 10 Einertests, ne Menge Zweiertests, nochmal ne Menge Dreiertestes......bis zu den Neunertestes, von denen es ja dann wieder nur 10 gibt, wenn ich richtig rechne. Der Zehnertest scheidet aus, da die Obergrenze in jedem Fall weniger als 2/3 der Summe aller 10 Feldinhalte ist. Aber die eine Rechnung würde die Gesamtrechenzeit auch nicht wirklich wesentlich verändern.
Somit wären also 9 Berechnungsblöcke notwendig, oder ?
Die erste Schleife für den Einertest. Die ist einfach.
Die Zweite für den Zweiertest. Wie würdest du das aufbauen ?
Die als "Feld xyz" bezeichnete Anzahl Felder wird maximal 10 betragen, von daher kann man dies gleich auf 10 festlegen und ggf. den Wert 0 eintragen wenn weniger verwendet werden.
Somit ergeben sich bei dem Verfahren 10 Einertests, ne Menge Zweiertests, nochmal ne Menge Dreiertestes......bis zu den Neunertestes, von denen es ja dann wieder nur 10 gibt, wenn ich richtig rechne. Der Zehnertest scheidet aus, da die Obergrenze in jedem Fall weniger als 2/3 der Summe aller 10 Feldinhalte ist. Aber die eine Rechnung würde die Gesamtrechenzeit auch nicht wirklich wesentlich verändern.
Somit wären also 9 Berechnungsblöcke notwendig, oder ?
Die erste Schleife für den Einertest. Die ist einfach.
Die Zweite für den Zweiertest. Wie würdest du das aufbauen ?
Antwort 6 von gast123
hi Firedart65
eventuell ist der solver auch anwendbar ,wobei ich mit ihm noch nie gearbeitet hab,schon oft davon gehoert aber nie getestet
ansonsten geht deine idee schon in die richtige richtung
erfassung der moeglichkeiten und anschliessenden vergleich
im dualen zahlensystem ,machte ich schon oefters solche versuche bzw makros
in deinem fall ist es aber um etliches komplizierter
ideen !
ich denk die 1/2/3/4 etc. positionen wuerde ich in die 2 dimension als integer in ein array legen.mit max ausdehnug,so haettest du jetzt zugriff auf die positionen ohne einen kommpletten durchlauf zu produzieren
ideen !
recht amuesant wird es bei den verschachtelten schleifen,sei es do loop oder for next oder andere
da denk ich das eine parallele verschiebung der quelle und des ziels innerhalb eines durchlaufes moeglich ist,ueber -step wie +step fuer das ziel wie fuer die quelle,ich bin auch der meinung das eventuell ueber mehrdimensionale felder sich eventuell die laufzeit verkuerzen liesse,da hab ich leider nicht die zeit fuer experimente
kannst ja oefters mal reinschauen,interessant find ich das schon und wenn ich naechste woche zeit hab probier ich mich
gruss gast123
eventuell ist der solver auch anwendbar ,wobei ich mit ihm noch nie gearbeitet hab,schon oft davon gehoert aber nie getestet
ansonsten geht deine idee schon in die richtige richtung
erfassung der moeglichkeiten und anschliessenden vergleich
im dualen zahlensystem ,machte ich schon oefters solche versuche bzw makros
in deinem fall ist es aber um etliches komplizierter
ideen !
ich denk die 1/2/3/4 etc. positionen wuerde ich in die 2 dimension als integer in ein array legen.mit max ausdehnug,so haettest du jetzt zugriff auf die positionen ohne einen kommpletten durchlauf zu produzieren
ideen !
recht amuesant wird es bei den verschachtelten schleifen,sei es do loop oder for next oder andere
da denk ich das eine parallele verschiebung der quelle und des ziels innerhalb eines durchlaufes moeglich ist,ueber -step wie +step fuer das ziel wie fuer die quelle,ich bin auch der meinung das eventuell ueber mehrdimensionale felder sich eventuell die laufzeit verkuerzen liesse,da hab ich leider nicht die zeit fuer experimente
kannst ja oefters mal reinschauen,interessant find ich das schon und wenn ich naechste woche zeit hab probier ich mich
gruss gast123
Antwort 7 von Firedart65
Und weil das Ganze so schön kniffelig ist, habe ich auch mal über Laufzeitoptimierung nachgedacht.
Anstatt sich in den Schleifen von Einertest bis Neunertest durchzuarbeiten, prüft man zuerst wieviel der Felder keine 0 beinhalten. Nun kennt man die also den Maximaltest, der notwendig ist.
Z.B. 6 Felder sind mit Nutzwerten belegt, 4 mit Nullen, somit braucht man maximal einen Fünfertest.
Fängt man jetzt auch noch bei dem 50% Wert an zu suchen, dann optimiert man die Anzahl der Schleifenläufe dramatisch.
Also in dem Beispiel der Dreiertest als erstes, dann den Vierertest, gefolgt vom Zweiertest.
Wenn der Vierertest nur noch Werte liefert, die über dem Optimum liegen, kann man sich den nächst höheren Durchlauf auch schenken. Also kein Fünfertest mehr notwendig.
Ebenso in der umgekehrten Richtung. Ergibt der Zweiertest keinen Wert mehr über dem Minimum, braucht man den Einertest auch nicht mehr durchführen.
Diese Optimierung wird umso interessanter, je mehr Felder belegt sind und keine Nullen enthalten.
Vielleicht ist die Variante mit den verschachtelten Schleifen am Ende doch nicht so dumm.
Theoretisch könnte man bei einer sehr großen Feldanzahl jeweils große Sprünge machen, um die Grenzen sehr schnell zu finden um den Bereich zu kennen, den man mit Schleifen penetrieren müsste.
Z.B. 80 Felder, 40er Test als erstes, dann 60er Test und 20er Test. Dann entweder 50er oder 70er Test, bzw. 30er oder 10er Test. usw. usw.
Aber das ist wie gesagt nur theoretisch weitergedacht und wird praktisch nicht in der Größendimension benötigt.
Anstatt sich in den Schleifen von Einertest bis Neunertest durchzuarbeiten, prüft man zuerst wieviel der Felder keine 0 beinhalten. Nun kennt man die also den Maximaltest, der notwendig ist.
Z.B. 6 Felder sind mit Nutzwerten belegt, 4 mit Nullen, somit braucht man maximal einen Fünfertest.
Fängt man jetzt auch noch bei dem 50% Wert an zu suchen, dann optimiert man die Anzahl der Schleifenläufe dramatisch.
Also in dem Beispiel der Dreiertest als erstes, dann den Vierertest, gefolgt vom Zweiertest.
Wenn der Vierertest nur noch Werte liefert, die über dem Optimum liegen, kann man sich den nächst höheren Durchlauf auch schenken. Also kein Fünfertest mehr notwendig.
Ebenso in der umgekehrten Richtung. Ergibt der Zweiertest keinen Wert mehr über dem Minimum, braucht man den Einertest auch nicht mehr durchführen.
Diese Optimierung wird umso interessanter, je mehr Felder belegt sind und keine Nullen enthalten.
Vielleicht ist die Variante mit den verschachtelten Schleifen am Ende doch nicht so dumm.
Theoretisch könnte man bei einer sehr großen Feldanzahl jeweils große Sprünge machen, um die Grenzen sehr schnell zu finden um den Bereich zu kennen, den man mit Schleifen penetrieren müsste.
Z.B. 80 Felder, 40er Test als erstes, dann 60er Test und 20er Test. Dann entweder 50er oder 70er Test, bzw. 30er oder 10er Test. usw. usw.
Aber das ist wie gesagt nur theoretisch weitergedacht und wird praktisch nicht in der Größendimension benötigt.
Antwort 8 von Firedart65
Kleine Berichtigung zum Text vorher:
Vierertest nur noch Werte liefert, die über dem Optimum liegen
Richtig wäre Maximum
Vierertest nur noch Werte liefert, die über dem Optimum liegen
Richtig wäre Maximum

