Эффективность алгоритма

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Эффективность алгоритма

Сообщение sergejey » Пн дек 10, 2012 4:41 pm

Alex, расскажи пожалуйста чуть подробнее про параметры
$period_refresh
&prec=1

я бы хотел от них по возможности избавиться -- может быть можно по истории данных вычислять их, а не задавать пользователю?

в старой версии есть тоже такой параметр как px (минимальное количество пискелей через которые отбражается новое значение на графике), который тоже не очень интуитивно понятный, но он не обязательный и можно обходиться дефолтным значением, если не нужно особо оптимизировать.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Эффективность алгоритма

Сообщение Alex » Пн дек 10, 2012 7:07 pm

Alex, расскажи пожалуйста чуть подробнее про параметры
$period_refresh
&prec=1

я бы хотел от них по возможности избавиться
Я тоже. :)

С $period_refresh всё просто. Поскольку мы имеем массив отсортированных, но не отмасштабированных по времени точек, то они равномерно заполняют всю ось времени, А $period_refresh вставляет «предыдущее» значение, если за период $period_refresh не пришло нового сигнала (датчик в реальности не работал). Т. е. «растягивает» ось времени на моменты, когда сигналов не было.

Можно, наверное, сделать как во второй части — сначала «растянуть» ось времени на ширину $wid, а потом понавтыкать точек пропорционально реальному времени.

С &prec=1 сложнее. Это отдельный алгоритм, несовместимый с первой частью. У меня есть подозрение, что совместить обе части можно на основе именно второй. Тогда и &prec=1 не понадобится.

Если не нужно ничего отображать кроме температуры можно вообще отказаться от второй части. Многие даже не заметят. :)
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Эффективность алгоритма

Сообщение Alex » Ср дек 12, 2012 10:48 am

Потестировал несколько дней новый алгоритм. Как ни странно, но всё работает нормально. :)

Приделал второй канал. Никаких проблем. Всё работает. Загрузка минимальная. Без труда можно сделать 3-4-5-6-7 каналов и всё будет тянуть.

Почищу код и попозже выложу.
Вложения
duo.png
duo
duo.png (10.56 КБ) 7844 просмотра
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Эффективность алгоритма

Сообщение sergejey » Ср дек 12, 2012 11:51 am

Отлично!
У самого пока времени заняться этим нет, так что с радостью поставлю финальный код в проект :)

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Эффективность алгоритма

Сообщение sergejey » Ср дек 19, 2012 12:34 pm

Я тут ещё одну версию алгоритма набросал... Может у кого будет возможность проверить :)
На моих графиках вроде показывает адекватные значения. Графики получаются без обрывов -- если данных не поступало, то будет прямая линия, соответствующая последнему известному значению. По идее работает одинаково для любых типов данных.

Код: Выделить всё

   $history=SQLSelect("SELECT ID, VALUE, UNIX_TIMESTAMP(ADDED) as UNX FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' AND ADDED>=('".date('Y-m-d H:i:s', $start_time)."') AND ADDED<=('".date('Y-m-d H:i:s', $end_time)."') ORDER BY ADDED");
   $value=$history[0]['VALUE'];
   $next_index=1;
   $total_values=count($history);

   while($start_time<$end_time) {
     if ($next_index<$total_values) {
      for($i=$next_index;$i<$total_values;$i++) {
       $next_index=$i;
       if ($history[$i]['UNX']>=$start_time) {
        $value=$history[$i]['VALUE'];
        break;
       }
      }
     }
     $values[]=$value;
     if ($px_passed>30) {
      if (date('Y-m-d', $start_time)!=$dt) {
       $hours[]=date('d/m', $start_time);
       $dt=date('Y-m-d', $start_time);
      } else {
       $hours[]=date('H:i', $start_time);
      }
      $px_passed=0;
     } else {
      $hours[]='';
     }
     $start_time+=$period;
     $px+=$px_per_point;
     $px_passed+=$px_per_point;
   }

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
tammat
Сообщения: 165
Зарегистрирован: Пт янв 20, 2012 3:05 pm
Благодарил (а): 9 раз
Поблагодарили: 1 раз

Re: Эффективность алгоритма

Сообщение tammat » Ср дек 19, 2012 1:29 pm

@Alex
Выложи код для построения нескольких графиков на одной картинке
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Эффективность алгоритма

Сообщение Alex » Ср дек 19, 2012 1:31 pm

Протестировал. Площадки нормальные, графики правильные. Это хорошо.

Выявленные проблемы. Непериодические сигналы отображаются по другому и иногда теряются. Т. е. сигнал был, а на графике его нет. Почему так пока не копал.

Почему то с новым алгоритмом перестали показываться графики на одной из страниц. Хотя должны бы. Может быть дело в параметрах вызова, пока не разобрался.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Эффективность алгоритма

Сообщение Alex » Ср дек 19, 2012 1:49 pm

@Alex
Выложи код для построения нескольких графиков на одной картинке
Код сырой и вам придётся разбираться почему что не работает. Это задача для программиста. Если это не пугает, то могу выложить.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Эффективность алгоритма

Сообщение sergejey » Ср дек 19, 2012 2:23 pm

Alex писал(а):Протестировал. Площадки нормальные, графики правильные. Это хорошо.
Выявленные проблемы. Непериодические сигналы отображаются по другому и иногда теряются. Т. е. сигнал был, а на графике его нет. Почему так пока не копал.
Догадываюсь, почему могут пропускаться разовые сигналы -- алгоритм разбивает время на мелкие дискретные участки, соответствующие разрешению графика, и берёт последнее значение из базы на этом участке (либо первое, точно не помню). Вполне возможно, что на одном участке совсем рядом есть два значения -- скажем сначало 1, потом 0 и из-за этой особенности, итоговое значение на участке будет одно из них. Как вариант, оставлять максимальное зачение на участке (если их несколько).

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Эффективность алгоритма

Сообщение Alex » Ср дек 19, 2012 3:06 pm

Вполне возможно, что на одном участке совсем рядом есть два значения -- скажем сначала 1, потом 0 и из-за этой особенности, итоговое значение на участке будет одно из них.
А это нас не устраивает. Если это окажется 0, то мы пропустим сигнал.

Не лучше ли сначала растянуть массив на ширину графика, а потом втыкать ненулевые (значимые) отсчёты пропорционально времени. Гарантированно на график попадут _все_ значения. Потерять в этом случае ничего не получится, даже если очень захотеть.

И вообще...

Наверное не надо делать универсальный модуль графики. Нужно под каждую задачу делать отдельный модуль. Например.

index.php - “аналоговые” графики
s.php – индикаторы
sign.php – сигнальный (PIR...) модуль
stat.php – модуль статистики
и т.д...
Ответить