Диссертация (1172883), страница 19
Текст из файла (страница 19)
– 2016. – С. 110-121.103. Топольский,Н.Г.Основыавтоматизированнойсистемыпожаровзрывобезопасности объектов [Текст] / Н.Г. Топольский. – М.:МИПБ МВД России, 1997. – 164 с.132Приложение А. Свидетельство о регистрации программы для ЭВМ – Геоинформационная исследовательская web-система управления пожарными рисками напроизводственных объектах "Firerisks"133Приложение Б. Свидетельство о регистрации программы для ЭВМ – Программаоптимизации комбинации мероприятий для управления пожарными рисками натерритории нефтегазовых объектов с использованием генетических алгоритмов134Приложение В. Свидетельство о регистрации программы для ЭВМ – Программа оптимизации расположения нового технологического аппарата на территории нефтеперерабатывающих объектов с использованием генетических алгоритмов135Приложение Г.
Листинг программного кодаpublic function actionMeasuresanalisis(){TempMeasures::deleteAll(['proj_id' => Yii::$app->session['project_id']]);$mesuares=Measures::find()->all();foreach($mesuares as $mesuare){switch ($mesuare->type){case "tank":$obj_massive=array();$i=0;$filters=unserialize($mesuare->filter);foreach($filters as $filter){switch ($filter['type']){case "object":$objects=Tanks::find()->andFilterWhere(['proj_id'=>Yii::$app->session['project_id']]);switch ($filter['operator']){case 'or':foreach($filter['values'] as $value){$objects->andFilterWhere(['or',$filter['parameter'],$value]);}break;case "and":foreach($filter['values'] as $value){$objects->andFilterWhere([$filter['parameter']=>$value]);}break;case "value":$objects->andFilterWhere([$filter['parameter']=>$filter['values']]);break;case "between":$objects->andFilterWhere(['between',$filter['parameter'],$filter['values'][0], $filter['values'][1]]);break;case "less":136$objects->andFilterWhere(['<', $filter['parameter'], $filter['values']]);break;case "more":$objects->andFilterWhere(['>', $filter['parameter'], $filter['values']]);break;}$objects=$objects->all();$new_massive=array();foreach($objects as $object){$new_massive[]=$object->id;}break;case "scenario":$objects=Tanks::find()->andFilterWhere(['proj_id'=>Yii::$app->session['project_id']])->all();$new_massive=array();foreach($objects as $object){$scanarios= Tree::find()->where(['obj_id'=>$object->id]);switch ($filter['operator']){case 'or':foreach($filter['values'] as $value){$scanarios->andFilterWhere(['or',$filter['parameter'],$value]);}break;case "and":foreach($filter['values'] as $value){$scanarios->andFilterWhere([$filter['parameter']=>$value]);}break;case "value":$scanarios->andFilterWhere([$filter['parameter']=>$filter['values']]);break;case "between":137$scanarios->andFilterWhere(['between',$filter['parameter'],$filter['values'][0], $filter['values'][1]]);break;case "less":$scanarios->andFilterWhere(['<',$filter['parameter'], $filter['values']]);break;case "more":$scanarios->andFilterWhere(['>',$filter['parameter'], $filter['values']]);break;}if($scanarios->count()>0){$new_massive[]=$object->id;}}break;}if($i!=0){$obj_massive=array_intersect($obj_massive,$new_massive);}else{$obj_massive=$new_massive;}$i++;//В конце получаем массив с объектами подходящими под данноерешение}foreach($obj_massive as $object){$temp_mesuares= new TempMeasures();$temp_mesuares->proj_id=Yii::$app->session['project_id'];$temp_mesuares->obj_id=$object;$temp_mesuares->obj_type='tank';$temp_mesuares->filter=$mesuare->filter;$temp_mesuares->solution=$mesuare->solution;$temp_mesuares->measure_id=$mesuare->id;$temp_mesuares->message=$mesuare->message;$temp_mesuares->save();138}break;public function First_population_measures(){$min=TempMeasures::find()->where(['proj_id'=>Yii::$app->session['project_id']])->min('goal');$F=0;$temp_mesuare=TempMeasures::find()->where(['proj_id'=>Yii::$app->session['project_id']])->all();//Общая функция соответсвияforeach($temp_mesuare as $measure){$result=$this->measureAssesment(Array($measure->id));$measure->goal=$result['goal'];$measure->save();}//Общая функция соответсвияforeach($temp_mesuare as $measure){$F=$F+$measure->goal-$min;}//Вероятность отбораforeach($temp_mesuare as $measure){$P[$measure->id]=($measure->goal-$min)/$F;}//Совокупная вероятность отбора каждого гена$temp_P=0;foreach($temp_mesuare as $measure){$q[$measure->id]=$P[$measure->id]+$temp_P;$temp_P=$q[$measure->id];}$limit_chromosomes=10;$limit_individuals=10;//Крутим рулетку$j=0;$new_popultion=Array();while($j<$limit_individuals){$i=0;$new_chromosome=Array();while($i<$limit_chromosomes){$key=0;139$r=$this->random_float(0,1);foreach($q as $id=>$qk){if($key==0 && $qk>=$r){$new_gen=$id;break;}elseif($key!=0){if($qk>=$r){$new_gen=$id;break;}}}//Добавляем только уникальные мероприятияif(!in_array($new_gen, $new_chromosome)){$new_chromosome[]=$new_gen;$i++;}}$j++;$new_popultion[]=$new_chromosome;}//Оценка всех комбинаций$i=1;foreach($new_popultion as $chromosome){$combination=new MeasuresComb;$combination->proj_id=Yii::$app->session['project_id'];$combination->iteration=$i;$combination->ids=serialize($chromosome);$result=$this->measureAssesment($chromosome);$combination->goal=$result['goal'];$combination->save();// Сохранить в базу данных (проект, номер итерации, массив идентификаторов, целевая функция);}$i++;}function random_float ($min,$max) {return ($min+lcg_value()*(abs($max-$min)));}140public function actionGeneticmeasures(){ini_set('memory_limit', '-1');ignore_user_abort(true);set_time_limit(0);$iterations=40;//Первая популяцияMeasuresComb::deleteAll(['proj_id' => Yii::$app->session['project_id']]);$this->First_population_measures();$it=0;while($it!=1){$last_iteration=MeasuresComb::find()->where(['proj_id'=>Yii::$app->session['project_id']])->max('iteration');$individuals=MeasuresComb::find()->where(['proj_id'=>Yii::$app->session['project_id'], 'iteration'=>$last_iteration])->asArray()->all();$individuals=$this->roulette_wheel($individuals);$individuals=$this->connection_measures($individuals, 90);$individuals=$this->mutation_measures($individuals, 30, 75);$individuals=$this->check_population($individuals); // удаляемдублирующиеся и замещающее мероприятияforeach($individuals as $chromosome){$combination=new MeasuresComb;$combination->proj_id=Yii::$app->session['project_id'];$combination->iteration=$last_iteration+1;$combination->ids=$chromosome['ids'];$result=$this->measureAssesment(unserialize($chromosome['ids']));$combination->goal=$result['goal'];$combination->save();if(count(unserialize($chromosome['ids']))===1){$it=1;}// Сохранить в базу данных (проект, номер иттерации, массив идентификаторов, целевая функция);}}}public function check_population($population){foreach($population as $individual){}return $population;}141public function actionTestgoal(){$project=Projects::find()->where(['id'=>Yii::$app->session['project_id']])>one();if(($substrate = Substrates::findOne(['proj_id' => Yii::$app->session['project_id']]))!= null){$K=$substrate->k;}else{$K=1;}$goal=$this->goal_function(Yii::$app->session['project_id'], $K, Array(), 0,0);echo$goal['goal'];}public function actionTestgoal2(){$temp_mesuare=TempMeasures::find()->where(['id'=>14])->one();$result=$this->measureAssesment(Array($temp_mesuare->id));echo $result['goal'];$temp_mesuare->save();}private function connection_measures($popultion, $percent){$new_population=Array();$connection_count=count($popultion)*$percent/100;for($i=0;$i<count($popultion);$i++){if($i<$connection_count){$parent1=$popultion[rand(0, count($popultion)-1)];$parent2=$popultion[rand(0, count($popultion)-1)];$parent1_crhom=unserialize($parent1['ids']);$parent2_crhom=unserialize($parent2['ids']);$exchange_point=rand(0,min(count($parent1_crhom),count($parent2_crhom)));$new_population[]['ids']=serialize(array_merge(array_slice($parent1_crhom, 0, $exchange_point), array_slice($parent2_crhom, $exchange_point)));}else142{$new_population[]['ids']=$popultion[$i]['ids'];}}return $new_population;}private function mutation_measures($population, $delete_chance, $change_chance){foreach($population as $key=>$individual){//Случайно стираем ген$chance=rand(1,100);if($chance<=$delete_chance){$population[$key]['ids']=unserialize($population[$key]['ids']);$population[$key]['ids']=array_slice($population[$key]['ids'], 0,count($population[$key]['ids'])-1);$population[$key]['ids']=serialize($population[$key]['ids']);}$chance=rand(1,100);if($chance<=$change_chance){$population[$key]['ids']=unserialize($population[$key]['ids']);$measures=TempMeasures::find()->where(['proj_id'=>Yii::$app->session['project_id']])->all();foreach($measures as $measure){$gens[]=$measure->id;}shuffle($gens);$i=0;$new_gen=$gens[$i];//while(in_array($new_gen,$population[$key]['ids'])){$i++;$new_gen=$gens[$i];}$population[$key]['ids'][rand(0,count($population[$key]['ids'])1)]=$new_gen;$population[$key]['ids']=serialize($population[$key]['ids']);}}return $population;}public function measureAssesment($measures)143{foreach($measures as $measure_id){$temp_mesuare=TempMeasures::find()->where(['proj_id'=>Yii::$app->session['project_id'], 'id'=>$measure_id])->one();$object=Tanks::find()->where(['id'=>$temp_mesuare->obj_id])->one();$project=Projects::find()->where(['id'=>Yii::$app->session['project_id']])->one();if(($substrate = Substrates::findOne(['proj_id' => Yii::$app->session['project_id']]))!= null){$K=$substrate->k;}else{$K=1;}switch($temp_mesuare->obj_type){case 'tank':$solution=unserialize($temp_mesuare->solution);switch($solution['type']){case "object":if(!isset($backups[$object->id][$solution['parameter']])){$backups[$object->id][$solution['parameter']]=$object->getAttribute($solution['parameter']);}$object->setAttribute($solution['parameter'], $this>change_parameter($solution['operator'],$object->getAttribute($solution['parameter']), $solution['value']));break;case "scenario":$scenarios=Tree::find()->where(['proj_id'=>Yii::$app>session['project_id']]);echo 'sc<br>';//Ищем сценарии, подходящие под условия для данного объекта, меняем их свойства и пересчитываемbreak;}break;}$object->save();144}$calc=new Calcword;//делаем расчет всех параметров для затронутых объектовforeach($backups as $obj_id=>$backup){$object=Tanks::find()->where(['id'=>$obj_id])->one();$calc->generateTableWord($project, $object, NULL, 0);$calc->calc_base($project, $object, 0, NULL);}$calc->setbase(false);//расчет с измененными параметрами$goal=$this->goal_function(Yii::$app->session['project_id'], $K, Array(), 0,0);//Откатываем объектыforeach($backups as $tank_id=>$backup){$object=Tanks::find()->where(['id'=>$tank_id])->one();foreach($backup as $parameter=>$value){$object->setAttribute($parameter, $value);}$object->save();}//Откатываем результаты расчетаforeach($backups as $obj_id=>$backup){$object=Tanks::find()->where(['id'=>$obj_id])->one();$calc->generateTableWord($project, $object, NULL, 0);$calc->calc_base($project, $object, 0, NULL);}return $goal;}public function change_parameter($operator, $val1, $val2){switch($operator){case 'multiply':$val=$val1*$val2;break;case 'divide':$val=$val1/$val2;break;case 'pow':$val=pow($val1,$val2);break;145case 'plus':$val=$val1+$val2;break;case 'minus':$val=$val1-$val2;break;case 'value':$val=$val2;break;}return $val;}public function actionSearchlocation($obj_id){set_time_limit(5);require 'PHPThreads/RollingCurl.php';require 'PHPThreads/Request.php';$link="".$_SERVER['HTTP_HOST']."/index.php?r=optimisation/standartmodelsearch&project_id=".Yii::$app->session['project_id']."&obj_id=$obj_id&secret_key=HDFNA";$rc = new \RollingCurl\RollingCurl();$rc->window_size = 1;$rc->get($link);$rc->addOptions(array(CURLOPT_TIMEOUT => 1,CURLOPT_CONNECTTIMEOUT => 1));$rc->execute();die();}public function convert_to_cord($min_lat, $min_lng, $x,$y,$K){$cord=array();$cord['lat']=($min_lat*60*60+$y*$K/30.86*sin(90 / 180.0 * M_PI))/3600;$cord['lng']=($min_lng*60*60+$x*$K/30.86*cos(0 / 180.0 * M_PI))/3600;return $cord;}public function show_distance_in_cords($min_cord, $distance,$K){$distance=($min_cord*60*60+$distance*$K/30.86*cos(0 / 180.0 *M_PI))/3600;return $distance;}public function actionStandartmodelsearch($obj_id, $project_id){$project = Projects::findOne(['id' => $project_id]);if($project->status<2){146die('Ошибка');}else{Yii::$app->session['project_id']=$project_id;Optimisation::deleteAll(['proj_id' => $project_id]);}ini_set('memory_limit', '-1');ignore_user_abort(true);set_time_limit(0);$min_lat=0;$min_lng=0;if(($substrate = Substrates::findOne(['proj_id' => $project_id]))!=null){$K=$substrate->k;}else{$K=1;}$max_lat=$substrate->width/3600;$max_lng=$substrate->height/3600;$max_x=Calc::calculateTheDistance($min_lng, 0, $max_lng, 0)/$K;$max_y=Calc::calculateTheDistance($min_lat, 0, $max_lat, 0)/$K;$step=5;$first=true;$y=0;$massive=Array();while($y<$max_y){$x=0;while($x<$max_x){$cords=$this->convert_to_cord($min_lat, $min_lng, $x,$y,$K);if($this->checkpointinobjterrirory($cords['lat'],$cords['lng'],$project_id)===true){$model=new Optimisation;$model->proj_id=$project_id;$model->lat=$cords['lat'];$model->lng=$cords['lng'];$tank = Tanks::findOne(array('proj_id' => $project_id,'id'=>$obj_id));if($tank!== null){147$object = new MapObjects;$object->lat = $cords['lat'];$object->lng = $cords['lng'];$object->proj_id = $project_id;$object->diking_id = 0;$object->type = 'tank';$object->obj_id = $obj_id;$object->count = 1;$object->icon_text = 'temp';$object->save();if($first==true){$calc=new Calc; $calc->setbase(false);}}else{die('Работа с несуществующим объектом');}$risk=$this->goal_function($project_id, $K, $massive, $object>lat, $object->lng);//удаляем объект с картыMapObjects::findOne(['proj_id' => Yii::$app->session['project_id'], 'id'=>$object->id])->delete();$massive=$risk['massive'];$model->Risk=$risk['goal'];$model->distance=$this->show_distance_in_cords($min_lng,$step,$K);$first=false;$model->type='standart';$model->save();}$x=$x+$step;}$y=$y+$step;}$maximum = Optimisation::find()->where(['proj_id' => $project_id])>where('risk=(SELECT max(risk) FROM optimisation WHERE proj_id='.$project_id.')')->one();$optimum=new Optimisation;$optimum->proj_id=$maximum->proj_id;$optimum->lat=$maximum->lat;$optimum->lng=$maximum->lng;$optimum->Risk=$maximum->Risk;$optimum->type='optimum';$optimum->save();$this->set_status(2, $project_id);148sleep(10);// Optimisation::deleteAll(['proj_id' => $project_id]);Yii::$app->session->destroy();ini_set('memory_limit', '1');return 'end';}public function actionLoadmarkers($id){Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;$headers = Yii::$app->response->headers;$headers->add('Content-Type', 'text/xml');$table= '<markers>';$markers=Optimisation::find()->where(['proj_id' => Yii::$app->session['project_id']])->andWhere(['>', 'id', $id])->OrderBy('id')->limit(1000)>all();foreach($markers as $marker){// ADD TO XML DOCUMENT NODE$table.= '<marker ';$table.= 'id="' .