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

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

Модератор: immortal

Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

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

Сообщение Alex » Сб дек 08, 2012 6:08 pm

Протестировал.

Обновил файл index.php через RapidSVN. Новый код на месте. В результате все графики перестали строиться вообще. Вместо них — битые картинки.

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

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

Сообщение Alex » Вс дек 09, 2012 12:40 am

Отчёт о тестировании в 3-х частях

Начну с хороших новостей. Новый файл я запустил, всё работает.

Игра несомненно стоит свеч. Посмотрите на загрузку со старым файлом и с новым. Комментарии излишни.
Вложения
m.png
cpu
m.png (17.4 КБ) 7522 просмотра
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

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

Сообщение Alex » Вс дек 09, 2012 12:41 am

Теперь о грустном. У нового алгоритма, мягко говоря, гигантские проблемы с линейностью шкалы времени. А у старого всё в порядке с этим.
Вложения
nl_old.png
old
nl_old.png (3.47 КБ) 7522 просмотра
nl.png
nl
nl.png (3.43 КБ) 7522 просмотра
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

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

Сообщение Alex » Вс дек 09, 2012 12:43 am

Ещё грустные новости. То, что он показывает, имеет очень небольшое отношение к реальности. Пока это температура на луне и доверять тому, что он рисует нельзя.

Но, учитывая показания загрузки процессора, доделать новый алгоритм надо обязательно.
Вложения
gold.png
old
gold.png (32.58 КБ) 7522 просмотра
gnew.png
new
gnew.png (43.68 КБ) 7522 просмотра
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

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

Сообщение Alex » Вс дек 09, 2012 10:01 am

Посмотрел я повнимательнее. Всё не так страшно. Нужно исправить всего одну небольшую ошибку.

У нового алгоритма проблема с тем, что когда данные с сенсоров не поступают (три прямые горизонтальные площадки на старом графике), от берёт значения (10:15, 10:19, 10:23...) идущие сразу после площадки и растягивает их в «прошлое» на всю ширину площадки. Отсюда «нелинейность» времени и «волны» с неправильной амплитудой вместо ровных линий.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

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

Сообщение Alex » Вс дек 09, 2012 10:34 pm

Посмотрел ещё повнимательнее и обнаружил ещё проблемы.

- когда мало точек — иногда не выдаёт время на шкале

- алгоритм не работает на непериодических сигналах. А PIR сенсоры и датчики открывания — это источники непериодических сигналов.


Что сделано. Соорудил жуткого монстра, но этот код решает все выявленные проблемы.

- Решена проблема с площадками на графике, правда ценой введения параметра $period_refresh=70. Это для датчиков с периодом обновления в 1 минуту. Для других периодов надо задавать другое значение. И, наверное, передавать его через параметры вызова графиков.

- Решена проблема с не выдачей времени на шкале.

- Решена проблема с «нелинейностью» времени.

- Решена проблема с отображением непериодических сигналов (параметр &prec=1). Алгоритм _не_пропускает_ни одного_ срабатывания датчика (даже длительностью в 1 сек.) и отображает факт срабатывания датчика на графике.

Ну и конечно фантастическая скорость и минимальная загрузка процессора.

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

  if ($total>0) {
   $px=0;
   $px_passed=0;
   $dt=date('Y-m-d', $start_time);

   $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");

   $total=count($history);
   $itm=0;

   $t1=date('H:i', $start_time);
   $t2=date('H:i', $end_time);
   $period_refresh=70;
   $not_empty=0;
   $tmp=0;
   $delta_time = $end_time - $start_time;
   
   if ($_GET['prec']=='1') {
     $prec=1;
   } else {
       $prec=0;
     }  
   
 if ($prec==0){
   
   for($i=0; $i<$total; $i++) {
     $unx = $history[$i]['UNX'];
	 
     if ($unx >= $start_time || $i==0) {
	   $not_empty=1;
	   if (($unx >= $start_time && $unx <= $start_time+$period_refresh) || $i==0) {
         $values[$itm] = (float)$history[$i]['VALUE'];
		 $tmp=$values[$itm];
       }else{
	      $values[$itm] = $tmp;
        }	   
		
       $itm++;
	   $temp_time=$start_time;
       $start_time+=$period;
	   
       if ($px_passed > 40) {
         if (date('Y-m-d', $unx)!=$dt) {
           $hours[] = date('d/m', $unx);
           $dt = date('Y-m-d', $unx);
         } else {
             $hours[] = date('H:i', $temp_time);
           }
         $px_passed=0;
       } else {
           $hours[]='';
         }
       $px += $px_per_point;
       $px_passed += $px_per_point;
     }
   }

   if ($not_empty==0){
	 $values[0] = 0; 
     $hours[0] = $t1;
     $values[2] = 0; 
     $hours[2] = $t2;
   }    
   
 } else { // end if ($prec==0)

//---------------------------- Precesion  

   $ar=0;
   $u=0;
   $wid=$w-90;
   $shk=$wid/10;
   $shk2=$delta_time/10;
  
   for($z=0; $z<$wid; $z++) {
     $values[$z] = 0;
	 if ($z==$shk*$u) {
	   $hours[$z]=date('H:i', $start_time+$shk2*$u);
	   $u++;
	 } else {
	     $hours[$z]="";
       }
   }//end for $z
 
   for($i=0; $i<$total; $i++) {
     $unx = $history[$i]['UNX'];
	 $sm=$unx-$start_time;
	 $k=$delta_time/$sm;
	 $ar=$wid/$k;
	 
	 if ($values[$ar]==0){
	   $values[$ar] = (float)$history[$i]['VALUE'];
	 }
   }//end for $i

 }//end if ($prec==0) else
   
   $DataSet->AddPoint($values,"Serie1");  
   $DataSet->AddPoint($hours,"Serie3");  

   } else {

   $DataSet->AddPoint(0,"Serie1");
   $DataSet->AddPoint(0,"Serie3");
  } //end if ($total>0)
Вложения
nps.png
prec
nps.png (19.57 КБ) 7512 просмотров
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

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

Сообщение sergejey » Пн дек 10, 2012 11:03 am

Alex, здорово! Обязательно сегодня поразбираюсь и обновлю основную ветку :)

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

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

Сообщение Urbas81 » Пн дек 10, 2012 1:00 pm

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

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

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

От температурного датчика идут сигналы с периодом, к примеру, в 1 минуту. А от PIR сенсора или датчика открывания двери 1 раз в час или 1 раз в день. Это и есть непериодические сигналы. Причём PIR сенсор может выдать сигнал всего в 1-2 секунды, который старый алгоритм просто может пропустить. Если это охранный датчик, а на графике всё спокойно, то это, сами понимаете, не дело. :)

А на графике срабатывание датчиков присутствия и датчика открывания двери.
Urbas81
Сообщения: 289
Зарегистрирован: Вс сен 16, 2012 9:39 am
Благодарил (а): 0
Поблагодарили: 1 раз

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

Сообщение Urbas81 » Пн дек 10, 2012 3:42 pm

Я так и думал. спасибо. А старой код, я так понимаю, мог не пропустить данный сигнал.
Причём PIR сенсор может выдать сигнал всего в 1-2 секунды, который старый алгоритм просто может не пропустить.
Ответить