Lokalizace poruch v síti VN 
pomocí indikátorů poruch a lokátoru poruchy

Vstupní data sítě VN

Základní vstupní data o síti jsou uložena v matici “maticeSiteVstup” dle následujícího klíče:
	1. Každý řádek reprezentuje jeden úsek sítě (úsekem se myslí vedení, vypínač, odpínač, indiátor poruch, atd.)
	2.1 První sloupec reprezentuje počáteční uzel z něhož úsek vychází
	2.2 Druhý sloupec reprezentuje koncový uzel do něhož úsek ústí
	2.3 Třetí sloupec reprezentuje délku úseku [m]
	2.4 Čtvrtý sloupec reprezentuje jednotkový odpor úseku [Ohm/kilometr]
	2.5 Pátý sloupec reprezentuje popis úseku

Údaje o zapnutí/vypnutí úsečníků a vypínačů jsou uloženy v matici “maticeUSZapVyp”:
	1. Každý řádek reprezentuje jeden spínací prvkek sítě
	2.1 První sloupec obsahuje název prvku
	2.2 Druhý sloupec reprezentuje stav prvku (1-zapnuto, 0-vypnuto)
	
Informace z indikátorů poruch v matici “maticeIndikatoruVstup” ve formátu:
	1. Každý řádek reprezentuje jeden indikátor poruchy
	2.1 První sloupec reprezentuje počáteční uzel z něhož indikátor vychází (pro nesměrový se porucha vztahuje pouze k tomuto uzlu)
	2.2 Druhý sloupec reprezentuje koncový uzel do něhož indikátor ústí (tím je dána výchozí orientace indikátoru poruchy)
	2.3 Třetí sloupec reprezentuje aktuální směr indikace (1 = výchozí směr, -1 = opačný než výchozí směr, 0 = nesměrový indikátor)
	2.4 Čtvrtý sloupec udává stav indikátoru (1 = aktivní signalizace poruchy, 0 = bez poruchy)

Nakonec jsou vloženy tyto údaje:
	1. Uzel, do nějž je připojen lokátor poruch “poziceLokatoru” 
	2. Napájecí uzel sítě ”poziceNapajecihoUzlu”
	3. Impedanční vzdálenost poruchy [Ohm] “impVzdPoruch”

maticeSiteVstup=
{{1,2,1,0.2,"US_0000"},
{2,3,1,0.2,"Ind_poruch"},
{3,4,500,0.2,"Vedení kabel"},
{4,5,1,0.2,"US_4303"},
{5,6,348,0.2,"Vedení"},
{6,7,130,0.6,"Vedení"},
{7,8,1,0.2,"US_8578"},
{8,9,50,0.6,"Vedení"},
{6,10,220,0.2,"Vedení"},
{10,11,150,0.6,"Vedení"},
{11,12,1,0.2,"US_8579"},
{12,13,15,0.6,"Vedení"},
{10,14,59,0.2,"Vedení"},
{14,15,100,1,"Vedení"},
{15,16,1,0.2,"US_8580"},
{16,17,37,1,"Vedení"},
{14,18,320,0.2,"Vedení"},
{18,19,100,0.6,"Vedení"},
{19,20,1,0.2,"US_4591"},
{20,21,8,0.6,"Vedení"},
{18,22,104,0.2,"Vedení"},
{22,23,150,0.6,"Vedení"},
{23,24,1,0.2,"US_9006"},
{24,25,25,0.6,"Vedení"},
{22,26,240,0.2,"Vedení"},
{26,27,370,0.2,"Vedení"},
{27,28,1,0.2,"US_8581"},
{28,29,28,0.2,"Vedení"},
{26,30,460,0.2,"Vedení"},
{30,31,1,0.2,"US_4304"},
{31,65,15,0.2,"Vedení"},
{65,32,110,0.6,"Vedení"},
{32,66,1,0.2,"US_8582"},
{66,67,10,0.6,"Vedení"},
{36,65,150,0.2,"Vedení"},
{36,37,145,0.2,"Vedení"},
{37,38,1,0.2,"US_4302"},
{38,39,132,0.2,"Vedení"},
{39,40,130,0.6,"Vedení"},
{40,41,1,0.2,"US_8583"},
{41,46,18,0.6,"Vedení"},
{39,42,283,0.2,"Vedení"},
{42,43,150,0.6,"Vedení"},
{43,44,1,0.2,"US_8584"},
{44,45,23,0.6,"Vedení"},
{42,47,630,0.2,"Vedení"},
{47,48,40,0.6,"Vedení"},
{48,49,1,0.2,"US_10285"},
{49,50,107,0.6,"Vedení"},
{47,51,431,0.2,"Vedení"},
{51,52,40,0.6,"Vedení"},
{52,53,1,0.2,"US_8586"},
{53,54,22,0.6,"Vedení"},
{51,55,50,0.6,"Vedení"},
{55,56,1,0.2,"US_4276"},
{56,57,350,0.6,"Vedení"},
{57,58,1,0.2,"US_8585"},
{58,59,10,0.6,"Vedení"},
{36,60,330,0.2,"Vedení"},
{60,61,1,0.2,"US_4301"},
{61,62,15,0.2,"Vedení"},
{62,63,60,0.6,"Vedení"},
{63,64,1,0.2,"US_4277"},
{64,33,260,0.6,"Vedení"},
{33,34,1,0.2,"US_8588"},
{34,35,10,0.6,"Vedení"},
{62,68,879,0.2,"Vedení"},
{68,69,42,0.6,"Vedení"},
{69,70,1,0.2,"US_8587"},
{70,71,12,0.6,"Vedení"},
{68,72,130,0.2,"Vedení"},
{72,73,1,0.2,"US_4370"},
{73,74,1,0.2,"Ind_poruch"},
{62,75,50,0.2,"Vedení"},
{75,76,50,1,"Vedení"},
{76,77,1,0.2,"US_8589"},
{77,78,18,1,"Vedení"},
{75,79,50,0.2,"Vedení"},
{79,80,50,1,"Vedení"},
{80,81,1,0.2,"US_8590"},
{81,82,13,1,"Vedení"},
{79,83,70,0.2,"Vedení"},
{83,84,60,1,"Vedení"},
{84,85,1,0.2,"US_8591"},
{85,86,9,1,"Vedení"},
{83,87,69,0.2,"Vedení"},
{87,88,77,0.6,"Vedení"},
{88,89,1,0.2,"US_8592"},
{89,90,16,0.6,"Vedení"},
{87,91,370,0.2,"Vedení"},
{91,92,128,0.6,"Vedení"},
{92,93,1,0.2,"US_8593"},
{93,94,10,0.6,"Vedení"},
{91,95,24,0.2,"Vedení"},
{95,134,14,0.6,"Vedení"},
{134,96,1,0.2,"US_4632"},
{96,97,332,0.6,"Vedení"},
{97,98,1,0.2,"US_8594"},
{98,99,10,0.6,"Vedení"},
{95,100,115,0.2,"Vedení"},
{100,101,34,0.6,"Vedení"},
{101,102,1,0.2,"US_8595"},
{102,103,9,0.6,"Vedení"},
{100,104,138,0.2,"Vedení"},
{104,105,120,0.6,"Vedení"},
{105,106,1,0.2,"US_8596"},
{106,107,10,0.6,"Vedení"},
{104,108,95,0.2,"Vedení"},
{108,109,103,0.6,"Vedení"},
{109,110,1,0.2,"US_8597"},
{110,111,10,0.6,"Vedení"},
{108,112,380,0.2,"Vedení"},
{112,113,78,0.6,"Vedení"},
{113,114,1,0.2,"US_10286"},
{114,115,13,0.6,"Vedení"},
{112,116,200,0.2,"Vedení"},
{116,117,215,0.6,"Vedení"},
{117,118,5,0.6,"Vedení"},
{118,119,1,0.2,"US_1113"},
{119,120,112,0.5,"Vedení kabel"},
{117,121,8,0.6,"Vedení"},
{121,122,1,0.2,"US_1112"},
{122,123,100,0.5,"Vedení kabel"},
{116,126,536,0.2,"Vedení"},
{126,127,128,0.6,"Vedení"},
{126,128,18,0.2,"Vedení"},
{127,131,48,0.6,"Vedení"},
{131,132,1,0.2,"US_10288"},
{132,133,14,0.6,"Vedení"},
{127,136,78,0.6,"Vedení"},
{136,137,1,0.2,"US_10287"},
{128,124,1,0.4,"US_4374"},
{124,125,1,0.2,"Ind_poruch"},
{125,180,14,0.2,"Vedení"},
{180,129,149,0.6,"Vedení"},
{129,130,1,0.2,"US_8598"},
{130,135,15,0.6,"Vedení"},
{180,138,344,0.2,"Vedení"},
{138,139,1,0.2,"US_4626"},
{139,140,84,0.2,"Vedení"},
{140,141,55,0.6,"Vedení"},
{141,142,1,0.2,"US_4160"},
{142,143,359,0.6,"Vedení"},
{143,144,1,0.2,"US_8599"},
{144,145,15,0.6,"Vedení"},
{140,146,103,0.2,"Vedení"},
{146,147,195,0.6,"Vedení"},
{147,148,1,0.2,"US_8600"},
{148,149,14,0.6,"Vedení"},
{146,150,79,0.6,"Vedení"},
{150,151,1,0.2,"US_8601"},
{151,152,7,0.6,"Vedení"},
{146,153,450,0.2,"Vedení"},
{153,154,263,0.6,"Vedení"},
{154,155,1,0.2,"US_8602"},
{155,156,13,0.6,"Vedení"},
{153,157,105,0.2,"Vedení"},
{157,158,1,0.2,"US_4161"},
{158,159,93,0.2,"Vedení"},
{159,160,150,0.6,"Vedení"},
{160,161,1,0.2,"US_8603"},
{161,162,12,0.6,"Vedení"},
{159,163,13,0.2,"Vedení"},
{163,164,1,0.2,"US_4181"},
{164,165,150,0.2,"Vedení"},
{165,166,75,0.6,"Vedení"},
{166,167,1,0.2,"US_8612"},
{167,168,8,0.6,"Vedení"},
{165,169,53,0.2,"Vedení"},
{169,170,25,0.6,"Vedení"},
{170,171,1,0.2,"US_4162"},
{171,172,215,0.6,"Vedení"},
{172,173,1,0.2,"US_8613"},
{173,174,10,0.6,"Vedení"},
{169,175,260,0.2,"Vedení"},
{175,176,1,0.2,"US_4625"},
{176,177,240,0.2,"Vedení kabel"},
{177,178,1,0.2,"US_4623"},
{178,179,7,0.2,"Vedení"},
{179,181,140,1,"Vedení"},
{181,182,1,0.2,"US_8615"},
{182,183,14,0.1,"Vedení"},
{179,184,144,1,"Vedení"},
{184,185,1,0.2,"US_10131"},
{185,186,140,1,"Vedení kabel"},
{179,187,232,0.2,"Vedení"},
{187,188,176,1,"Vedení"},
{188,189,1,0.2,"US_8616"},
{189,190,14,1,"Vedení"},
{187,191,140,0.2,"Vedení"},
{191,192,74,1,"Vedení"},
{192,193,1,0.2,"US_8617"},
{193,194,20,1,"Vedení"},
{191,195,8,0.2,"Vedení"},
{195,196,1,0.2,"US_4186"},
{196,197,89,0.2,"Vedení"},
{197,198,10,1,"Vedení"},
{198,199,1,0.2,"US_4187"},
{199,200,340,1,"Vedení"},
{200,201,1,0.2,"US_8618"},
{201,202,20,1,"Vedení"},
{197,203,223,0.2,"Vedení"},
{203,204,187,1,"Vedení"},
{204,205,1,0.2,"US_8619"},
{205,206,32,1,"Vedení"},
{203,207,140,0.2,"Vedení"},
{207,208,183,1,"Vedení"},
{208,209,1,0.2,"US_8620"},
{209,210,15,1,"Vedení"},
{207,211,407,0.2,"Vedení"},
{211,212,20,1,"US_8621"},
{212,213,1,0.2,"Vedení"},
{213,214,109,1,"Vedení"},
{211,215,154,0.2,"Vedení"},
{215,216,113,1,"Vedení"},
{216,217,140,0.2,"US_8622"},
{217,218,13,1,"Vedení"},
{215,219,25,0.2,"Vedení"},
{219,220,1,0.2,"US_4400"},
{220,221,1,0.2,"Ind_poruch"},
{221,222,135,0.2,"Vedení"},
{159,223,34,0.2,"Vedení"},
{223,224,1,0.2,"US_4387"},
{224,225,1,0.2,"Ind_poruch"},
{225,226,154,0.2,"Vedení"},
{226,227,34,1,"Vedení"},
{226,228,333,0.2,"Vedení"},
{228,229,234,1,"Vedení"},
{229,230,1,0.2,"US_8604"},
{230,231,24,1,"Vedení"},
{228,232,452,0.2,"Vedení"},
{232,233,112,1,"Vedení"},
{233,234,1,0.2,"US_8605"},
{234,235,12,1,"Vedení"},
{232,236,302,0.2,"Vedení"},
{236,237,17,1,"Vedení"},
{237,238,1,0.2,"US_8606"},
{238,239,166,1,"Vedení"},
{236,240,182,0.2,"Vedení"},
{240,241,16,1,"Vedení"},
{241,242,1,0.2,"US_8608"},
{242,243,167,1,"Vedení"},
{240,244,303,0.2,"Vedení"},
{244,245,108,1,"Vedení"},
{245,246,1,0.2,"US_8607"},
{246,247,8,1,"Vedení"},
{244,248,99,0.2,"Vedení"},
{248,249,86,1,"Vedení"},
{249,250,1,0.2,"US_8610"},
{250,251,11,1,"Vedení"},
{248,252,286,0.2,"Vedení"},
{252,253,126,1,"Vedení"},
{253,254,1,0.2,"US_8611"},
{254,255,18,1,"Vedení"},
{252,256,193,1,"Vedení"},
{256,257,60,1,"Vedení"},
{257,258,1,0.2,"US_8609"},
{258,259,13,1,"Vedení"},
{256,260,8,1,"Vedení"},
{260,262,1,0.2,"US_1319"},
{262,263,103,1,"Vedení kabel"},
{263,264,1,0.2,"US_1315"},
{264,265,6,1,"Vedení"},
{256,266,9,1,"Vedení"},
{266,267,1,0.2,"US_1318"},
{267,268,135,1,"Vedení kabel"},
{268,269,70,1,"Vedení kabel"},
{269,270,1,0.2,"US_1316"},
{270,271,9,1,"Vedení"},
{268,272,120,1,"Vedení"},
{272,273,1,0.2,"US_1317"},
{273,261,10,1,"Vedení"}
};
maticeUSZapVyp ={
{"US_0000",1},
{"US_4303",1},
{"US_8578",1},
{"US_8579",1},
{"US_8580",1},
{"US_4591",1},
{"US_9006",1},
{"US_8581",1},
{"US_4304",1},
{"US_8582",1},
{"US_4302",1},
{"US_8583",1},
{"US_8584",1},
{"US_10285",1},
{"US_8586",1},
{"US_4276",1},
{"US_8585",1},
{"US_4301",1},
{"US_4277",1},
{"US_8588",1},
{"US_8587",1},
{"US_4370",1},
{"US_8589",1},
{"US_8590",1},
{"US_8591",1},
{"US_8592",1},
{"US_8593",1},
{"US_4632",1},
{"US_8594",1},
{"US_8595",1},
{"US_8596",1},
{"US_8597",1},
{"US_10286",1},
{"US_1113",1},
{"US_1112",1},
{"US_4303",1},
{"US_10287",1},
{"US_10288",1},
{"US_4374",1},
{"US_4626",1},
{"US_8598",1},
{"US_4160",1},
{"US_8599",1},
{"US_8600",1},
{"US_8601",1},
{"US_8602",1},
{"US_4161",1},
{"US_8603",1},
{"US_4181",1},
{"US_8612",1},
{"US_4162",1},
{"US_8613",1},
{"US_4625",1},
{"US_4623",1},
{"US_10131",1},
{"US_8615",1},
{"US_8616",1},
{"US_8617",1},
{"US_4186",1},
{"US_4187",1},
{"US_8618",1},
{"US_8619",1},
{"US_8620",1},
{"US_8621",1},
{"US_8622",1},
{"US_4400",1},
{"US_4387",1},
{"US_8604",1},
{"US_8605",1},
{"US_8606",1},
{"US_8607",1},
{"US_8608",1},
{"US_8609",1},
{"US_8610",1},
{"US_8611",1},
{"US_1318",1},
{"US_1319",1},
{"US_1315",1},
{"US_1316",1},
{"US_1317",1}
};
maticeIndikatoruVstup=
{{2,3,0,1},
{73,74,0,0},
{124,125,0,1},
{220,221,0,0},
{224,225,0,0}
};

poziceLokatoru=1;
poziceNapajecihoUzlu=1;
impVzdPoruchy=1.5; (*Ohm*)

Grafické zobrazení sítě VN

Zobrazí pro přehled topologii sítě VN spolu s informacemi o jednoltivých úsecích. Délka úseků nerespektuje jejich fyzickou ani impedanční vzálenost.

(*naplnění matice "maticeGrafDisp" pro zobrazení grafu*)
maticeGrafDisp=ConstantArray[∞,{Max[maticeSiteVstup[[All,{1,2}]]],Max[maticeSiteVstup[[All,{1,2}]]]}];
usekyPopis={};
For[n=1,n≤Length[maticeSiteVstup],n++,
If[StringTake[maticeSiteVstup[[n,5]],2]=="US",
If[maticeUSZapVyp[[Position[maticeUSZapVyp,maticeSiteVstup[[n,5]]][[1,1]],2]]==1,
maticeGrafDisp[[maticeSiteVstup[[n,1]],maticeSiteVstup[[n,2]]]]=(maticeSiteVstup[[n,3]]*maticeSiteVstup[[n,4]]);
maticeGrafDisp[[maticeSiteVstup[[n,2]],maticeSiteVstup[[n,1]]]]=(maticeSiteVstup[[n,3]]*maticeSiteVstup[[n,4]]);
usekyPopis=Append[usekyPopis,maticeSiteVstup[[n,1]]\[UndirectedEdge]maticeSiteVstup[[n,2]]->Placed[maticeSiteVstup[[n,5]],{0.5,{0,1}}]];
],
maticeGrafDisp[[maticeSiteVstup[[n,1]],maticeSiteVstup[[n,2]]]]=(maticeSiteVstup[[n,3]]*maticeSiteVstup[[n,4]]);
maticeGrafDisp[[maticeSiteVstup[[n,2]],maticeSiteVstup[[n,1]]]]=(maticeSiteVstup[[n,3]]*maticeSiteVstup[[n,4]]);
]
];

(*formátování skupin úseků grafu*)
usekyUS=Table[If[StringTake[maticeSiteVstup[[i,5]],2]=="US",UndirectedEdge[maticeSiteVstup[[i,1]],maticeSiteVstup[[i,2]]]],{i,1,Length[maticeSiteVstup]}];
usekyIndZap=Table[If[maticeIndikatoruVstup[[i,4]]==1,UndirectedEdge[maticeIndikatoruVstup[[i,1]],maticeIndikatoruVstup[[i,2]]]],{i,1,Length[maticeIndikatoruVstup]}];
usekyIndVyp=Table[If[maticeIndikatoruVstup[[i,4]]==0,UndirectedEdge[maticeIndikatoruVstup[[i,1]],maticeIndikatoruVstup[[i,2]]]],{i,1,Length[maticeIndikatoruVstup]}];

(*zobrazení sítě pomocí grafu*)
grafSite=HighlightGraph[WeightedAdjacencyGraph[maticeGrafDisp,(*GraphLayout->{"RadialEmbedding"},*)(*VertexLabels->Table[i->Placed["Name",Above],{i,1,Length[maticeGrafDisp]}],VertexLabelStyle->Directive[Black,12],*)
EdgeLabels->usekyPopis,VertexSize->0.1 ],{Style[usekyUS,Thickness[0.005],Blue],Style[usekyIndZap,Thickness[0.005],Darker[Green]],Style[usekyIndVyp,Thickness[0.005],Lighter[Red]]}]

Nalezení potencionálních poruchových úseků z informací indikátorů poruch

Algoritmus nalezení možných poruchových úseků z informací indikátorů poruch funguje následujícím způsobem:
	1. Všechny uzly sítě jsou postupně testovány, zda splňují vymezení dle informací z indikátorů poruch
	2. Uzly jsou sdruženy dle oblastí ohraničených indikátory poruch - uzly v jedné oblasti shodně vyhovují či nevyhovují vymezení dle indikátorů poruch
	3. Za tímto účelem je pro každý uzel vytvořena posloupnost cest z tohoto uzlu do ostatních uzlů
	4. V případě, že u jednoho uzlu z oblasti dojde k označení zda vyhovuje, či nevyhovuje vymezení dle indikátorů poruch, všechny již prozkoumané uzly z této oblasti jsou zařazeny do stejné kategorie vyhovuje/nevyhovuje v poli “polePoruchaIndikator”

(* vytvoření maticeSous - vážená matice Sousednosti sítě*)
maticeSous=ConstantArray[0,{Max[maticeSiteVstup[[All,{1,2}]]],Max[maticeSiteVstup[[All,{1,2}]]]}];
For[n=1,n≤Length[maticeSiteVstup],n++,
maticeSous[[maticeSiteVstup[[n,1]],maticeSiteVstup[[n,2]]]]=(maticeSiteVstup[[n,3]]*maticeSiteVstup[[n,4]]/1000);
maticeSous[[maticeSiteVstup[[n,2]],maticeSiteVstup[[n,1]]]]=(maticeSiteVstup[[n,3]]*maticeSiteVstup[[n,4]]/1000);
]
(*úprava topologie sítě o vypnuté prvky*)
For[m=1,m≤Length[maticeUSZapVyp],m++,
If[maticeUSZapVyp[[m,2]]==0,
maticeSous[[maticeSiteVstup[[Position[maticeSiteVstup,maticeUSZapVyp[[m,1]]][[1,1]],1]],maticeSiteVstup[[Position[maticeSiteVstup,maticeUSZapVyp[[m,1]]][[1,1]],2]]]]=0;
maticeSous[[maticeSiteVstup[[Position[maticeSiteVstup,maticeUSZapVyp[[m,1]]][[1,1]],2]],maticeSiteVstup[[Position[maticeSiteVstup,maticeUSZapVyp[[m,1]]][[1,1]],1]]]]=0;
]
];

(*inicializace proměnných polí*)
polePoruchaIndikator={}; (*pole, do nějž bude zapsán seznam uzlů s možnou poruchou dle indikátorů poruch*)
poleNePoruchaIndikator={};  (*pole, do nějž bude zapsán seznam uzlů bez poruchy dle indikátorů poruch*)
usekyMoznaPorucha={}; (*pole s úseky na nichž může být porucha*)
usekyPopisMoznaPorucha={}; (*pole s úseky na nichž může být porucha ve formátu vhodném pro grafický výstup*)
sledCest={}; (*pole do nějž se postupně zapisují uzly přip prohledávání sítě*)
sledCestOdNapajece={{poziceNapajecihoUzlu}}; (*inicializace pole pro zjištění všech možných cest v síti*)

(*určí všechny cesty směrem od napaječe pro rozhodování dle informací z nesměrových indikátorů*)
For[k=1,k≤Length[sledCestOdNapajece],k++,
konecnyUzel=1;
For[m=1,m<=Length[maticeSous],m++,
(*prochází maticeSous a přidává následné uzly*)
If[maticeSous[[sledCestOdNapajece[[k,Length[sledCestOdNapajece[[k]]]]],m]]>0&&Length[Position[sledCestOdNapajece[[k]],m]]==0,

sledCestOdNapajece=Append[sledCestOdNapajece,Append[sledCestOdNapajece[[k]],m]];
konecnyUzel=0
]
];
If[konecnyUzel==0,
(*vymaže již prohledaný úsek*)
sledCestOdNapajece=Delete[sledCestOdNapajece,k];
(*resetuje proměnnou*)
k--
]
];


(*cyklus procházející všechny uzly ze vstupní matice*)
For[x=1,x≤Length[maticeSiteVstup],x++,
zaraditUsek=1; (*proměnná rozhodující o zařazení úseku do pole bez poruchy nebo s poruchou*)
If[Length[Position[poleNePoruchaIndikator,x]]>0||Length[Position[polePoruchaIndikator,x]]>0,(*uzel je již zařazen*),
(*uzel ještě nebyl zařazen do kategorie s poruchou/bez poruchy*)
If[Length[Position[Flatten[sledCestOdNapajece],x]]==0,
(*uzel není v napájené části sítě*)
zaraditUsek=0,
(*uzel je v napájené části sítě*)

(*definice výchozího uzlu pro sledCest*)
sledCest={{x}};

(*projde všechny navazující úseky v síti a přidává je do sledCest*)
For[k=1,k<=Length[sledCest],k++,
konecnyUzel=1;
For[m=1,m<=Length[maticeSous],m++,
(*prochází maticeSous kde není 0*)
If[maticeSous[[sledCest[[k,Length[sledCest[[k]]]]],m]]>0&&Length[Position[sledCest[[k]],m]]==0,
(*zjistí zda daný úsek - kombinace 2 uzlů je indikátor poruchy*)
If[Length[Position[maticeIndikatoruVstup[[All,{1,2}]],sledCest[[k,Length[sledCest[[k]]]]]]]>0&&Length[Position[maticeIndikatoruVstup[[All,{1,2}]],m]]>0&&Length[Intersection[Position[maticeIndikatoruVstup[[All,{1,2}]],m][[All,{1}]],Position[maticeIndikatoruVstup[[All,{1,2}]],sledCest[[k,Length[sledCest[[k]]]]]][[All,{1}]]]]>0,
(*proměnná sloužící k ukončení cyklu hledání odpovídajícího indikátoru poruch*)
ukonciCyklusHledaniInd=0;
(*cyklus heldající odpovídající indikátor poruch*)
For[j=1,j<=Length[maticeIndikatoruVstup],j++,
If[(maticeIndikatoruVstup[[j,1]]==sledCest[[k,Length[sledCest[[k]]]]]&&maticeIndikatoruVstup[[j,2]]==m)||(maticeIndikatoruVstup[[j,2]]==sledCest[[k,Length[sledCest[[k]]]]]&&maticeIndikatoruVstup[[j,1]]==m),

If[maticeIndikatoruVstup[[j,3]]==0,
(*jedná se o nesměrový indikátor*)
If[maticeIndikatoruVstup[[j,4]]==0,
(*nesměrový indikátor stav bez aktivní signalizace poruchy*)
For[n=1,n<=Length[sledCestOdNapajece],n++,
If[Length[Position[sledCestOdNapajece[[n]],m]]>0&&Length[Position[sledCestOdNapajece[[n]],sledCest[[k,Length[sledCest[[k]]]]]]]>0,
If[Position[sledCestOdNapajece[[n]],m][[1,1]]>Position[sledCestOdNapajece[[n]],sledCest[[k,Length[sledCest[[k]]]]]][[1,1]],
(*signalizace dle indikátoru je ok -> může být poruchový úsek*)
ukonciCyklusHledaniInd=1;
Break[]
,
(*signalizace dle idikátoru není ok -> nemůže být poruchový úsek*)
zaraditUsek=0;
ukonciCyklusHledaniInd=1;
Break[]
]
]
],
(*nesměrový indikátor stav s aktivní signalizací poruchy*)
For[n=1,n<=Length[sledCestOdNapajece],n++,
If[Length[Position[sledCestOdNapajece[[n]],m]]>0&&Length[Position[sledCestOdNapajece[[n]],sledCest[[k,Length[sledCest[[k]]]]]]]>0,
If[Position[sledCestOdNapajece[[n]],m][[1,1]]<Position[sledCestOdNapajece[[n]],sledCest[[k,Length[sledCest[[k]]]]]][[1,1]],
(*signalizace dle indikátoru je ok -> může být poruchový úsek*)
ukonciCyklusHledaniInd=1;
Break[]
,
(*signalizace dle idikátoru není ok -> nemůže být poruchový úsek*)
ukonciCyklusHledaniInd=1;
zaraditUsek=0;
Break[]
]
]
]
],
(*jedná se o směrový indikátor*)
If[maticeIndikatoruVstup[[j,4]]==0,
(*směrový indikátor stav bez aktivní signalizace poruchy*)
For[n=1,n<=Length[sledCestOdNapajece],n++,
If[Length[Position[sledCestOdNapajece[[n]],m]]>0&&Length[Position[sledCestOdNapajece[[n]],sledCest[[k,Length[sledCest[[k]]]]]]]>0,
If[Position[sledCestOdNapajece[[n]],m][[1,1]]>Position[sledCestOdNapajece[[n]],sledCest[[k,Length[sledCest[[k]]]]]][[1,1]],
(*signalizace dle indikátoru je ok -> může být poruchový úsek*)
ukonciCyklusHledaniInd=1;
Break[]
,
(*signalizace dle idikátoru není ok -> nemůže být poruchový úsek*)
zaraditUsek=0;
ukonciCyklusHledaniInd=1;
Break[]
]
]
],
(*směrový indikátor stav s aktivní signalizací poruchy*)
If[(Position[maticeIndikatoruVstup[[j,{1,2}]],sledCest[[k,Length[sledCest[[k]]]]]][[1,1]]-Position[maticeIndikatoruVstup[[j,{1,2}]],m][[1,1]])*maticeIndikatoruVstup[[j,3]]>0,
(*signalizace dle indikátoru je ok -> může být poruchový úsek*)
ukonciCyklusHledaniInd=1;
Break[]
,
(*signalizace dle idikátoru není ok -> nemůže být poruchový úsek*)
zaraditUsek=0;
ukonciCyklusHledaniInd=1;
Break[]
]
]
]
];
If[ukonciCyklusHledaniInd==1,Break[]]
],
(*pokud úsek není indikátor, přidá ho do pole sledCest*)
sledCest=Append[sledCest,Append[sledCest[[k]],m]];
konecnyUzel=0;
]
];
If[zaraditUsek==0,
Break[]; (*ukončí cyklus procházení řádku maticeSous*)
]
];
If[zaraditUsek==0,

Break[] (*ukončí postupné procházení pole sledCest*)
];
If[konecnyUzel==0,
(*vymaže již prohledaný úsek*)
sledCest=Delete[sledCest,k];
(*resetuje proměnnou k*)
k--
]
]
];
If[zaraditUsek==0,
(*zařadí uzel a všechny uzly ze sledCest do pole obsahující úseky bez poruchy*)
For[y=1,y≤Length[Flatten[sledCest]],y++,

If[Length[Position[poleNePoruchaIndikator,Flatten[sledCest][[y]]]]>0,,
poleNePoruchaIndikator=Append[poleNePoruchaIndikator,Flatten[sledCest][[y]]]
]
],
(*zařadí uzel a všechny uzly ze sledCest do pole obsahující úseky s poruchou*)
For[y=1,y≤Length[Flatten[sledCest]],y++,
If[Length[Position[polePoruchaIndikator,Flatten[sledCest][[y]]]]>0,,
polePoruchaIndikator=Append[polePoruchaIndikator,Flatten[sledCest][[y]]]
]
]
]
]
];
(*konečné nalezení všech úseků s poruchou dle informací z indikátorů poruch*)
For[p=1,p≤Length[maticeSiteVstup],p++,
If[Length[Position[polePoruchaIndikator,maticeSiteVstup[[p,1]]]]>0&&Length[Position[polePoruchaIndikator,maticeSiteVstup[[p,2]]]]>0,
(*oba uzly úseku z maticeSiteVstup jsou vyhodnoceny jako s možnou poruchou*)
usekyPopisMoznaPorucha=Append[usekyPopisMoznaPorucha,maticeSiteVstup[[p,1]]\[UndirectedEdge]maticeSiteVstup[[p,2]]];
usekyMoznaPorucha=Append[usekyMoznaPorucha,{maticeSiteVstup[[p,1]],maticeSiteVstup[[p,2]]}];
]
];

(*Grafické obrazení možných poruchových úseků*)
usekyUS=Table[If[StringTake[maticeSiteVstup[[i,5]],2]=="US",UndirectedEdge[maticeSiteVstup[[i,1]],maticeSiteVstup[[i,2]]]],{i,1,Length[maticeSiteVstup]}];
usekyIndZap=Table[If[maticeIndikatoruVstup[[i,4]]==1,UndirectedEdge[maticeIndikatoruVstup[[i,1]],maticeIndikatoruVstup[[i,2]]]],{i,1,Length[maticeIndikatoruVstup]}];
usekyIndVyp=Table[If[maticeIndikatoruVstup[[i,4]]==0,UndirectedEdge[maticeIndikatoruVstup[[i,1]],maticeIndikatoruVstup[[i,2]]]],{i,1,Length[maticeIndikatoruVstup]}];

grafSiteMoznePoruchy=HighlightGraph[WeightedAdjacencyGraph[maticeGrafDisp,(*GraphLayout->{"RadialEmbedding"},*)(*VertexLabels->Table[i->Placed["Name",Above],{i,1,Length[maticeGrafDisp]}],VertexLabelStyle->Directive[Black,10],*)EdgeLabels->usekyPopis,VertexSize->0.1],{Style[usekyUS,Thickness[0.005],Blue],Style[usekyIndZap,Thickness[0.005],Darker[Green]],Style[usekyIndVyp,Thickness[0.005],Red],Style[usekyPopisMoznaPorucha,Thickness[0.005],Orange]}]

Lokalizace poruchy z informací lokátoru poruch

Algoritmus nalezení možných poruchových úseků z informací lokátoru poruch funguje následujícím způsobem:
	1. Nejprve je vyšetřeno, zda v sítí existuje cyklus (tj. existuje více cest mezi nějakými dvěma uzly sítě)
		2. Pokud neexistuje cyklus (paprsková síť), prohledává se síť a impedanční vzdálenost je určena prostým součtem impedancí úseků
		3. Pokud existuje cyklus (okružní nebo mřížová síť), výpočet impedance je proveden pomocí Laplaceovy matice sítě z důvodu existence 				paralelních cest.
	4. Výstupem je seznam úseků s možnou poruchou dle lokátoru poruch spolu s hodnotami impedancí pro výpočet přeného místa poruchy

cestaLokatorImp={}; (*pole, do nějž se zapisují cesty od lokátoru - bez cyklu v síti*)
usekyLokatorImpCyklus={}; (*pole, do nějž se zapisují možné poruchové úseky - s cyklem v síti*)
If[Length[FindCycle[grafSite]]==0,
(*síť je paprsková ->lze použít jednoduché určení impedance smyčky*)
(*určit první prohledávané úseky z uzlu, kde je umístěn lokalizátor poruchy. *)
For[m=1,m<Length[maticeSous],m++,
If[maticeSous[[poziceLokatoru,m]]>0,
(*vyplnění pole prohledávaných úseků*)
cestaLokatorImp=Append[cestaLokatorImp,{maticeSous[[poziceLokatoru,m]],{poziceLokatoru,m}}]
]
];
(*cyklus procházející všechny navazující úseky*)
For[n=1,n<=Length[cestaLokatorImp],n++,

(*Impedance je menší než dle lokátoru poruchy*)
If[cestaLokatorImp[[n,1]]<impVzdPoruchy,
(*prochází všechny následující úseky a přidá je do pole cestaLokatorImp*)
For[m=1,m<=Length[maticeSous],m++,
If[maticeSous[[cestaLokatorImp[[n,2,Length[cestaLokatorImp[[n,2]]]]],m]]>0&&Length[Position[cestaLokatorImp[[n,2]],m]]==0,
cestaLokatorImp=Append[cestaLokatorImp,{cestaLokatorImp[[n,1]]+maticeSous[[cestaLokatorImp[[n,2,Length[cestaLokatorImp[[n,2]]]]],m]],Insert[cestaLokatorImp[[n,2]],m,-1]}]
]
];
cestaLokatorImp=Delete[cestaLokatorImp,n];
n--
]
];
(*zápis do konečného výstupního pole*)
polePoruchaLokator=Table[{cestaLokatorImp[[i,2,Length[cestaLokatorImp[[i,2]]]-1]],cestaLokatorImp[[i,2,Length[cestaLokatorImp[[i,2]]]]]},{i,1,Length[cestaLokatorImp]}];
,
(*síť je paprsková ->lze použít jednoduché určení impedance smyčky*)
(*vytvoření Laplaceovy matice sítě*)
LaplacianMatrix=maticeSous;
For[j=1,j<=Length[LaplacianMatrix],j++,
For[k=1,k<=Length[LaplacianMatrix],k++,
If[LaplacianMatrix[[j,k]]≠0,
LaplacianMatrix[[j,k]]=-1/LaplacianMatrix[[j,k]];
]
]
];
(*výpočet impedančních vzdáleností v grafu -> ResistanceMatrix*)
LaplacianMatrix=LaplacianMatrix + IdentityMatrix[Length[LaplacianMatrix]]*Table[-Total[LaplacianMatrix[[i,All]]],{i,1,Length[LaplacianMatrix]}];
InverseGam=Inverse[LaplacianMatrix+ConstantArray[1,{Length[LaplacianMatrix],Length[LaplacianMatrix]}]/Length[LaplacianMatrix]];
LaplacianMatrix+ConstantArray[1,{Length[LaplacianMatrix],Length[LaplacianMatrix]}]/Length[LaplacianMatrix]//MatrixForm;
(*impedanční matice*)
ResistanceMatrix=((InverseGam*IdentityMatrix[Length[LaplacianMatrix]]).ConstantArray[1,{Length[LaplacianMatrix],Length[LaplacianMatrix]}])+(ConstantArray[1,{Length[LaplacianMatrix],Length[LaplacianMatrix]}]).(InverseGam*IdentityMatrix[Length[LaplacianMatrix]])-2*InverseGam;

(*přesná lokalizace poruchy v rámci úseku*)
For[j=1,j<=Length[maticeSiteVstup],j++,
If[(ResistanceMatrix[[poziceLokatoru,maticeSiteVstup[[j,1]]]]>impVzdPoruchy&&ResistanceMatrix[[poziceLokatoru,maticeSiteVstup[[j,2]]]]<=impVzdPoruchy)||(ResistanceMatrix[[poziceLokatoru,maticeSiteVstup[[j,2]]]]>impVzdPoruchy&&ResistanceMatrix[[poziceLokatoru,maticeSiteVstup[[j,1]]]]<=impVzdPoruchy),
If[(ResistanceMatrix[[poziceLokatoru,maticeSiteVstup[[j,1]]]]>impVzdPoruchy&&ResistanceMatrix[[poziceLokatoru,maticeSiteVstup[[j,2]]]]<=impVzdPoruchy),
usekyLokatorImpCyklus=Append[usekyLokatorImpCyklus,{{impVzdPoruchy-ResistanceMatrix[[poziceLokatoru,maticeSiteVstup[[j,2]]]],ResistanceMatrix[[poziceLokatoru,maticeSiteVstup[[j,1]]]]-ResistanceMatrix[[poziceLokatoru,maticeSiteVstup[[j,2]]]],maticeSiteVstup[[j,3]]},{maticeSiteVstup[[j,1]],maticeSiteVstup[[j,2]]}}],
usekyLokatorImpCyklus=Append[usekyLokatorImpCyklus,{{impVzdPoruchy-ResistanceMatrix[[poziceLokatoru,maticeSiteVstup[[j,1]]]],ResistanceMatrix[[poziceLokatoru,maticeSiteVstup[[j,2]]]]-ResistanceMatrix[[poziceLokatoru,maticeSiteVstup[[j,1]]]],maticeSiteVstup[[j,3]]},{maticeSiteVstup[[j,2]],maticeSiteVstup[[j,1]]}}]
]
]
];
(*zápis do konečného výstupního pole*)
polePoruchaLokator=usekyLokatorImpCyklus[[All,2]]
];

Přesná lokalizace poruchy

Na základě lokalizace dle indikátorů i informace z lokalizátoru je určeno přesné místo/a poruchy v síti.

polePoruchaFinal={}; (*pole, do nějž se zapisuje konečná poloha možných poruchových míst*)
For[j=1,j≤Length[polePoruchaLokator],j++,
(*pokud se množiny dle indikátorů a lokátoru prolínají, nalezne přesné místo poruchy*)

If[Length[Position[polePoruchaIndikator,polePoruchaLokator[[j,1]]]]>0&&Length[Position[polePoruchaIndikator,polePoruchaLokator[[j,2]]]]>0,

(*určí přesnou polohu v rámci daného úseku*)
If[Length[cestaLokatorImp]>0,
For[k=1,k≤Length[maticeSiteVstup],k++,
If[(maticeSiteVstup[[k,1]]==polePoruchaLokator[[j,1]]&&maticeSiteVstup[[k,2]]==polePoruchaLokator[[j,2]])||
(maticeSiteVstup[[k,2]]==polePoruchaLokator[[j,1]]&&maticeSiteVstup[[k,1]]==polePoruchaLokator[[j,2]]),
impUseku=maticeSiteVstup[[k,3]]*maticeSiteVstup[[k,4]]/1000;
delkaUseku=maticeSiteVstup[[k,3]];
]
];
finImpUzlu=cestaLokatorImp[[j,1]];
vzdPoruchyUsek=delkaUseku*(impVzdPoruchy-(finImpUzlu-impUseku))/(impUseku);
polePoruchaFinal=Append[polePoruchaFinal,{{polePoruchaLokator[[j,2]],polePoruchaLokator[[j,1]]},vzdPoruchyUsek}]
,
If[Length[usekyLokatorImpCyklus]>0,
delkaUseku=usekyLokatorImpCyklus[[j,1,3]];
impUseku=usekyLokatorImpCyklus[[j,1,2]];
vzdPoruchyUsek=delkaUseku*(usekyLokatorImpCyklus[[j,1,1]])/(impUseku);
polePoruchaFinal=Append[polePoruchaFinal,{{polePoruchaLokator[[j,1]],polePoruchaLokator[[j,2]]},vzdPoruchyUsek}]
]
];
]
];


(*určení jednotlivých typů úseků*)
usekyUS=Table[If[StringTake[maticeSiteVstup[[i,5]],2]=="US",UndirectedEdge[maticeSiteVstup[[i,1]],maticeSiteVstup[[i,2]]]],{i,1,Length[maticeSiteVstup]}];
usekyIndZap=Table[If[maticeIndikatoruVstup[[i,4]]==1,UndirectedEdge[maticeIndikatoruVstup[[i,1]],maticeIndikatoruVstup[[i,2]]]],{i,1,Length[maticeIndikatoruVstup]}];
usekyIndVyp=Table[If[maticeIndikatoruVstup[[i,4]]==0,UndirectedEdge[maticeIndikatoruVstup[[i,1]],maticeIndikatoruVstup[[i,2]]]],{i,1,Length[maticeIndikatoruVstup]}];

usekyPoruchaLok=Table[UndirectedEdge[polePoruchaLokator[[i,1]],polePoruchaLokator[[i,2]]],{i,1,Length[polePoruchaLokator]}];
usekyPorucha=Table[UndirectedEdge[polePoruchaFinal[[i,1,1]],polePoruchaFinal[[i,1,2]]],{i,1,Length[polePoruchaFinal]}];

(*konečné grafické zobrazení výsledků*)
If[Length[usekyPorucha]==0,
Print["Informace z lokátoru poruch neodpovídají informacím z indikátorů poruch."];
grafSitePoruchy=HighlightGraph[WeightedAdjacencyGraph[maticeGrafDisp,(*GraphLayout->{"RadialEmbedding"},*)(*VertexLabels->Table[i->Placed["Name",Above],{i,1,Length[maticeGrafDisp]}],VertexLabelStyle->Directive[Black,10],*)EdgeLabels->usekyPopis,VertexSize->0.1],{Style[usekyUS,Thickness[0.005],Blue],Style[usekyIndZap,Thickness[0.005],Darker[Green]],Style[usekyIndVyp,Thickness[0.005],Darker[Yellow]],Style[usekyPopisMoznaPorucha,Thickness[0.005],Orange],Style[usekyPoruchaLok,Thickness[0.005],Red]}];
Print[grafSitePoruchy];
For[i=1,i≤Length[polePoruchaFinal],i++,
Print["Porucha na úseku ",polePoruchaFinal[[i,1,1]]," -> ",polePoruchaFinal[[i,1,2]]," ve vzdálenosti ",polePoruchaFinal[[i,2]]//N," metrů od uzlu ", polePoruchaFinal[[i,1,1]],"."];
],
grafSitePoruchy=HighlightGraph[WeightedAdjacencyGraph[maticeGrafDisp,(*GraphLayout->{"RadialEmbedding"},*)(*VertexLabels->Table[i->Placed["Name",Above],{i,1,Length[maticeGrafDisp]}],VertexLabelStyle->Directive[Black,10],*)EdgeLabels->usekyPopis,VertexSize->0.1],{Style[usekyUS,Thickness[0.005],Blue],Style[usekyIndZap,Thickness[0.005],Darker[Green]],Style[usekyIndVyp,Thickness[0.005],Darker[Yellow]],Style[usekyPopisMoznaPorucha,Thickness[0.005],Orange],Style[usekyPorucha,Thickness[0.005],Purple]}];
Print[grafSitePoruchy];
For[i=1,i≤Length[polePoruchaFinal],i++,
Print["Možná porucha na úseku ",polePoruchaFinal[[i,1,1]]," -> ",polePoruchaFinal[[i,1,2]]," ve vzdálenosti ",polePoruchaFinal[[i,2]]//N," metrů od uzlu ", polePoruchaFinal[[i,1,1]],"."];
];
]