public void ErrorBackPropagationBuilderExtensionsBuildsSoftmaxActivation()
        {
            TNetwork network = null;

            new ErrorBackPropagationBuilder()
            .With.ANewLayerOfInputUnits(2)
            .ConnectedTo.ANewLayerOfHiddenUnits(2).With.SoftmaxActivation()
            .ConnectedTo.ANewLayerOfOutputUnits(2).With.SoftmaxActivation()
            .And.SetupNetwork(n => network = n);

            network.ElementAt(1).Select(u => u.UnitActivation).Should().AllBeOfType <SoftmaxUnitActivationTraining>();
        }
示例#2
0
        private static IErrorBackPropagationTraining SetUpXOrTraining(double learningRate = 0.5d, double bias = 0d, double momentum = 0d, double slopeMultiplier = 1d, bool oneHot = false, Action <TNetwork> networkCallback = null)
        {
            var weightSetterMock = new Mock <IWeightSetter>();
            var stepsMock        = new Mock <ErrorBackPropagationStepsDependencyFactory>().As <IErrorBackPropagationStepsDependencyFactory>();

            stepsMock.CallBase = true;
            stepsMock.Setup(s => s.CreateWeightSetter(It.IsAny <double>(), It.IsAny <double>())).Returns(weightSetterMock.Object);
            var dependencyFactory = new ErrorBackPropagationDependencyFactory(stepsMock.Object);

            TNetwork network = null;
            var      chain   = new ErrorBackPropagationBuilder()
                               .With.ANewLayerOfInputUnits(2)
                               .ConnectedTo.ANewLayerOfHiddenUnits(3).With.UnitActivationMultiFold <SoftmaxUnitActivationTraining>()
                               .ConnectedTo.ANewLayerOfOutputUnits(2).With.OutputUnitActivationMultiFold <SoftmaxUnitActivationTraining>()
                               .And.NetworkErrorFunction <CrossEntropyErrorFunction>()
                               .And.Bias(bias)
                               .And.LearningRate(learningRate)
                               .And.Momentum(momentum)
                               .And.SlopeMultiplier(slopeMultiplier);

            if (oneHot)
            {
                chain = chain.And.UseOneHotEncoding();
            }

            var errorBackPropagationTraining = chain
                                               .And.NetworkErrorFunction <DifferenceErrorFunction>()
                                               .And.SetupNetwork(n =>
            {
                network = n;
                if (networkCallback != null)
                {
                    networkCallback(n);
                }
            })
                                               .And.NameEverything()
                                               .And.ReadyForTraining(dependencyFactory);

            // This whole ceremony ensures weight setting is deterministic (same weight to same connection every time even if weights are set asynchronously)
            var connections   = network.Skip(1).Select(units => units.SelectMany(u => u.IncomingConnections.Select(ic => ic.Properties)));
            var randomWeights = new List <double> {
                -1d, -0.5d, 0.5d, 1d, 0.3, 0.2, 0.1, 0.5, 0.2, 0.3, 0.4, -1, -0.9, 0.1, 0.5, 1.2, 1.3, 1.1, 0.35, 1.1, 0.1, 0.2, 0.3, -1d, -0.5d, 0.5d, 1d, 0.3, 0.2, 0.1, 0.5, 0.2, 0.3, 0.4, -1, -0.9, 0.1, 0.5, 1.2, 1.3, 1.1, 0.35, 1.1, 0.1, 0.2, 0.3
            };

            weightSetterMock.Setup(wi => wi.SetWeight(It.IsAny <IConnectionUnderTraining>())).Callback <IConnectionUnderTraining>(c =>
            {
                var randomWeightIndex = connections.SelectMany(x => x).ToList().IndexOf(c);
                c.Weight = randomWeights[randomWeightIndex];
            });

            return(errorBackPropagationTraining);
        }
示例#3
0
        public void SetUp()
        {
            _network = new StandardNetworkBuilderTraining()
                       .With.ANewLayerOfInputUnits(2)
                       .ConnectedTo.ANewLayerOfHiddenUnits(3).With.UnitActivationMultiFold <SoftmaxUnitActivationTraining>()
                       .ConnectedTo.ANewLayerOfOutputUnits(2).With.OutputUnitActivationMultiFold <SoftmaxUnitActivationTraining>()
                       .And.Bias(Bias)
                       .And.SlopeMultiplier(SlopeMultiplier)
                       .And.Build()
                       .And.WithNamesAssignedToEverything()
                       .And.GetNetwork();

            var connections = _network.SelectMany(u => u).SelectMany(u => u.OutgoingConnections);
            var weight      = 0.0001d;

            connections.Enumerate(c =>
            {
                weight += 0.01d;
                c.Properties.Weight = weight;
            });

            _perceptronFinalizer = new PerceptronFinalizer();
        }
示例#4
0
        public ResponseMessage SortPoints([FromBody] PointsVm pointsVm)
        {
            try
            {
                var tspmode     = TTSPmode.tspOpen;
                var gf          = TGISFormat.gfSHP;
                var mTSP        = new List <int>();
                var sortedPoint = new List <GeoNode>();

                //var point = JsonConvert.DeserializeObject<points>(w);

                //var count = point.coordinates.Count - 1;

                var shpfolder = _appSettings.RoutewareSettings.ShapeFolder.Replace("{{region}}", pointsVm.Region);
                var binfolder = _appSettings.RoutewareSettings.BinFolder.Replace("{{region}}", pointsVm.Region);
                var outfolder = _appSettings.RoutewareSettings.OutputFolder.Replace("{{region}}", pointsVm.Region);

                var NW = new TNetwork();
                NW.InitPassword(_appSettings.RoutewareSettings.Password);
                NW.Directory = binfolder;

                NW.Open(true, true, true, 0); // open attributes too, don't cache coord3 and open externID without caching
                NW.OpenLimit(1, 1, false);
                NW.OpenLimit(2, 2, true);
                NW.OpenRoadName(1, false);
                NW.CreateArrayTime(3); // 3 time arrays: 0,1,2
                NW.CreateArrayCost(1); // 1 cost array:  0
                                       // set speed as value based upon road classes 1,2,3,4,6 (store in index 0)
                TRoadClassSpeed rcs = new TRoadClassSpeed();
                rcs[1] = 110;
                rcs[2] = 80;
                rcs[3] = 65;
                rcs[4] = 55;
                rcs[5] = 45;
                rcs[6] = 25;
                NW.CalculateTime(0, rcs);

                TRandom r = new TRandom();
                r.SetSeed(987654321);
                // read speed into ArrayTime[2] from field "speed" in link.dbf
                NW.ReadSpeed(2, shpfolder + "\\link.dbf", 0, "speed", false);

                int link;

                // set speed as random value from 60-100 km/h (store in index 1)
                for (link = 1; link <= NW.LinkCount; link++)
                {
                    NW.SetSpeed(1, link, 60 + 40 * (float)r.NextDouble());
                }

                // set cost as the same as time from index 0
                for (link = 1; link <= NW.LinkCount; link++)
                {
                    NW.SetCost(0, link, NW.GetTime(0, link));
                }
                NW.UpdateAlphas();

                TSpatialSearch ss  = new TSpatialSearch(NW);
                TLocationList  ll  = new TLocationList();
                TBitArray      TBA = new TBitArray(1000);
                TIntegerList   nl  = new TIntegerList();

                if (pointsVm.Nodes != null)
                {
                    for (int i = 0; i < pointsVm.Nodes.Count; i++)
                    {
                        TFloatPoint fp;
                        fp.x = Convert.ToDouble(pointsVm.Nodes[i].Coordinates[0]);
                        fp.y = Convert.ToDouble(pointsVm.Nodes[i].Coordinates[1]);
                        TLocation ll1      = new TLocation();
                        int       side     = 0;
                        double    distance = 0;

                        TFloatPoint fPnew = new TFloatPoint();

                        ss.NearestLocation(fp, out ll1, out side, out distance, out fPnew);
                        ll.Add1(ll1);
                        ll.Add3(fp);
                        ll.Add4(ll1, fp);
                        nl.Add(ss.NearestNodeSimple(fp));
                    }

                    ll.Sort();
                    nl.Sort();
                    nl.RemoveDuplicates();
                }

                TRouteCalc calc = new TRouteCalc(NW, false);
                calc.SetTime(0);
                calc.SetFastest(false);
                calc.MaxSpeed = 110; // 90 > 80 and 110 > 80
                float[][] matrix = calc.Matrix(nl, (tspmode != TTSPmode.tspRoundTrip), false);
                // A faster and straight-line matrix
                // TMatrix Matrix = NW.Matrix(NL,(mode != TTspmode.tspRoundTrip));
                // optimize sequence of matrix
                TTSP tsp = new TTSP {
                    Mode = tspmode
                };
                tsp.Execute(matrix);

                for (int i = 0; i < nl.Count; i++)
                {
                    mTSP.Add(tsp.SortedIndex[i]);
                }

                // Use TDrivingDirections for output
                TGISWrite          output = NW.GISoutputInit(outfolder + "tsp_driving", gf);
                TDrivingDirections dd     = new TDrivingDirections(calc)
                {
                    ConcatenationMode = TConcatenationMode.cmCompact,
                    RoundTrip         = (tspmode == TTSPmode.tspRoundTrip),
                    SortedIndex       = tsp.SortedIndex
                };

                dd.RouteList(output, nl);
                output = NW.GISoutputInit(outfolder + "tsp", gf);
                output.StartHeader(1, TObjectTypes.otPline);
                output.AddField("sequence", TGISField.gfInteger, 0, 0);
                int d = 0;
                if (tspmode != TTSPmode.tspRoundTrip)
                {
                    d = 1;
                }
                for (int i = 0; i < nl.Count - d; i++)
                {
                    int node1 = nl[tsp.SortedIndex[i]];
                    int node2 = i != nl.Count - 1 ? nl[tsp.SortedIndex[i + 1]] : nl[tsp.SortedIndex[0]];

                    calc.Route(node1, node2);
                    TRoute             route = calc.RouteFind(node2);
                    TFloatPointArrayEx list  = NW.GetGISSectionRoute(route);
                    output.AddObject(1, false, i.ToString(CultureInfo.InvariantCulture));
                    output.AddSection(1, ref list);
                }
                output.Close();

                output = NW.GISoutputInit(outfolder + "tsppoint", gf);
                output.StartHeader(1, TObjectTypes.otPoint);
                output.AddField("sequence", TGISField.gfInteger, 0, 0);
                for (int i = 0; i < nl.Count; i++)
                {
                    int         node1 = nl[tsp.SortedIndex[i]];
                    TFloatPoint p1    = NW.Node2Coordinate(node1);
                    output.AddPoint2(p1, i.ToString(CultureInfo.InvariantCulture));
                }
                output.Close();

                for (int i = 0; i < mTSP.Count; i++)
                {
                    sortedPoint.Add(pointsVm.Nodes[mTSP[i]]);
                }

                return(new ResponseMessage {
                    Status = "Ok", Data = sortedPoint
                });
            }
            catch (Exception ex)
            {
                return(new ResponseMessage {
                    Status = "Error", Message = "Error sorting nodes."
                });
            }
        }
示例#5
0
        private List <Node> GetMST(string region, List <GeoNode> geoNodes)
        {
            try
            {
                _logger?.LogInformation("No. of nodes: " + geoNodes.Count);

                TNetwork NW = new TNetwork();

                var binfolder = _appSettings.RoutewareSettings.BinFolder.Replace("{{region}}", region);

                NW.InitPassword(_appSettings.RoutewareSettings.Password);
                NW.Directory = binfolder;

                NW.Open(false, false, true, 0);

                TIntegerList nodes = new TIntegerList();

                var ss = new TSpatialSearch(NW);

                foreach (var geoNode in geoNodes)
                {
                    var P = new TFloatPoint
                    {
                        x = geoNode.Coordinates[0],
                        y = geoNode.Coordinates[1]
                    };

                    nodes.Add(ss.NearestNodeSimple(P));
                }

                TBitArray links = new TBitArray();

                var calc = new TCalc(NW, false);
                calc.IgnoreOneway = false;

                calc.SteinerTree(nodes, links);

                var steinerTreeFile = _appSettings.RoutewareSettings.SteinerTreeFile.Replace("{{region}}", region);

                if (System.IO.File.Exists(steinerTreeFile))
                {
                    System.IO.File.Delete(steinerTreeFile);
                }

                var geoJsonFile = steinerTreeFile;

                if (System.IO.File.Exists(geoJsonFile + ".geojson"))
                {
                    System.IO.File.Delete(geoJsonFile + ".geojson");
                }

                NW.ExportLinks(geoJsonFile, TGISFormat.gfGeoJSON, null, links);

                var geoJsonData = JsonConvert.DeserializeObject <GeoJosn>(System.IO.File.ReadAllText(geoJsonFile + ".geojson"));

                var listNodes = GetMSTPaths(geoJsonData);

                return(listNodes);
            }
            catch (Exception ex)
            {
                _logger?.LogError(ex, "Error processing nodes.");
                return(null);
            }
        }
 public Node(TNetwork key, TValue value)
 {
     Key   = key;
     Value = value;
 }
示例#7
0
        private void MixingDataCancelDepersonalizeButton_Click(object sender, RoutedEventArgs e)
        {
            //меняем фон у StatusBar'а и выводим в него сообщение
            MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225));
            MixingDataMessagesTextBlock.Text       = "Процедура деобезличивания персональных данных запущена";

            //задаем набор позиций, определяющих процедуру обезличивания персональных данных
            var pZapDeobez   = new TNetwork.Position(true, 1);
            var p9           = new TNetwork.Position(true, 1);
            var p10          = new TNetwork.Position(true, 1);
            var p7           = new TNetwork.Position(false, 0);
            var p8           = new TNetwork.Position(false, 0);
            var p2           = new TNetwork.Position(false, 0);
            var p5           = new TNetwork.Position(false, 0);
            var pa1          = new TNetwork.Position(false, 0);
            var pa2          = new TNetwork.Position(false, 0);
            var pa3          = new TNetwork.Position(false, 0);
            var pa4          = new TNetwork.Position(false, 0);
            var pa5          = new TNetwork.Position(false, 0);
            var pb1          = new TNetwork.Position(false, 0);
            var pb2          = new TNetwork.Position(false, 0);
            var pb3          = new TNetwork.Position(false, 0);
            var pb4          = new TNetwork.Position(false, 0);
            var pb5          = new TNetwork.Position(false, 0);
            var pK1          = new TNetwork.Position(false, 0);
            var pK2          = new TNetwork.Position(false, 0);
            var pKonecDeobez = new TNetwork.Position(false, 0);

            //задаем набор переходов с формированием Fl и Fr, определяющий процедуру обезличивания персональных данных
            var t13 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                p7, p8
            }, new List <TNetwork.Position>()
            {
                p9, p10, pZapDeobez
            });
            var t10 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                p2
            }, new List <TNetwork.Position>()
            {
                p7
            });
            var t12 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                p5
            }, new List <TNetwork.Position>()
            {
                p8
            });
            var t7 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                pb1, pb2, pb3, pb4, pb5, pK2
            }, new List <TNetwork.Position>()
            {
                p5
            });
            var t4 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                pa1, pa2, pa3, pa4, pa5, pK1
            }, new List <TNetwork.Position>()
            {
                p2
            });
            var t1 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                pKonecDeobez
            }, new List <TNetwork.Position>()
            {
                pK1, pK2
            });

            //очищаем таблицу записей с персональными данными
            Db.Persons.Local.Clear();

            //для каждого набора ключей для деобезличивания восстанавливаем персональные данные
            foreach (var key in Db.Keys.Local)
            {
                //задаем исходную маркировку для набора позиций, определяющих процедуру обезличивания персональных данных
                pZapDeobez   = new TNetwork.Position(true, 1);
                p9           = new TNetwork.Position(true, 1);
                p10          = new TNetwork.Position(true, 1);
                p7           = new TNetwork.Position(false, 0);
                p8           = new TNetwork.Position(false, 0);
                p2           = new TNetwork.Position(false, 0);
                p5           = new TNetwork.Position(false, 0);
                pa1          = new TNetwork.Position(false, 0);
                pa2          = new TNetwork.Position(false, 0);
                pa3          = new TNetwork.Position(false, 0);
                pa4          = new TNetwork.Position(false, 0);
                pa5          = new TNetwork.Position(false, 0);
                pb1          = new TNetwork.Position(false, 0);
                pb2          = new TNetwork.Position(false, 0);
                pb3          = new TNetwork.Position(false, 0);
                pb4          = new TNetwork.Position(false, 0);
                pb5          = new TNetwork.Position(false, 0);
                pK1          = new TNetwork.Position(false, 0);
                pK2          = new TNetwork.Position(false, 0);
                pKonecDeobez = new TNetwork.Position(false, 0);

                //задаем исходный набор переходов с формированием Fl и Fr, определяющий процедуру обезличивания персональных данных
                t13 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    p7, p8
                }, new List <TNetwork.Position>()
                {
                    p9, p10, pZapDeobez
                });
                t10 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    p2
                }, new List <TNetwork.Position>()
                {
                    p7
                });
                t12 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    p5
                }, new List <TNetwork.Position>()
                {
                    p8
                });
                t7 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    pb1, pb2, pb3, pb4, pb5, pK2
                }, new List <TNetwork.Position>()
                {
                    p5
                });
                t4 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    pa1, pa2, pa3, pa4, pa5, pK1
                }, new List <TNetwork.Position>()
                {
                    p2
                });
                t1 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    pKonecDeobez
                }, new List <TNetwork.Position>()
                {
                    pK1, pK2
                });

                var newPerson1 = Db.NewPersons.Find(key.Key1);
                var newPerson2 = Db.NewPersons.Find(key.Key2);

                //задаем наборы значений аттрибутов двух записей в таблице персональных данных, передаваемых Т-сети
                var firstPersonAttributes = new List <string>
                {
                    newPerson1.Id.ToString(),
                    newPerson1.LastName,
                    newPerson1.FirstName,
                    newPerson1.Patronymic,
                    newPerson1.DateOfBirth.ToString("{0:dd.MM.yyyy}"),
                    newPerson1.Address
                };
                var secondPersonAttributes = new List <string>
                {
                    newPerson2.Id.ToString(),
                    newPerson2.LastName,
                    newPerson2.FirstName,
                    newPerson2.Patronymic,
                    newPerson2.DateOfBirth.ToString("{0:dd.MM.yyyy}"),
                    newPerson2.Address
                };

                //создаем экземпляр класса, реализующего Т-сеть
                var tNet = new TNetwork(firstPersonAttributes, secondPersonAttributes);

                //меняем фон у StatusBar'а и выводим в него сообщение
                MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225));
                MixingDataMessagesTextBlock.Text       = "Выполняется последовательность переходов t";

                //запускаем последовательно переходы в с сетевой моелью (Т-сеть) деобезличивания персональных данных
                try
                {
                    t13.DoTranslate(true);
                    t10.DoTranslate(true);
                    t12.DoTranslate(true);
                    t7.DoTranslate(true);
                    t4.DoTranslate(true);
                    tNet.SwapAttrInPositions(4);
                    tNet.SwapAttrInPositions(5);
                    t1.DoTranslate(true);
                }
                //если при каком-то переходе возникнет исключение, то оно будет обработано
                catch (Exception ex)
                {
                    //меняем фон у StatusBar'а и выводим в него сообщение
                    MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(201, 16, 18));
                    MixingDataMessagesTextBlock.Text       = "Возникло исключение: " + ex.Message;

                    //если исключение возникло, то функция завершается досрочно
                    return;
                }

                //если позиция конца обезличивания промаркирована, то
                if (pKonecDeobez.marked)
                {
                    //создаем записи добавляем их в таблицу с обезличенными персональными записями
                    var person1 = new Person()
                    {
                        Id = new Guid(tNet.firstAttributValues[0]), LastName = tNet.firstAttributValues[1], FirstName = tNet.firstAttributValues[2], Patronymic = tNet.firstAttributValues[3], DateOfBirth = DateTime.ParseExact(tNet.firstAttributValues[4], "{0:dd.MM.yyyy}", new CultureInfo("ru-RU")), Address = tNet.firstAttributValues[5]
                    };
                    Db.Persons.Local.Add(person1);

                    //меняем фон у StatusBar'а и выводим в него сообщение
                    MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225));
                    MixingDataMessagesTextBlock.Text       = "Процедура деобезличивания персональных данных завершена";
                }
                else
                {
                    //меняем фон у StatusBar'а и выводим в него сообщение
                    MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(201, 16, 18));
                    MixingDataMessagesTextBlock.Text       = "Позиция конца деобезличивания не была промаркирована.";

                    //если позиция конца обезличивания не помечена, то функция завершается досрочно (при этом деобезличенные ранее данные не стираются)
                    return;
                }
            }
            //сохраняем изменения в БД
            Db.SaveChanges();
        }
示例#8
0
        private void MixingDataDepersonalizeButton_Click(object sender, RoutedEventArgs e)
        {
            //запоминаем в переменных: splitCount - количество подмножеств исходного множества персональных данных, shift - циклический сдвиг значений перемешиваемых аттрибутов внутри каждого подмножества
            if (!int.TryParse(MixingDataSplitOnTextBox.Text, out var splitCount))
            {
                return;
            }
            if (!int.TryParse(MixingDataShiftOnTextBox.Text, out var shift))
            {
                return;
            }

            //меняем фон у StatusBar'а и выводим в него сообщение
            MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225));
            MixingDataMessagesTextBlock.Text       = "Процедура обезличивания персональных данных запущена";

            //задаем набор позиций, определяющих процедуру обезличивания персональных данных
            var pa1        = new TNetwork.Position(true, 1);
            var pa2        = new TNetwork.Position(true, 1);
            var pa3        = new TNetwork.Position(true, 1);
            var pa4        = new TNetwork.Position(true, 1);
            var pa5        = new TNetwork.Position(true, 1);
            var pb1        = new TNetwork.Position(true, 1);
            var pb2        = new TNetwork.Position(true, 1);
            var pb3        = new TNetwork.Position(true, 1);
            var pb4        = new TNetwork.Position(true, 1);
            var pb5        = new TNetwork.Position(true, 1);
            var pZapObez   = new TNetwork.Position(true, 1);
            var pZ1        = new TNetwork.Position(false, 0);
            var pZ2        = new TNetwork.Position(false, 0);
            var pZ3        = new TNetwork.Position(false, 0);
            var pZ4        = new TNetwork.Position(false, 0);
            var p1         = new TNetwork.Position(false, 0);
            var p3         = new TNetwork.Position(false, 0);
            var p4         = new TNetwork.Position(false, 0);
            var p6         = new TNetwork.Position(false, 0);
            var p10        = new TNetwork.Position(false, 0);
            var p11        = new TNetwork.Position(false, 0);
            var p9         = new TNetwork.Position(false, 0);
            var p12        = new TNetwork.Position(false, 0);
            var p13        = new TNetwork.Position(false, 0);
            var p14        = new TNetwork.Position(false, 0);
            var pKonecObez = new TNetwork.Position(false, 0);

            //задаем набор переходов с формированием Fl и Fr, определяющий процедуру обезличивания персональных данных
            var t2 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                pZapObez
            }, new List <TNetwork.Position>()
            {
                pZ1, pZ2, pZ3, pZ4
            });
            var t3 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                pa1, pa2, pa3
            }, new List <TNetwork.Position>()
            {
                p1
            });
            var t5 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                pa4, pa5
            }, new List <TNetwork.Position>()
            {
                p6
            });
            var t6 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                pb1, pb2, pb3
            }, new List <TNetwork.Position>()
            {
                p4
            });
            var t8 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                pb4, pb5
            }, new List <TNetwork.Position>()
            {
                p3
            });
            var t9 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                p1, p3
            }, new List <TNetwork.Position>()
            {
                p10, p11
            });
            var t11 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                p4, p6
            }, new List <TNetwork.Position>()
            {
                p9, p12
            });
            var t14 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                p11
            }, new List <TNetwork.Position>()
            {
                p13
            });
            var t15 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                p12
            }, new List <TNetwork.Position>()
            {
                p14
            });
            var t16 = new TNetwork.Translation(new List <TNetwork.Position>()
            {
                p13, p14
            }, new List <TNetwork.Position>()
            {
                pKonecObez
            });

            //очищаем таблицы с обезличенными персональными данными и с ключами для обезличивания, сохранив все изменения в БД, перед обезличиванием
            ClearDepersonalizeDataGridAndKeysDataGrid();

            //запоминаем в N - число записей в таблице персональных данных
            var N = Db.Persons.Local.Count;
            //считаем k - количество записей в каждом подмножестве
            int k;

            if (N % splitCount == 0)
            {
                k = N / splitCount;
            }
            else
            {
                k = N / splitCount + 1;
            }

            if (k < 2)
            {
                //меняем фон у StatusBar'а и выводим в него сообщение
                MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(201, 16, 18));
                MixingDataMessagesTextBlock.Text       = "Невозможно разбить на " + splitCount.ToString() + " подмножеств";

                //если исключение возникло, то функция завершается досрочно
                return;
            }

            //создаем временный список с записями персональных данных и инициализируем его
            var tempPersons = new List <Person>();

            foreach (var person in Db.Persons.Local)
            {
                tempPersons.Add(person);
            }
            //shift раз осуществляем циклический сдвиг на 1 элемент влево в этом временном массиве

            //осуществляем циклический сдвиг на shift в каждом подмножестве множества элементов персональных данных и результат помещаем в новый список (уже со сдвигом элементов) персональных данных
            #region это алгоритм смещения элементов множества на shift влево

            for (var i = 0; i < splitCount; i++)
            {
                //p - номер первой записи в каждом подмножестве
                var p = k * i;
                //shift раз сдвигаем влево на 1 элемент
                for (var s = 0; s < shift; s++)
                {
                    //запоминаем первый элемент подмножества
                    var firstPerson = tempPersons[p];
                    var last        = p + k - 1; //будет хранить номер последнего элемента в каждом подмножестве
                    //смещаем все элементы подмножества на 1 влево
                    for (var j = p; j < p + k; j++)
                    {
                        if (j + 1 < N)
                        {
                            tempPersons[j] = tempPersons[j + 1];
                        }
                        else
                        {
                            last = j;
                            break;
                        }
                    }
                    //на место последнего элемента подмножества ставим первый
                    tempPersons[last] = firstPerson;
                }
            }
            #endregion

            //для всех элементов нового списка персональных данных
            for (var i = 0; i < tempPersons.Count; i++)
            {
                //задаем начальную маркировку для набора позиций, определяющих процедуру обезличивания персональных данных
                pa1        = new TNetwork.Position(true, 1);
                pa2        = new TNetwork.Position(true, 1);
                pa3        = new TNetwork.Position(true, 1);
                pa4        = new TNetwork.Position(true, 1);
                pa5        = new TNetwork.Position(true, 1);
                pb1        = new TNetwork.Position(true, 1);
                pb2        = new TNetwork.Position(true, 1);
                pb3        = new TNetwork.Position(true, 1);
                pb4        = new TNetwork.Position(true, 1);
                pb5        = new TNetwork.Position(true, 1);
                pZapObez   = new TNetwork.Position(true, 1);
                pZ1        = new TNetwork.Position(false, 0);
                pZ2        = new TNetwork.Position(false, 0);
                pZ3        = new TNetwork.Position(false, 0);
                pZ4        = new TNetwork.Position(false, 0);
                p1         = new TNetwork.Position(false, 0);
                p3         = new TNetwork.Position(false, 0);
                p4         = new TNetwork.Position(false, 0);
                p6         = new TNetwork.Position(false, 0);
                p10        = new TNetwork.Position(false, 0);
                p11        = new TNetwork.Position(false, 0);
                p9         = new TNetwork.Position(false, 0);
                p12        = new TNetwork.Position(false, 0);
                p13        = new TNetwork.Position(false, 0);
                p14        = new TNetwork.Position(false, 0);
                pKonecObez = new TNetwork.Position(false, 0);

                //задаем исходный набор переходов с формированием Fl и Fr, определяющий процедуру обезличивания персональных данных
                t2 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    pZapObez
                }, new List <TNetwork.Position>()
                {
                    pZ1, pZ2, pZ3, pZ4
                });
                t3 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    pa1, pa2, pa3
                }, new List <TNetwork.Position>()
                {
                    p1
                });
                t5 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    pa4, pa5
                }, new List <TNetwork.Position>()
                {
                    p6
                });
                t6 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    pb1, pb2, pb3
                }, new List <TNetwork.Position>()
                {
                    p4
                });
                t8 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    pb4, pb5
                }, new List <TNetwork.Position>()
                {
                    p3
                });
                t9 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    p1, p3
                }, new List <TNetwork.Position>()
                {
                    p10, p11
                });
                t11 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    p4, p6
                }, new List <TNetwork.Position>()
                {
                    p9, p12
                });
                t14 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    p11
                }, new List <TNetwork.Position>()
                {
                    p13
                });
                t15 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    p12
                }, new List <TNetwork.Position>()
                {
                    p14
                });
                t16 = new TNetwork.Translation(new List <TNetwork.Position>()
                {
                    p13, p14
                }, new List <TNetwork.Position>()
                {
                    pKonecObez
                });

                //будем перемещивать аттрибуты исходных персональных данных и получившихся после смещения на shift в каждом подмножестве
                var person1 = Db.Persons.Local[i];
                var person2 = tempPersons[i];

                //задаем наборы значений аттрибутов двух записей в таблице персональных данных, передаваемых Т-сети
                var firstPersonAttributes = new List <string>();
                firstPersonAttributes.Add(person1.Id.ToString());
                firstPersonAttributes.Add(person1.LastName);
                firstPersonAttributes.Add(person1.FirstName);
                firstPersonAttributes.Add(person1.Patronymic);
                firstPersonAttributes.Add(person1.DateOfBirth.ToString("{0:dd.MM.yyyy}"));
                firstPersonAttributes.Add(person1.Address);
                var secondPersonAttributes = new List <string>
                {
                    person2.Id.ToString(),
                    person2.LastName,
                    person2.FirstName,
                    person2.Patronymic,
                    person2.DateOfBirth.ToString("{0:dd.MM.yyyy}"),
                    person2.Address
                };

                //создаем экземпляр класса, реализующего Т-сеть
                var tNet = new TNetwork(firstPersonAttributes, secondPersonAttributes);

                //меняем фон у StatusBar'а и выводим в него сообщение
                MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225));
                MixingDataMessagesTextBlock.Text       = "Выполняется последовательность переходов t";

                //запускаем последовательно переходы в с сетевой моелью (Т-сеть) обезличивания персональных данных
                try
                {
                    t2.DoTranslate(false);
                    t3.DoTranslate(false);
                    t5.DoTranslate(false);
                    t6.DoTranslate(false);
                    t8.DoTranslate(false);
                    t9.DoTranslate(false);
                    t11.DoTranslate(false);
                    tNet.SwapAttrInPositions(4);
                    tNet.SwapAttrInPositions(5);
                    t14.DoTranslate(false);
                    t15.DoTranslate(false);
                    t16.DoTranslate(false);
                }
                //если при каком-то переходе возникнет исключение, то оно будет обработано
                catch (Exception ex)
                {
                    //меняем фон у StatusBar'а и выводим в него сообщение
                    MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(201, 16, 18));
                    MixingDataMessagesTextBlock.Text       = "Возникло исключение: " + ex.Message;

                    //если исключение возникло, то функция завершается досрочно
                    return;
                }

                //если позиция конца обезличивания промаркирована, то
                if (pKonecObez.marked)
                {
                    //создаем записи добавляем их в таблицу с обезличенными персональными записями
                    var newPerson2 = new NewPerson()
                    {
                        Id = new Guid(tNet.secondAttributValues[0]), LastName = tNet.secondAttributValues[1], FirstName = tNet.secondAttributValues[2], Patronymic = tNet.secondAttributValues[3], DateOfBirth = DateTime.ParseExact(tNet.secondAttributValues[4], "{0:dd.MM.yyyy}", new CultureInfo("ru-RU")), Address = tNet.secondAttributValues[5]
                    };
                    Db.NewPersons.Local.Add(newPerson2);

                    //создаем записи добавляем их в таблицу с ключами для деобезличивания
                    var key1 = new Key()
                    {
                        Id = Guid.NewGuid(), Key1 = new Guid(tNet.firstAttributValues[0]), Key2 = newPerson2.Id
                    };
                    Db.Keys.Local.Add(key1);

                    //меняем фон у StatusBar'а и выводим в него сообщение
                    MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225));
                    MixingDataMessagesTextBlock.Text       = "Процедура обезличивания персональных данных завершена";
                }
                else
                {
                    //меняем фон у StatusBar'а и выводим в него сообщение
                    MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(201, 16, 18));
                    MixingDataMessagesTextBlock.Text       = "Позиция конца обезличивания не была промаркирована.";

                    //очищаем таблицы с обезличенными персональными данными и с ключами для обезличивания, сохранив все изменения в БД, перед обезличиванием
                    ClearDepersonalizeDataGridAndKeysDataGrid();

                    //если позиция конца обезличивания не помечена, то функция завершается досрочно
                    return;
                }
            }
            //сохраняем изменения в БД
            Db.SaveChanges();
        }