Planung von Werbebannern
Naps
- php
- programmiertechnik
- sonstiges
Hi,
ich habe ein kleines "Logik" Problem. Ich habe z.B. die folgenden Werbe-Banner:
$ads['id1'] = ['start' => '2014-11-10', 'end' => '2014-11-23', 'impressions' => 1000];
$ads['id2'] = ['start' => '2014-12-01', 'end' => '2014-12-16', 'impressions' => 1000];
$ads['id3'] = ['start' => '2014-12-08', 'end' => '2014-12-21', 'impressions' => 6000];
$ads['id4'] = ['start' => '2014-12-15', 'end' => '2015-01-20', 'impressions' => 20000];
Pro Tag können z.B. 450 Banner-Impressions ausgeliefert werden. Wenn ich jetzt einfach die Impressions konstant über den Zeitraum verteile, gibt es an manchen Tagen Probleme mit dem 450-Limit.
Dann habe ich mir gedacht, ich liefer einfach von Anfang an die 450 / Tag aus (verteilt auf die Banner die an diesem Tag online sind). Kann funktionieren, tut es aber meistens nicht. Bei den Beispiel-Bannern oben müsste ich z.B. ID4 anfangs nur in kleinen Mengen ausliefern, und am Ende dann mehr, da er dann der Einzige Banner ist, der im Jänner online ist.
Wäre, eurer Meinung nach, ein iterativer oder rekursiver Ansatz besser, und wie könnte man sowas umsetzen?
Freue mich über alle Tipps :)
Danke! MFG Naps
Liebe Mitdenker, liebe Wissende, liebe Neugierige,
Das kann man leider in dieser bescheuerten Kaputt-Formatierung nicht lesen!
Spirituelle Grüße
Euer Robert
robert.r@online.de
Hi,
Das kann man leider in dieser bescheuerten Kaputt-Formatierung nicht lesen!
mit Quelltextformatierung geht das, schau dir mal die grauen Knöpfchen an:
$ads['id1'] = ['start' => '2014-11-10', 'end' => '2014-11-23', 'impressions' => 1000];
$ads['id2'] = ['start' => '2014-12-01', 'end' => '2014-12-16', 'impressions' => 1000];
$ads['id3'] = ['start' => '2014-12-08', 'end' => '2014-12-21', 'impressions' => 6000];
$ads['id4'] = ['start' => '2014-12-15', 'end' => '2015-01-20', 'impressions' => 20000];
Ich habe dein Posting korrigiert.
Ciao, Performer
Liebe Mitdenker, liebe Wissende, liebe Neugierige,
Hi,
Das kann man leider in dieser bescheuerten Kaputt-Formatierung nicht lesen!
mit Quelltextformatierung geht das, schau dir mal die grauen Knöpfchen an:
$ads['id1'] = ['start' => '2014-11-10', 'end' => '2014-11-23', 'impressions' => 1000]; $ads['id2'] = ['start' => '2014-12-01', 'end' => '2014-12-16', 'impressions' => 1000]; $ads['id3'] = ['start' => '2014-12-08', 'end' => '2014-12-21', 'impressions' => 6000]; $ads['id4'] = ['start' => '2014-12-15', 'end' => '2015-01-20', 'impressions' => 20000];
Ich kack jetzt bald auf diese ganzen Ausreden...
Und DAS WAR JETZT NOCH HÖFLICH!
und wo ist überhaupt das Archiv geblieben mit seiner genialen Durchsuchbarkeit?
Spirituelle Grüße
Euer Robert
robert.r@online.de
Hallo robertroth,
und wo ist überhaupt das Archiv geblieben mit seiner genialen Durchsuchbarkeit?
Der erste angepinnte Thread in diesem Forum heißt „Links zum Archiv“. Und das war jetzt freundlich geantwortet.
Bis demnächst
Matthias
Liebe Mitdenker, liebe Wissende, liebe Neugierige,
Hallo robertroth,
und wo ist überhaupt das Archiv geblieben mit seiner genialen Durchsuchbarkeit?
Der erste angepinnte Thread in diesem Forum heißt „Links zum Archiv“. Und das war jetzt freundlich geantwortet.
Wie bitte?
Spirituelle Grüße
Euer Robert
robert.r@online.de
Hallo robertroth,
und wo ist überhaupt das Archiv geblieben mit seiner genialen Durchsuchbarkeit?
Der erste angepinnte Thread in diesem Forum heißt „Links zum Archiv“. Und das war jetzt freundlich geantwortet.
Wie bitte?
Ich kann mich nur wiederholen und vielleicht auch noch den Link dazu liefern: http://forum.selfhtml.org/self/2015/apr/09/links-zum-archiv/1636724#m1636724
Bis demnächst
Matthias
$ads['id1'] = ['start' => '2014-11-10', 'end' => '2014-11-23', 'impressions' => 1000]; $ads['id2'] = ['start' => '2014-12-01', 'end' => '2014-12-16', 'impressions' => 1000]; $ads['id3'] = ['start' => '2014-12-08', 'end' => '2014-12-21', 'impressions' => 6000]; $ads['id4'] = ['start' => '2014-12-15', 'end' => '2015-01-20', 'impressions' => 20000];
Ich habe dein Posting korrigiert.
Danke!
Aloha ;)
Ich würde gern helfen, aber ich verstehe die Problemstellung nicht genau. Ich versuch mal auszudrücken, was ich verstanden habe und was nicht.
$ads['id1'] = ['start' => '2014-11-10', 'end' => '2014-11-23', 'impressions' => 1000]; $ads['id2'] = ['start' => '2014-12-01', 'end' => '2014-12-16', 'impressions' => 1000]; $ads['id3'] = ['start' => '2014-12-08', 'end' => '2014-12-21', 'impressions' => 6000]; $ads['id4'] = ['start' => '2014-12-15', 'end' => '2015-01-20', 'impressions' => 20000];
Okay. Wir haben 4 Banner, die jeweils im Zeitraum von start bis end gezeigt werden sollen. Was genau meinst du mit impressions? Mir ist der Ausdruck in dieser Form nicht geläufig. Wikipedia meint, das könnte was mit "Abruf" zu tun haben (vergleiche Page Impression). Also, dann geh ich davon aus, dass die Banner in ihrem jeweiligen Zeitraum so oft angezeigt werden sollen, wie impressions sagt.
Pro Tag können z.B. 450 Banner-Impressions ausgeliefert werden.
Können oder müssen? Irgendwie versteh ich das mit den Banner-Impressions wohl doch noch nicht ganz...
Wenn ich jetzt einfach die Impressions konstant über den Zeitraum verteile, gibt es an manchen Tagen Probleme mit dem 450-Limit.
Hm. Limit. Also können.
Ich versuchs nochmal in eigenen Worten. Es werden pro Tag bis zu 450 Banner ausgeliefert. Insgesamt muss jedes Banner impressions mal ausgeliefert werden.
Dann habe ich mir gedacht, ich liefer einfach von Anfang an die 450 / Tag aus (verteilt auf die Banner die an diesem Tag online sind). Kann funktionieren, tut es aber meistens nicht.
Ist zwischen dem oben und unten ein inhaltlicher Break? Dann versteh ichs. Wenn nicht, dann nicht.
Bei den Beispiel-Bannern oben müsste ich z.B. ID4 anfangs nur in kleinen Mengen ausliefern, und am Ende dann mehr, da er dann der Einzige Banner ist, der im Jänner online ist.
Okay. Ich schätze das hier drüber ist die eigentliche Frage, wie man das eben gesagte...
Wäre, eurer Meinung nach, ein iterativer oder rekursiver Ansatz besser, und wie könnte man sowas umsetzen?
...konkret umsetzen kann oder sollte.
Richtig?
Freue mich über alle Tipps :)
Man muss die Verteilung in irgendeiner Form gewichten, abhängig vom Tag, vom Anzeigezeitraum der Banner und von der Zahl an Impressions, die erzeugt werden sollen.
Wie, darüber mach ich mir Gedanken, sobald du mir gesagt hast, ob ich dich richtig verstanden habe :)
Grüße,
RIDER
Aloha ;)
Ich würde gern helfen, aber ich verstehe die Problemstellung nicht genau. Ich versuch mal auszudrücken, was ich verstanden habe und was nicht.
$ads['id1'] = ['start' => '2014-11-10', 'end' => '2014-11-23', 'impressions' => 1000]; $ads['id2'] = ['start' => '2014-12-01', 'end' => '2014-12-16', 'impressions' => 1000]; $ads['id3'] = ['start' => '2014-12-08', 'end' => '2014-12-21', 'impressions' => 6000]; $ads['id4'] = ['start' => '2014-12-15', 'end' => '2015-01-20', 'impressions' => 20000];
Okay. Wir haben 4 Banner, die jeweils im Zeitraum von start bis end gezeigt werden sollen. Was genau meinst du mit impressions? Mir ist der Ausdruck in dieser Form nicht geläufig. Wikipedia meint, das könnte was mit "Abruf" zu tun haben (vergleiche Page Impression). Also, dann geh ich davon aus, dass die Banner in ihrem jeweiligen Zeitraum so oft angezeigt werden sollen, wie impressions sagt.
Genau, eine Impression heißt einfach, dass der Banner einmal angezeigt wurde.
Pro Tag können z.B. 450 Banner-Impressions ausgeliefert werden.
Können oder müssen? Irgendwie versteh ich das mit den Banner-Impressions wohl doch noch nicht ganz...
Das ist der maximal mögliche Wert. Weniger geht aber natürlich auch.
Wenn ich jetzt einfach die Impressions konstant über den Zeitraum verteile, gibt es an manchen Tagen Probleme mit dem 450-Limit.
Hm. Limit. Also können.
Ich versuchs nochmal in eigenen Worten. Es werden pro Tag bis zu 450 Banner ausgeliefert. Insgesamt muss jedes Banner impressions mal ausgeliefert werden.
Genau!
Dann habe ich mir gedacht, ich liefer einfach von Anfang an die 450 / Tag aus (verteilt auf die Banner die an diesem Tag online sind). Kann funktionieren, tut es aber meistens nicht.
Ist zwischen dem oben und unten ein inhaltlicher Break? Dann versteh ichs. Wenn nicht, dann nicht.
Bei den Beispiel-Bannern oben müsste ich z.B. ID4 anfangs nur in kleinen Mengen ausliefern, und am Ende dann mehr, da er dann der Einzige Banner ist, der im Jänner online ist.
Okay. Ich schätze das hier drüber ist die eigentliche Frage, wie man das eben gesagte...
Wäre, eurer Meinung nach, ein iterativer oder rekursiver Ansatz besser, und wie könnte man sowas umsetzen?
...konkret umsetzen kann oder sollte.
Richtig?
Freue mich über alle Tipps :)
Man muss die Verteilung in irgendeiner Form gewichten, abhängig vom Tag, vom Anzeigezeitraum der Banner und von der Zahl an Impressions, die erzeugt werden sollen.
Wie, darüber mach ich mir Gedanken, sobald du mir gesagt hast, ob ich dich richtig verstanden habe :)
Fast alles richtig verstanden :)
Aloha ;)
Also, perfekte Lösung hab ich keine, aber ich versuch mich mal an ein bisschen Brainstorming.
Okay. Ich fasse das Ganze mal als mathematisches Problem auf. Wenn wir das Problem komplett in entsprechenden Gleichungen abbilden können, haben wir gewonnen; wir müssen dann nur noch das Gleichungssystem lösen. Und den Algorithmus, den wir finden, in Programm-Code umsetzen.
Zunächst ist es so, dass wir keine Anzahl Banner 'idx' pro Tag je Tag brauchen, es genügt, eine Anzahl Banner 'idx' pro Tag je Zeitraum zu haben, sofern in allen Tagen der Zeiträume je die selben Bedingungen gelten. Also, schauen wir uns an, was für unterschiedliche Zeiträume (und mit was für Bannern und wie vielen Tagen) wir haben.
(Anm.: Ich nehme an, dass ein Banner sowohl am Start- als auch am Endtag noch gezeigt werden soll)
a.: 10.11.14 - 23.11.14 Banner: id1 ta = 14 [Tage]
b.: 01.12.14 - 07.12.14 Banner: id2 tb = 7
c.: 08.12.14 - 14.12.14 Banner: id2,id3 tc = 7
d.: 15.12.14 - 16.12.14 Banner: id2,id3,id4 td = 2
e.: 17.12.14 - 21.12.14 Banner: id3,id4 te = 5
f.: 22.12.14 - 20.01.15 Banner: id4 tf = 30
Wir wollen ermitteln die Werte a1,...,a4,...,f1,...f4, die die Menge an Bannern des Typs id1 ... id4 angeben, die in den Zeiträumen a,...,f pro Tag ausgeliefert werden sollen. Seien imp1,...,imp4 die Gesamtmenge an ausgelieferten Bannern des jeweiligen Typs. Weiterhin können pro Tag maximal 450 Banner ausgeliefert werden. Es ergeben sich die folgenden Gleichungen:
(1) a1 * ta = imp1
(2) b2 * tb + c2 * tc + d2 * td = imp2
(3) c3 * tc + d3 * td + e3 * te = imp3
(4) d4 * td + e4 * te + f4 * tf = imp4
(5) a1 <= 450
(6) b2 <= 450
(7) c2 + c3 <= 450
(8) d2 + d3 + d4 <= 450
(9) e4 + e4 <= 450
(10) f4 <= 450
Damit hätten wir ein Gleichungssystem. Wenn es die optimale Verteilung gibt, wird das Gleichungssystem lösbar sein.
Ansonsten muss man sich irgendwie einer möglichst guten Lösung annähern. Das kann u.U. auch kompliziert werden. Vielleicht finden wir dafür aber auch noch eine Lösung.
Z.B. kann man die Komplexität reduzieren, indem man (wie hier die a1) alle von den anderen disjunkten Gleichungen herausnimmt (da die ja sowieso schon feststehen).
Die größten Probleme macht sicherlich das "<=" in Gleichungen 5-10. Auch dafür muss man sich was überlegen. Man könnte versuchen, statt dem "<=" ein "=" zu verwenden. Dann versucht man die imp zu variieren um eine Lösung zu erhalten.
Schwierig.
Helfen dir die Gedanken weiter?
Zur Lösung von Gleichungssystemen in PHP gibts wohl fertige Lösungen, z.B. sowas. Vielleicht ist eine davon so gut, dass sie auch mit den "<=" umgehen kann. Mich würds wundern, wenns für dieses "mathematische" Problem keine Lösung geben sollte... (außer das ganze wäre gar nicht berechenbar, was ich aber nicht glaube)
Grüße,
RIDER
Aloha ;)
Wenn sich der "korrekte" Algorithmus, den ich genannt habe, als zu schwer oder gar vollkommen unpraktikabel zu implementieren erweist, könnte man ihn an der ein oder anderen Stelle verstümmeln, um relativ effizient an nicht ganz so (aber hoffentlich noch annehmbar) optimierte Ergebnisse zu kommen.
(1) a1 * ta = imp1 (2) b2 * tb + c2 * tc + d2 * td = imp2 (3) c3 * tc + d3 * td + e3 * te = imp3 (4) d4 * td + e4 * te + f4 * tf = imp4 (5) a1 <= 450 (6) b2 <= 450 (7) c2 + c3 <= 450 (8) d2 + d3 + d4 <= 450 (9) e4 + e4 <= 450 (10) f4 <= 450
Z.B. kann man die spezielle Struktur der Gleichungen ausnutzen. Betrachten wir das eigentliche LGS mal losgelöst vom Tageslimit:
(1) a1 * ta = imp1 (2) b2 * tb + c2 * tc + d2 * td = imp2 (3) c3 * tc + d3 * td + e3 * te = imp3 (4) d4 * td + e4 * te + f4 * tf = imp4
Wir haben hier im Allgemeinen mehr Gleichungen als Variablen. Es ergibt sich also je eine Lösung abhängig von x (hier nur 1) Parametern.
Wir sehen weiterhin, dass das LGS eine Art Stufenform hat - das ist durch die Problemstellung bedingt und wird immer so (oder mindestens so ähnlich) aussehen.
Wir können das Programm dann Werte für die x Parameter durchlaufen lassen und überprüfen, welche Parameterkombination am ehesten <= 450 in jedem Zeitraum ergibt. Wenn man die Parameter einigermaßen "intelligent" durchlaufen lässt (also zuerst grobmaschig und dann bei Annäherung an das Tageslimit bzw. dessen Überschreitung stattdessen "feiner" weitermachen). Abbruch des Ganzen am besten nach einer fixen Zahl von Iterationen. Man könnte dann in einem Array die ausprobierten Parameter-Sets so abspeichern, dass der Index dem durchschnittlichen Abstand zu 450 entspricht. Array nach Indizes sortieren lassen und schwuppdiwupp, hat man das Bestmögliche der ausprobierten Parametersets.
Grüße,
RIDER
Hi,
danke erstmal für die Gedanken dazu :)
Wir können das Programm dann Werte für die x Parameter durchlaufen lassen und überprüfen, welche Parameterkombination am ehesten <= 450 in jedem Zeitraum ergibt. Wenn man die Parameter einigermaßen "intelligent" durchlaufen lässt (also zuerst grobmaschig und dann bei Annäherung an das Tageslimit bzw. dessen Überschreitung stattdessen "feiner" weitermachen). Abbruch des Ganzen am besten nach einer fixen Zahl von Iterationen. Man könnte dann in einem Array die ausprobierten Parameter-Sets so abspeichern, dass der Index dem durchschnittlichen Abstand zu 450 entspricht. Array nach Indizes sortieren lassen und schwuppdiwupp, hat man das Bestmögliche der ausprobierten Parametersets.
Das wird wahrscheinlich für mich die beste Lösung werden. Bei meinen genannten Beispiel-Bannern würde es zwar auch mit der ersten Variante funktionieren, das liegt aber daran, das keine komplette Auslastung in diesem Zeitraum vorliegt.
Ich schau mir das jetzt mal in PHP an :)
MFG Naps
Hi, ein paar Sachen noch :)
(1) a1 * ta = imp1 (2) b2 * tb + c2 * tc + d2 * td = imp2 (3) c3 * tc + d3 * td + e3 * te = imp3 (4) d4 * td + e4 * te + f4 * tf = imp4 (5) a1 <= 450 (6) b2 <= 450 (7) c2 + c3 <= 450 (8) d2 + d3 + d4 <= 450 (9) e4 + e4 <= 450 (10) f4 <= 450
Sollte es hier bei (0) nicht e3 + e4 <= 450 sein?
(1) a1 * ta = imp1 (2) b2 * tb + c2 * tc + d2 * td = imp2 (3) c3 * tc + d3 * td + e3 * te = imp3 (4) d4 * td + e4 * te + f4 * tf = imp4
Wir haben hier im Allgemeinen mehr Gleichungen als Variablen. Es ergibt sich also je eine Lösung abhängig von x (hier nur 1) Parametern.
Wie meinst du das "mehr Gleichungen als Variablen"? a1, b2, c2, d2, c3, d3, e3, d4, e4, f4 sind doch die Variablen oder?
MFG Naps
Aloha ;)
(1) a1 * ta = imp1 (2) b2 * tb + c2 * tc + d2 * td = imp2 (3) c3 * tc + d3 * td + e3 * te = imp3 (4) d4 * td + e4 * te + f4 * tf = imp4 (5) a1 <= 450 (6) b2 <= 450 (7) c2 + c3 <= 450 (8) d2 + d3 + d4 <= 450 (9) e4 + e4 <= 450 (10) f4 <= 450
Sollte es hier bei (0) nicht e3 + e4 <= 450 sein?
Ja, natürlich.
(1) a1 * ta = imp1 (2) b2 * tb + c2 * tc + d2 * td = imp2 (3) c3 * tc + d3 * td + e3 * te = imp3 (4) d4 * td + e4 * te + f4 * tf = imp4
Wir haben hier im Allgemeinen mehr Gleichungen als Variablen. Es ergibt sich also je eine Lösung abhängig von x (hier nur 1) Parametern. Wie meinst du das "mehr Gleichungen als Variablen"? a1, b2, c2, d2, c3, d3, e3, d4, e4, f4 sind doch die Variablen oder?
ups, natürlich andersrum. Mehr Variablen als Gleichungen. Deshalb bleibt ja überhaupt (mindestens) ein Parameter übrig ;)
Grüße,
RIDER
@@Camping_RIDER
Es ergeben sich die folgenden Gleichungen: (5) a1 <= 450
(6) b2 <= 450
(7) c2 + c3 <= 450
(8) d2 + d3 + d4 <= 450
(9) e4 + e4 <= 450
(10) f4 <= 450
Sind das Gleichungen?
Damit hätten wir ein Gleichungssystem.
Nö.
Von einem Mathelehrer würde ich doch aber erwarten, dass er Sinn von Unsinn unterscheiden kann. Wobei der Sinn manchmal in einer Gleichung besteht.[^1]
LLAP
Aloha ;)
Es ergeben sich die folgenden Gleichungen: (5) a1 <= 450
(6) b2 <= 450
(7) c2 + c3 <= 450
(8) d2 + d3 + d4 <= 450
(9) e4 + e4 <= 450
(10) f4 <= 450Sind das Gleichungen?
Ich gebs ja zu ;) Es sind _Un_gleichungen :)
Wobei das auch nicht so recht stimmt, dem Wort nach kann man als Ungleichung nur bezeichnen, was nicht gleich ist, also z.B. mit "<" auskommt. Das "<=" stört da also auch wieder. Demnach sind das eigentlich Kleiner-Gleich-Ungen :D
Von einem Mathelehrer würde ich doch aber erwarten, dass er Sinn von Unsinn unterscheiden kann. Wobei der Sinn manchmal in einer Gleichung besteht.[^1]
Philosophisch ;) Ich werde dann in Zukunft dazu übergehen, das ein (Un-)Gleichungssystem zu nennen :P Stellt sich dann nur noch die Frage, ob diese exakte Formulierung (un-)wichtig ist :P
Grüße,
RIDER
@@Camping_RIDER
dem Wort nach kann man als Ungleichung nur bezeichnen, was nicht gleich ist, also z.B. mit "<" auskommt. Das "<=" stört da also auch wieder.
Die Wikipedia sieht das anders. Was nichts heißen muss; ist sich der Artikel dochh selbst nicht einig, ob es nun 4 oder 5 Zeichen sind, die dazwischen stehen können, d.h. ob a ≠ b nun eine Ungleichung ist.
Ob „a ungleich b“ eine Ungleichung ist. Keine Pointe.
LLAP