private ChageCategoryData DivideCategory(Category category)
        {
            Category c1 = new Category();
            Category c2 = new Category();
            List<Category> categoryList = new List<Category>() { c1, c2 };
            List<ComunityEx> comunityList = new List<ComunityEx>();
            List<ComunityEx> comunityUnLockList = new List<ComunityEx>();

            bool flag = true;
            foreach (ComunityEx item in category.GetComuity().OfType<ComunityEx>().OrderBy(n => random.NextDouble()))
            {
                if (item.Lock)
                {
                    if (flag) c1.GetLayer(item.Layer.Name).Comunities.Add(item);
                    else
                    {
                        c2.GetLayer(item.Layer.Name).Comunities.Add(item);
                    }
                    flag = !flag;
                    comunityList.Add(item);
                }
                else
                {
                    comunityUnLockList.Add(item);
                }
            }
            foreach (var item in categoryList)
            {
                item.Update();
            }

            for (int i = 0; i < 500; i++)
            {
                bool endFlag = true;
                foreach (var item in comunityList)
                {
                    Dictionary<Models.Category, double> countDic = new Dictionary<Models.Category, double>();

                    foreach (var item2 in categoryList)
                    {
                        double sum = 0;
                        foreach (var item3 in item2.GetComuity())
                        {
                            if (item3.Relations.Where(n => n.ItemId == item.Id).Any())
                            {
                                sum += item3.Relations.Where(n => n.ItemId == item.Id).First().補正確信度;
                            }
                        }
                        countDic.Add(item2, sum);
                    }

                    {
                        var selectedCategory = countDic.OrderByDescending(n => n.Value / (double)n.Key.GetTmpComuity().Where(m => m != item).Count()).Select(n => n.Key).First();
                        if (selectedCategory == item.Category)
                        {
                            item.Layer.Tmp2Comunities.Add(item);
                        }
                        else
                        {
                            var layer = selectedCategory.GetLayer(item.Layer.Name);
                            layer.Tmp2Comunities.Add(item);
                            endFlag = false;
                        }
                    }
                }

                foreach (var item in categoryList)
                {
                    item.UpdateTmp();
                }
                if (endFlag) break;
            }

            foreach (var item in categoryList)
            {
                item.UpDateView();
            }

            if (c1.GetComuity().Count() >= MinCategoryComunityCount && c2.GetComuity().Count() >= MinCategoryComunityCount)
            {
                ChageCategoryData ccd = new ChageCategoryData() { IsChanged = true, OrignalCategory = category, ChangedCategory = new List<Category>() { c1, c2 } };
                flag = true;
                foreach (var item in comunityUnLockList)
                {
                    if (flag) c1.GetLayer(item.Layer.Name).Comunities.Add(item);
                    else
                    {
                        c2.GetLayer(item.Layer.Name).Comunities.Add(item);
                    }
                    flag = !flag;
                }
                return ccd;
            }
            return new ChageCategoryData() { IsChanged = false };
        }