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
Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar meist Mittwochs ab 21 Uhr im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de). # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[