Диссертация (Модели и алгоритмы поддержки адаптивного управления пожарной безопасностью нефтегазовых объектов), страница 20
Описание файла
Файл "Диссертация" внутри архива находится в папке "Модели и алгоритмы поддержки адаптивного управления пожарной безопасностью нефтегазовых объектов". PDF-файл из архива "Модели и алгоритмы поддержки адаптивного управления пожарной безопасностью нефтегазовых объектов", который расположен в категории "". Всё это находится в предмете "технические науки" из Аспирантура и докторантура, которые можно найти в файловом архиве АГПС. Не смотря на прямую связь этого архива с АГПС, его также можно найти и в других разделах. , а ещё этот архив представляет собой кандидатскую диссертацию, поэтому ещё представлен в разделе всех диссертаций на соискание учёной степени кандидата технических наук.
Просмотр PDF-файла онлайн
Текст 20 страницы из PDF
$marker->id . '" ';$table.= 'lat="' . $marker->lat . '" ';$table.= 'lng="' . $marker->lng . '" ';$table.= 'Risk="' . $marker->Risk . '" ';$table.= 'type="' . $marker->type . '" ';$table.= 'distance="' . $marker->distance . '" ';$table.= '/>';}$table.= '</markers>';return $table;}public function actionGeneticsearch($obj_id){set_time_limit(5);require 'PHPThreads/RollingCurl.php';require 'PHPThreads/Request.php';$link="".$_SERVER['HTTP_HOST']."/index.php?r=optimisation/startgeneticsearch&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();149}//Мутацияprivate function mutation($individuals, $ind_per, $gens_percent, $params) {//Определяем будущих мутантов$mutants_count=ceil(count($individuals)*$ind_per/100);for($i=0;$i<count($individuals);$i++){ $mutants[]=$i; }shuffle($mutants);//Метод инцеста(чем ближе родство тем больше мутацияif($params['incest']==true){$gens_per=$individuals[0]['similarity']*100;}else{$gens_per=$gens_percent;}if($gens_per>100){$gens_per=100;}if($gens_per<$gens_percent){$gens_per=$gens_percent;}//Метод неоднородной мутации$count_x_bits=strlen($individuals[0]['x']);$count_y_bits=strlen($individuals[0]['y']);if($params['heterogeneous']==true && $params['population_number']!=1){$start_x_point=round(1+($params['population_number']1)/($params['op_count']+1-1)*($count_x_bits-1));$start_y_point=round(1+($params['population_number']1)/($params['op_count']+1-1)*($count_y_bits-1));}else{$start_x_point=1;$start_y_point=1;}//Определяем общее количество мутирующих генов а так же в хи в у хромосомах по-отдельности$x_mutation_times=ceil(($count_x_bits-$start_x_point+1)*$gens_per/100);$y_mutation_times=ceil(($count_y_bits-$start_y_point+1)*$gens_per/100);$muttion_bits_count=$x_mutation_times+$y_mutation_times;for($i=0;$i<$mutants_count;$i++){for($l=$start_x_point;$l<=$count_x_bits;$l++){ $X_bits[]=$l; }shuffle($X_bits);for($l=$start_y_point;$l<=$count_y_bits;$l++){ $Y_bits[]=$l; }shuffle($Y_bits);for($j=0;$j<$muttion_bits_count;$j++){150if($j<$x_mutation_times){$part='x';$bits=$X_bits;$bit_num=$j;}else{$part='y';$bits=$Y_bits;$bit_num=$j-$x_mutation_times;}$bit=$bits[$bit_num];$arr[0] = mb_substr($individuals[$mutants[$i]][$part], 0,$bit-1);if(mb_substr($individuals[$mutants[$i]][$part], $bit-1,1)==1){$arr[1] = substr($individuals[$mutants[$i]][$part], $bit-1, 0).'0';}else{$arr[1] = substr($individuals[$mutants[$i]][$part], $bit-1, 0).'1';}# берек конец слова (после символа с ударением)$arr[2] = substr($individuals[$mutants[$i]][$part],$bit);$individuals[$mutants[$i]][$part]=implode($arr);}}# соединяем это все по порядку и возвращаемreturn $individuals;}//Функция конвертации в любой тип данныхprivate function convBase($numberInput, $fromBaseInput, $toBaseInput){if ($fromBaseInput==$toBaseInput) return $numberInput;$fromBase = str_split($fromBaseInput,1);$toBase = str_split($toBaseInput,1);$number = str_split($numberInput,1);$fromLen=strlen($fromBaseInput);$toLen=strlen($toBaseInput);$numberLen=strlen($numberInput);151$retval='';if ($toBaseInput == '0123456789'){$retval=0;for ($i = 1;$i <= $numberLen; $i++)$retval = bcadd($retval, bcmul(array_search($number[$i-1], $fromBase),bcpow($fromLen,$numberLen-$i)));return $retval;}if ($fromBaseInput != '0123456789')$base10=$this->convBase($numberInput, $fromBaseInput, '0123456789');else$base10 = $numberInput;if ($base10<strlen($toBaseInput))return $toBase[$base10];while($base10 != '0'){$retval = $toBase[bcmod($base10,$toLen)].$retval;$base10 = bcdiv($base10,$toLen,0);}return $retval;}private function population_gen($maxX, $maxY, $count){$i=0;while($i<$count){$individual[$i]['x']=$this->convBase(rand(1,$maxX), '0123456789','01');$individual[$i]['y']=$this->convBase(rand(1,$maxY), '0123456789','01');$i++;}return $individual;}private function full_bin_number($number, $bits){if(strlen($number)<$bits){$zeros_count=$bits-strlen($number);$i=0;while($i<$zeros_count){$number='0'.$number;$i++;}152}return $number;}private function to_real_string($gen_string,$params, $axis){if($axis=='x'){$real_string=ceil($gen_string*$params['w']/pow(2,$params['countXbits']));}if($axis=='y'){$real_string=ceil($gen_string*$params['h']/pow(2,$params['countYbits']));}return $real_string;}private function roulette_wheel($individuals){//Находим наименьший элемент$min=$individuals[0]['goal'];foreach($individuals as $individual){if($min>$individual['goal']){$min=$individual['goal'];}}//Функция соответсвия$F=0;foreach($individuals as $key=>$individual){$F=$F+$individual['goal']-$min;}if($F!=0){//"Вероятность отбора<br>";foreach($individuals as $key=>$individual){$individuals[$key]['Pk']=($individual['goal']-$min)/$F;}//"Совокупная вероятность<br>";foreach($individuals as $key=>$individual){$i=0;$individuals[$key]['qk']=0;while($i<=$key)153{$individuals[$key]['qk']=$individuals[$key]['qk']+$individuals[$i]['Pk'];$i++;}}//Крутим рулетку$i=0;$new_popultion=Array();while(count($new_popultion)<count($individuals)){$r=$this->random_float(0,1);foreach($individuals as $key=>$individual){if($key==0 && $individual['qk']>=$r){$new_popultion[]=$individual;break;}elseif($key!=0){if($individual['qk']>=$r){$new_popultion[]=$individual;break;}}}$i++;}}else//Рулетка когда шансы равны{foreach($individuals as $individual){$new_popultion[]=$individuals[rand(0,count($individuals)-1)];}}return $new_popultion;}private function connection($popultion, $percent){154$new_population=Array();$connection_count=count($popultion)*$percent/100;for($i=0;$i<count($popultion);$i++){if($connection_count>$i){$parent1=rand(0, count($popultion)-1);$parent2=rand(0, count($popultion)-1);if($parent1==$parent2){while($parent1==$parent2) $parent2=rand(0, count($popultion)-1); }$r=rand(0,1);if($r==0){$connection_point=rand(0,strlen($popultion[$parent1]['x']));$new_population[$i]['x']=substr($popultion[$parent1]['x'],0,$connection_point).''.substr($popultion[$parent2]['x'],$connection_point);$new_population[$i]['y']=$popultion[$parent2]['y'];similar_text($new_population[$i]['x'], $new_population[$i]['y'], $similarity);$new_population[$i]['similarity']=$similarity;}else{$new_population[$i]['x']=$popultion[$parent1]['x'];$connection_point=rand(0,strlen($popultion[$parent1]['y']));$new_population[$i]['y']=substr($popultion[$parent1]['y'],0,$connection_point).''.substr($popultion[$parent2]['y'],$connection_point);similar_text($new_population[$i]['x'], $new_population[$i]['y'], $similarity);$new_population[$i]['similarity']=$similarity;}}else{$new_population[$i]['x']=$popultion[$parent1]['x'];$new_population[$i]['y']=$popultion[$parent1]['y'];similar_text($new_population[$i]['x'], $new_population[$i]['y'], $similarity);$new_population[$i]['similarity']=$similarity;155}}return $new_population;}public function actionStartgeneticsearch($obj_id, $project_id){$project = Projects::findOne(['id' => $project_id]);if($project->status<2){die();}else{Yii::$app->session['project_id']=$project_id;//$this->set_status(1, $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;$min_lat = FacilityZones::find()->select('min(lat)')->scalar();$min_lng = FacilityZones::find()->select('min(lng)')->scalar();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_lat = FacilityZones::find()->select('max(lat)')->scalar();$max_lng = FacilityZones::find()->select('max(lng)')->scalar();$max_x=Calc::calculateTheDistance($min_lng, 0, $max_lng, 0)/$K;$max_y=Calc::calculateTheDistance($min_lat, 0, $max_lat, 0)/$K;$params['w']=$max_x;$params['h']=$max_y;$params['ind_count']=round(sqrt($max_x+$max_y)*1.5);$params['countXbits']=ceil(log($params['w'], 2));$params['countYbits']=ceil(log($params['h'], 2));$params['op_count']=($params['countXbits']+$params['countYbits'])*2;$params['per_con']=90; //Сколько процентов будут спариваться$params['maxX']=pow(2,$params['countXbits']);156$params['maxY']=pow(2,$params['countYbits']);$params['incest']=true; //метод инцеста$params['population_number']=1;$params['heterogeneous']=false;//неоднородная мутация$goal=0;$first=true;$massive=Array();$obj_scenarios=Array();$all_individuals=Array();//Генерация првоначальной популяции$i=0;while($i<$params['ind_count']){$individuals[$i]['x']=$this->full_bin_number($this->convBase(rand(1,$params['maxX']), '0123456789', '01'),$params['countXbits']);$individuals[$i]['y']=$this->full_bin_number($this->convBase(rand(1,$params['maxY']), '0123456789', '01'),$params['countYbits']);$i++;}$i=0;while($i<$params['op_count']){//Вычисление целевой функцииforeach($individuals as $key=>$individual){$meters_x=$this->convBase($individual['x'], '01','0123456789');$meters_y=$this->convBase($individual['y'], '01','0123456789');$cords=$this->convert_to_cord($min_lat, $min_lng, $this>to_real_string($meters_x,$params,'x'),$this->to_real_string($meters_y,$params,'y'),$K);if(isset($calculated_points[$individual['x']][$individual['y']])){$individuals[$key]['goal']=$calculated_points[$individual['x']][$individual['y']];}else{if($this->checkpointinobjterrirory($cords['lat'],$cords['lng'], $project_id)===true){$model=new Optimisation;$model->proj_id=$project_id;$model->lat=$cords['lat'];157$model->lng=$cords['lng'];$tank = Tanks::findOne(array('proj_id' => $project_id, 'id'=>$obj_id));if($tank!== null){$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);$calculated_points[$individual['x']][$individual['y']]=$risk['goal'];//удаляем объект с картыMapObjects::findOne(['proj_id' => Yii::$app->session['project_id'], 'id'=>$object->id])->delete();$massive=$risk['massive'];$model->Risk=$risk['goal'];$individuals[$key]['goal']=$model->Risk;$first=false;$model->type='genetic';$model->save();}else{$individuals[$key]['goal']=0;}}}$all_individuals=array_merge ($all_individuals, $individuals );//Крутим колесо$individuals=$this->roulette_wheel($individuals);158$individuals=$this->connection($individuals, $params['per_con']);$individuals=$this->mutation($individuals,50,20, $params);$params['population_number']++;$i++;}$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);sleep(10);Optimisation::deleteAll(['proj_id' => $project_id]);Yii::$app->session->destroy();ini_set('memory_limit', '1');return 'end';}public function goal_function($project_id, $K, $massive=Array(), $object_lat,$object_lng){//Устанавливам объект на карту//summ - summ of risks values//G - count of accectable risks values$G=0;$Q=0;$A=0;$B=0;$C=0;$D=0;$acceptableSocial=0.000001;$acceptableResidentialInd=0.00000001;$acceptableResidential=0.0000001;$social_risks=false;$residential_risks=false;$people_count=0;$socials = SocialObjects::find()->where(['proj_id' => $project_id,'on_map'=>1])->all();$residential_objects=ResidentialObjects::find()->where(['proj_id' => $project_id, 'on_map'=>1])->all();foreach($socials as $social)// row159{$D=$D+CalcWord::calculateTheDistance($object_lat, $object_lng, $social>lat, $social->lng)/$K;$people=PeopleInSocial::find()->where(['social_id' => $social->id])->all();foreach($people as $key=>$person)// row{$result=Risk::set_potencial_risk($social->lat, $social->lng, $K,$massive);$massive=$result['massive'];$Ind_rs=$result['risk']*$person->probability;$Q=$Q+$Ind_rs;if($Ind_rs<=$acceptableSocial){$G++;}$people_count++;}}foreach($socials as $social)// row{$people=PeopleInSocial::find()->where(['social_id' => $social->id])>all();foreach($people as $key=>$person)// row{$social_risks=true;if($key==0){$first_val=($acceptableSocial-$Ind_rs)/$acceptableSocial;}else{$A=$A+ABS($first_val-($acceptableSocial-$Ind_rs)/$acceptableSocial);}}}foreach($residential_objects as $key=>$residential)// row{$D=$D+CalcWord::calculateTheDistance($object_lat, $object_lng, $residential->lat, $residential->lng)/$K;$residential_risks=true;$result=Risk::set_potencial_risk($residential->lat, $residential->lng,$K, $massive);$massive=$result['massive'];160$Ind_rs=$result['risk'];$Q=$Q+$Ind_rs;if($Ind_rs<=$acceptableResidentialInd){$G++;}if($social_risks==true){$B=$B+ABS($first_val-($acceptableResidentialInd-$Ind_rs)/$acceptableResidentialInd);}else{if($key==0){$first_val=($acceptableResidentialInd-$Ind_rs)/$acceptableResidentialInd;}else{$B=$B+ABS($first_val-($acceptableResidentialInd-$Ind_rs)/$acceptableResidentialInd);}}}$social_risk=Risk::set_residential_risk($K);$Q=$Q+$social_risk;if($social_risk<=$acceptableResidential){$G++;}if(isset($first_val) && ($people_count>1 or count($residential_objects)>0)){$C=$C+ABS($first_val-($acceptableResidential-$social_risk)/$acceptableResidential);$F=($A+$B+$C)/($people_count+count($residential_objects));}else{$F=0;}$goal=$G-1/$D-$Q-$Q*$F;//отдаем результат$result['massive']=$massive;$result['goal']=$goal;return $result;}161private function checkpointinobjterrirory($lat,$lng, $project_id){$zones_on_map = FacilityZones::find()->where(['proj_id' => $project_id])->groupBy('zone_id');if($zones_on_map->count()>0){$zones_on_map = FacilityZones::find()->where(['proj_id' => $project_id])->groupBy('zone_id')->all();foreach ($zones_on_map as $map_zone){$i=0;$zone_cords = FacilityZones::find()->where(['proj_id' =>$project_id, 'zone_id' => $map_zone->zone_id])->orderBy('num')->all();foreach ($zone_cords as $zone_cord){$x[$i]=$zone_cord->lat;$y[$i]=$zone_cord->lng;$i++;}$x[$i]=$x[0];$y[$i]=$y[0];$k=$i;$i=0;$count_intersection=0;while($i<$k){$x3=min($x[$i], $x[$i+1]);if($x3==$x[$i]) { $y3=$y[$i+1]; } else { $y3=$y[$i]; }$a = ($x[$i] - $lat) * ($y[$i+1] - $y[$i]) - ($x[$i+1] $x[$i]) * ($y[$i] - $lng);$b = ($x[$i+1] - $lat) * ($y3 - $y[$i+1]) - ($x3 $x[$i+1]) * ($y[$i+1] - $lng);$c = ($x3 - $lat) * ($y[$i] - $y3) - ($x[$i] - $x3) *($y3 - $lng);if(($lng>min($y[$i], $y[$i+1])) && ($lng<max($y[$i],$y[$i+1])) && ($lat<=$x3 || ($a >= 0 && $b >= 0 && $c >= 0) || ($a <= 0 && $b <=0 && $c <= 0))){$count_intersection++;}$i++;}//до этого момента идет расчет кол-ва пересеченийif ($count_intersection & 1){return true;}}162return false;}else{return false;}}163Приложение Д.
Акты внедрения164165.