Создание алгоритма сворачивания баннеров для поворота рекламы

Я работаю над созданием скрипта вращения рекламного баннера на основе показов, который равномерно отображает объявления в течение месяца. Расчеты будут выполняться каждый раз, когда объявление будет отображаться. Так что это будет сделано на лету. Объявления должны поворачиваться один за другим, а не показывать только одно объявление за 1000 показов, а затем другое объявление за 1000 показов. Он по большей части должен отображаться на 1 показ, затем переключать рекламу (если, конечно, у одного объявления больше впечатлений, чем у других).

Предположим, у меня есть 5 объявлений, и у каждого есть разные количества показов, которые были куплены, какова будет формула / как вы рекламируете рекламу? Я хочу сделать это на PHP.

Объявление №1: 1000 приобретенных показов

Объявление №2: 12 000 приобретенных показов

Объявление № 3: 3000 купленных показов

Объявление № 4: 20 000 купленных показов

Объявление № 5: 10 000 приобретенных показов

если есть несколько объявлений, которые купили 1000 показов всего за один и тот же временной интервал, он должен показывать один за другим до тех пор, пока не будут использованы показы. Хотя, я думаю, было бы хорошо, если бы человек купил 1000 показов за короткий промежуток времени, я должен учитывать это и показывать их быстрее. Я открыт для предложений.

Я думаю, вы должны использовать лучший тип алгоритма для лучшей JOB, я покажу вам немного возможностей о том, как реализовать такие

В моем текущем примере показано использование

  • шарканье
  • Тасование Фишера-Йетса
  • robinShuffle
  • ratioShuffle

Вы также можете реализовать

  • Перетасовка на основе призраков
  • Перемешивание временной базы
  • процент
  • Нажмите Shuffle
  • и т.д

Простое доказательство концепции

// Create Add Infroamtion $ads = array(); $ads[] = new Ad(10, "A.jpg", 2); $ads[] = new Ad(12, "B.gif", 3); $ads[] = new Ad(30, "C.png", 7); $ads[] = new Ad(20, "D.swf", 5); // Add ads to banner $banner = new Banner($ads); // You can also add addional ads $banner->add(new Ad(10, "E.swf")); echo "<pre>"; //Lets Emulate first 100 rotations for($i = 0; $i < 1000; $i ++) { // Select Algorithm $banner->randomise("ratioShuffle"); // Display Add echo $banner->getDisplay(), PHP_EOL; } 

Функция Simple Shuffle, которая может использоваться

 function fisherYatesShuffle(array &$items) { for($i = count($items) - 1; $i > 0; $i --) { $j = @mt_rand(0, $i); $tmp = $items[$i]; $items[$i] = $items[$j]; $items[$j] = $tmp; } } function robinShuffle(array &$items) { usort($items, function ($a, $b) { $a = $a->getDisplay(); $b = $b->getDisplay(); return $a == $b ? 0 : ($a < $b ? - 1 : 1); }); } function ratioShuffle(array &$items) { static $called = false; if ($called === false) { $ads = array(); foreach ( $items as &$ad ) { for($i = 0; $i < $ad->getRatio(); $i ++) { $ads[] = $ad; } } $called = true; $items = $ads; } shuffle($items); } 

Используемые классы

 class Ad implements JsonSerializable { private $impressions; private $media; private $ratio = 1; private $display = 0; function __construct($impressions, $media = null, $ratio = 1) { $this->impressions = $impressions; $this->media = $media; $this->ratio = $ratio; } function torch() { $this->impressions --; $this->display ++; } public function getImpression() { return $this->impressions; } public function getDisplay() { return $this->display; } public function getRatio() { return $this->ratio; } public function getMeadia() { return $this->media; } public function __toString() { return json_encode($this->jsonSerialize()); } public function jsonSerialize() { return get_object_vars($this); } } class Banner implements Countable, JsonSerializable { private $totalImpressions; private $ads = array(); function __construct(array $ads) { foreach ( $ads as $ad ) $this->add($ad); } public function add(Ad $ad) { $this->ads[] = $ad; $this->totalImpressions += $ad->getImpression(); } public function randomise($function = null) { if (is_callable($function, false, $callable_name)) { return $callable_name($this->ads); } else { return shuffle($this->ads); } } public function getDisplay() { foreach ( $this->ads as &$ad ) { if ($ad->getImpression() < 1) { unset($ad); continue; } $ad->torch(); break; } return isset($ad) ? $ad : null; } public function jsonSerialize() { $array = $this->ads; foreach ( $array as &$ad ) { $ad = $ad->jsonSerialize(); } return $array; } public function __toString() { return json_encode($this->jsonSerialize()); } function count() { return count($this->ads); } } с class Ad implements JsonSerializable { private $impressions; private $media; private $ratio = 1; private $display = 0; function __construct($impressions, $media = null, $ratio = 1) { $this->impressions = $impressions; $this->media = $media; $this->ratio = $ratio; } function torch() { $this->impressions --; $this->display ++; } public function getImpression() { return $this->impressions; } public function getDisplay() { return $this->display; } public function getRatio() { return $this->ratio; } public function getMeadia() { return $this->media; } public function __toString() { return json_encode($this->jsonSerialize()); } public function jsonSerialize() { return get_object_vars($this); } } class Banner implements Countable, JsonSerializable { private $totalImpressions; private $ads = array(); function __construct(array $ads) { foreach ( $ads as $ad ) $this->add($ad); } public function add(Ad $ad) { $this->ads[] = $ad; $this->totalImpressions += $ad->getImpression(); } public function randomise($function = null) { if (is_callable($function, false, $callable_name)) { return $callable_name($this->ads); } else { return shuffle($this->ads); } } public function getDisplay() { foreach ( $this->ads as &$ad ) { if ($ad->getImpression() < 1) { unset($ad); continue; } $ad->torch(); break; } return isset($ad) ? $ad : null; } public function jsonSerialize() { $array = $this->ads; foreach ( $array as &$ad ) { $ad = $ad->jsonSerialize(); } return $array; } public function __toString() { return json_encode($this->jsonSerialize()); } function count() { return count($this->ads); } } 

Как вы можете видеть, это пример … Просто попробуйте и сделайте свое решение гибким

Лично я бы уточнил, какой процент показов получил каждое объявление по сравнению с тем, сколько платят, и используйте это как шанс, что он не появится. Что-то вроде этого:

 $show = Array(); foreach($ads as $id=>$ad) { $show[$id] = ceil((1-$ad['impressions']/$ad['paid'])*100); } $total = array_sum($show); $rand = rand(1,$total); $winner = -1; do {$rand -= array_shift($show); $winner++;} while($rand && $show); $ad_to_display = $ads[$winner]; 

Например, рассмотрите четыре объявления: A, B, C и D. Все они заплатили за 1000 показов, но до сих пор A не повезло и получил нуль, в то время как у B и C было 500 показов, а у D было 999 ,

Это означало бы, что $show имеет эти значения для объявлений:

 A: ceil((1-0/1000)*100) = 100 B: ceil((1-500/1000)*100) = 50 C: ceil((1-500/1000)*100) = 50 D: ceil((1-999/1000)*100) = 1 

Таким образом, $total равна 201.

$rand может быть любым числом от 1 до 201 включительно. Скажем 141.

В этом случае мы начинаем наш цикл:

  • $rand -= 100 , теперь это 41. 41 правдиво, и у нас есть реклама.
  • $rand -= 50 , теперь это -9. Он достиг нулевого значения, поэтому закончите цикл.

Победитель $winner 1, который является рекламой B.