// ListにClassifier追加
 public override void Add( Classifier C )
 {
     // 最大サイズになったとき
     if( this.Number == this.CList.Count )
     {
         return; // 削除実装予定
     }
     this.CList.Add( C );
 }
 // ListにClassifier追加
 public override void Add( Classifier C )
 {
     // 最大サイズになったとき
     if( this.Number == this.CList.Count )
     {
         //Console.WriteLine("hogehoge");
         //System.Threading.Thread.Sleep( 1000 );
         return; // 削除実装予定
     }
     this.CList.Add( C );
 }
        // 包摂条件判定用
        public override bool IsMoreGeneral(Classifier Spec)
        {
            if (this.C.NumberOfSharp <= Spec.C.NumberOfSharp)
            {
                return(false);
            }

            int i = 0;

            do
            {
                if (this.C.state[i] != '#' && this.C.state[i] != Spec.C.state[i])
                {
                    return(false);
                }
                i++;
            } while(i < this.C.state.Length);

            return(true);
        }
 // 包摂条件判定
 public override bool DoesSubsume(Classifier C)
 {
     /*if( this.A == C.A )
      * {*/
     if (this.CouldSubsume())
     {
         if (this.IsMoreGeneral(C))
         {
             if (this.Epsilon_0 <= C.Epsilon_0)                 //chou 10-5 GA subsumption
             {
                 if (C.C.state[4] == '0' & C.C.state[7] == '1') //"bath0 rehabi1"
                 {
                     Configuration.Problem.WriteLine(C.C.state + "," + Configuration.T + "," + C.P + "," + C.M + "," + C.Epsilon + "," + C.F + "," + C.N + "," + C.Exp + "," + C.Ts + "," + C.As + "," + C.Kappa + "," + C.Epsilon_0 + "," + C.St + "," + C.GenerateTime + ", in GA");
                     Configuration.Problem.WriteLine(this.C.state + "," + Configuration.T + "," + this.P + "," + this.M + "," + this.Epsilon + "," + this.F + "," + this.N + "," + this.Exp + "," + this.Ts + "," + this.As + "," + this.Kappa + "," + this.Epsilon_0 + "," + this.St + "," + this.GenerateTime + ", in GA");
                 }
                 return(true);
             }
         }
     }
     //}
     return(false);
 }
Example #5
0
        //二点交差
        public override void Crossover(Classifier C)
        {
            double x = Configuration.MT.NextDouble() * (this.C.Length + 1);
            double y = Configuration.MT.NextDouble() * (this.C.Length + 1);

            if (x > y)
            {
                double tmp = x;
                x = y;
                y = tmp;
            }

            int i = 0;

            do
            {
                if (x <= i && i < y)
                {
                    this.C.Switch(C.C, i);
                }
                i++;
            } while(i < y);
        }
        protected override double DeletionVote(Classifier C, double AvFitness)
        {
            // SigmaNormalClassifier前提
            SigmaNormalClassifier SNC = ( SigmaNormalClassifier )C;

            double Vote = SNC.As * SNC.N;

            //Console.WriteLine("AS: " + SNC.As + " N: " + SNC.N);

            if ((SNC.Exp > Configuration.Theta_del) && (SNC.WinningRate.Average() / SNC.N < Configuration.Delta * AvFitness))
            {
                if (SNC.WinningRate.Average() == 0)
                {
                    //Console.WriteLine("0 : " + Vote);
                    return(Vote);
                }
                Vote *= AvFitness / (SNC.WinningRate.Average() / SNC.N);
                //Console.WriteLine("hoge");
            }

            //Console.WriteLine(SNC.WinningRate.Average() + " : " + Vote);
            return(Vote);
        }
        protected override void Subsumption(Population Pop)
        {
            Classifier Cl = null;

            foreach (Classifier C in this.CList)
            {
                if (C.CouldSubsume())
                {
                    if ((Cl == null) || (C.C.NumberOfSharp > Cl.C.NumberOfSharp) || ((C.C.NumberOfSharp == Cl.C.NumberOfSharp) && (Configuration.MT.NextDouble() < 0.5)))
                    {
                        Cl = C;
                    }
                }
            }

            if (Cl != null)
            {
                // 削除中にforeachできない
                List <Classifier> CL = new List <Classifier>();

                foreach (Classifier C in this.CList)
                {
                    if (Cl.IsMoreGeneral(C))
                    {
                        Cl.N += C.N;
                        // 削除Classifier登録
                        CL.Add(C);
                    }
                }

                foreach (Classifier C in CL)
                {
                    this.Remove(C);
                    Pop.Remove(C);
                }
            }
        }
 /// <summary>
 /// 分類子追加 かぶらないと分かっているのでInsertと統合可能
 /// </summary>
 /// <param name="C">生成された分類子を追加</param>
 public abstract void Add( Classifier C );
Example #9
0
 /// <summary>
 /// 一般的か
 /// </summary>
 /// <param name="Spec">比較対象</param>
 /// <returns>比較対象が含まれる(true)</returns>
 public abstract bool IsMoreGeneral( Classifier Spec );
Example #10
0
        // 包摂条件判定
        public override bool DoesSubsume( Classifier C )
        {
            if( this.A == C.A )
            {
                if( this.CouldSubsume() )
                {
                    if( this.IsMoreGeneral( C ) )
                    {
                        if (this.Epsilon_0 < C.Epsilon_0)//chou 10-5 GA subsumption

                        { return true; }
                    }
                }
            }
            return false;
        }
Example #11
0
 /// <summary>
 /// 削除条件計算
 /// </summary>
 /// <param name="C">Classifier</param>
 /// <param name="AvFitness">AvFitness</param>
 /// <returns>計算結果</returns>
 abstract protected double DeletionVote(Classifier C, double AvFitness);
Example #12
0
 /// <summary>
 /// 一致検査をして追加
 /// </summary>
 /// <param name="C">追加されるClassifier</param>
 abstract public void Insert(Classifier C);
Example #13
0
        public override void Crossover( Classifier C )
        {
            double x = Configuration.MT.NextDouble() * ( this.C.Length + 1 );
            double y = Configuration.MT.NextDouble() * ( this.C.Length + 1 );

            if( x > y )
            {
                double tmp = x;
                x = y;
                y = tmp;
            }

            int i = 0;
            do
            {
                if( x <= i && i < y )
                {
                    this.C.Switch( C.C, i );
                }
                i++;
            } while( i < y );
        }
        public override void RunGA(State Situation, Population P)
        {
            double NumerositySum = 0.0;
            double TimeStampSum  = 0.0;

            foreach (Classifier C in this.CList)
            {
                NumerositySum += C.N;
                TimeStampSum  += C.Ts * C.N;
            }

            if (Configuration.T - TimeStampSum / NumerositySum > Configuration.Theta_GA)
            {
                foreach (Classifier C in this.CList)
                {
                    C.Ts = Configuration.T;
                }

                Classifier Parent_1 = this.SelectOffspring();
                Classifier Parent_2 = this.SelectOffspring();
                Classifier Child_1  = new NormalClassifier(( NormalClassifier )Parent_1);
                Classifier Child_2  = new NormalClassifier(( NormalClassifier )Parent_2);
                Child_1.N   = Child_2.N = 1;
                Child_1.Exp = Child_2.Exp = 0;
                Child_1.St  = Child_2.St = 0;
                Child_1.M   = Child_2.M = 0;
                Child_1.S   = Child_2.S = 0;

                if (Configuration.MT.NextDouble() < Configuration.Chai)
                {
                    Child_1.Crossover(Child_2);
                    Child_1.P       = (Parent_1.P + Parent_2.P) / 2;
                    Child_1.Epsilon = (Parent_1.Epsilon + Parent_2.Epsilon) / 2;
                    Child_1.F       = (Parent_1.F + Parent_2.F) / 2;
                    //Child_1.M = ( Parent_1.M + Parent_2.M ) / 2;
                    //Child_1.S = ( Parent_1.S + Parent_2.S ) / 2;
                    Child_2.P       = Child_1.P;
                    Child_2.Epsilon = Child_1.Epsilon;
                    Child_2.F       = Child_1.F;
                    //Child_2.M = Child_1.M;
                    //Child_2.S = Child_1.S;
                }

                Child_1.F *= 0.1;
                Child_2.F *= 0.1;

                // bothChild
                Child_1.Mutation(Situation);
                Child_2.Mutation(Situation);

                if (Configuration.DoGASubsumption)
                {
                    if (Parent_1.DoesSubsume(Child_1))
                    {
                        Parent_1.N++;
                    }
                    else if (Parent_2.DoesSubsume(Child_1))
                    {
                        Parent_2.N++;
                    }
                    else
                    {
                        P.Insert(Child_1);
                    }
                    P.Delete();

                    if (Parent_1.DoesSubsume(Child_2))
                    {
                        Parent_1.N++;
                    }
                    else if (Parent_2.DoesSubsume(Child_2))
                    {
                        Parent_2.N++;
                    }
                    else
                    {
                        P.Insert(Child_2);
                    }
                    P.Delete();
                }
                else
                {
                    P.Insert(Child_1);
                    P.Delete();
                    P.Insert(Child_2);
                    P.Delete();
                }
            }
        }
 /// <summary>
 /// 一致検査をして追加
 /// </summary>
 /// <param name="C">追加されるClassifier</param>
 public abstract void Insert( Classifier C );
Example #16
0
 // 包摂条件判定
 public override bool DoesSubsume( Classifier C )
 {
     if( this.A == C.A )
     {
         if( this.CouldSubsume() )
         {
             if( this.IsMoreGeneral( C ) )
             {
                 return true;
             }
         }
     }
     return false;
 }
 // ListからClassifier削除
 public override void Remove( Classifier C )
 {
     //Console.WriteLine( Configuration.T + " del " + C.C.state + " : " + C.A + " : " + C.Epsilon + " : " + C.Epsilon_0 );
     //if( Configuration.T > 41000 )
     //	System.Threading.Thread.Sleep( 500 );
     this.CList.Remove( C );
 }
 public override void Insert( Classifier Cl )
 {
     foreach( Classifier C in this.CList )
     {
         if( C.Equals( Cl ) )
         {
             C.N++;
             return;
         }
     }
     this.CList.Add( Cl );
 }
Example #19
0
 /// <summary>
 /// 包摂できるか
 /// </summary>
 /// <param name="C">包摂相手</param>
 /// <returns>包摂できる(true)</returns>
 public abstract bool DoesSubsume(Classifier C);
Example #20
0
 /// <summary>
 /// 交差
 /// </summary>
 /// <param name="C">交差相手</param>
 public abstract void Crossover(Classifier C);
Example #21
0
 /// <summary>
 /// 一般的か
 /// </summary>
 /// <param name="Spec">比較対象</param>
 /// <returns>比較対象が含まれる(true)</returns>
 public abstract bool IsMoreGeneral(Classifier Spec);
 /// <summary>
 /// 削除条件計算
 /// </summary>
 /// <param name="C">Classifier</param>
 /// <param name="AvFitness">AvFitness</param>
 /// <returns>計算結果</returns>
 protected abstract double DeletionVote( Classifier C, double AvFitness );
        protected override double DeletionVote( Classifier C, double AvFitness )
        {
            // SigmaNormalClassifier前提
            SigmaNormalClassifier SNC = ( SigmaNormalClassifier )C;

            double Vote = SNC.As * SNC.N;
            //Console.WriteLine("AS: " + SNC.As + " N: " + SNC.N);

            if( ( SNC.Exp > Configuration.Theta_del ) && ( SNC.WinningRate.Average() / SNC.N < Configuration.Delta * AvFitness ) )
            {
                if(SNC.WinningRate.Average() == 0)
                {
                    //Console.WriteLine("0 : " + Vote);
                    return Vote;
                }
                Vote *= AvFitness / ( SNC.WinningRate.Average() / SNC.N );
                //Console.WriteLine("hoge");
            }

            //Console.WriteLine(SNC.WinningRate.Average() + " : " + Vote);
            return Vote;
        }
Example #24
0
        // 包摂条件判定用
        public override bool IsMoreGeneral( Classifier Spec )
        {
            if( this.C.NumberOfSharp <= Spec.C.NumberOfSharp )
            {
                return false;
            }

            int i = 0;

            do
            {
                if( this.C.state[i] != '#' && this.C.state[i] != Spec.C.state[i] )
                {
                    return false;
                }
                i++;
            } while( i < this.C.state.Length );

            return true;
        }
Example #25
0
        public override void RunGA(State Situation, Population P)
        {
            double NumerositySum = 0.0;
            double TimeStampSum  = 0.0;

            foreach (Classifier C in this.CList)
            {
                NumerositySum += C.N;
                TimeStampSum  += C.Ts * C.N;
            }

            if (Configuration.T - TimeStampSum / NumerositySum > Configuration.Theta_GA)
            {
                foreach (Classifier C in this.CList)
                {
                    C.Ts = Configuration.T;
                }

                Classifier Parent_1 = this.SelectOffspring();
                Classifier Parent_2 = this.SelectOffspring();
                Classifier Child_1  = new SigmaNormalClassifier(( SigmaNormalClassifier )Parent_1);
                Classifier Child_2  = new SigmaNormalClassifier(( SigmaNormalClassifier )Parent_2);

                ///nakata added
                Child_1.F /= Child_1.N;
                Child_2.F /= Child_2.N;
                //////////////

                Child_1.N   = Child_2.N = 1;
                Child_1.Exp = Child_2.Exp = 0;
                Child_1.St  = Child_2.St = 0;
                Child_1.M   = Child_2.M = 0;
                Child_1.S   = Child_2.S = 0;
                //Child_1.Epsilon_0 = Child_2.Epsilon_0 = Configuration.Epsilon_0;

                SigmaNormalClassifier SNP1 = ( SigmaNormalClassifier )Parent_1;
                SigmaNormalClassifier SNP2 = ( SigmaNormalClassifier )Parent_2;
                SigmaNormalClassifier SNC1 = ( SigmaNormalClassifier )Child_1;
                SigmaNormalClassifier SNC2 = ( SigmaNormalClassifier )Child_2;

                // 交叉
                if (Configuration.MT.NextDouble() < Configuration.Chai)
                {
                    Child_1.Crossover(Child_2);
                    Child_1.P = (Parent_1.P + Parent_2.P) / 2;
                    //Child_1.Epsilon = Parent_1.Epsilon + Parent_2.Epsilon;
                    Child_1.Epsilon = (Parent_1.Epsilon + Parent_2.Epsilon) / 2;
                    Child_1.F       = (Parent_1.F + Parent_2.F) / 2;

                    Child_1.Epsilon_0 = (Parent_1.Epsilon_0 + Parent_2.Epsilon_0) / 2;
                    //Child_1.Epsilon_0 = Math.Min(Parent_1.Epsilon_0, Parent_2.Epsilon_0);
                    Child_2.P       = Child_1.P;
                    Child_2.Epsilon = Child_1.Epsilon;
                    Child_2.F       = Child_1.F;

                    Child_2.Epsilon_0 = Child_1.Epsilon_0;

                    for (int i = 0; i < SNC1.WinningRate.Count(); i++)
                    {
                        SNC1.WinningRate[i] = SNC2.WinningRate[i] = (SNP1.WinningRate[i] + SNP2.WinningRate[i]) / 2;
                    }
                }

                Child_1.F *= 0.1;
                Child_2.F *= 0.1;

                for (int i = 0; i < SNC1.WinningRate.Count(); i++)
                {
                    SNC1.WinningRate[i] *= 0.1;
                    SNC2.WinningRate[i] *= 0.1;
                }

                // bothChild
                Child_1.Mutation(Situation);
                Child_2.Mutation(Situation);
                if (Child_1.C.state[4] == '0' & Child_1.C.state[7] == '1')//"bath0 rehabi1"
                {
                    Configuration.Problem.WriteLine(Child_1.C.state + "," + Configuration.T + "," + Child_1.P + "," + Child_1.M + "," + Child_1.Epsilon + "," + Child_1.F + ","
                                                    + Child_1.N + "," + Child_1.Exp + "," + Child_1.Ts + "," + Child_1.As + "," + Child_1.Kappa + "," + Child_1.Epsilon_0 + "," + Child_1.St + "," + Child_1.GenerateTime + ", child 2 ");
                    Configuration.Problem.WriteLine(Parent_1.C.state + "," + Configuration.T + "," + Parent_1.P + "," + Parent_1.M + "," + Parent_1.Epsilon + "," + Parent_1.F + ","
                                                    + Parent_1.N + "," + Parent_1.Exp + "," + Parent_1.Ts + "," + Parent_1.As + "," + Parent_1.Kappa + "," + Parent_1.Epsilon_0 + "," + Parent_1.St + "," + Parent_1.GenerateTime + ",Parent1");

                    Configuration.Problem.WriteLine(Parent_2.C.state + "," + Configuration.T + "," + Parent_2.P + "," + Parent_2.M + "," + Parent_2.Epsilon + "," + Parent_2.F + ","
                                                    + Parent_2.N + "," + Parent_2.Exp + "," + Parent_2.Ts + "," + Parent_2.As + "," + Parent_2.Kappa + "," + Parent_2.Epsilon_0 + "," + Parent_2.St + "," + Parent_2.GenerateTime + ",Parent2");
                }

                if (Child_2.C.state[4] == '0' & Child_2.C.state[7] == '1')//"bath0 rehabi1"
                {
                    Configuration.Problem.WriteLine(Child_2.C.state + "," + Configuration.T + "," + Child_2.P + "," + Child_2.M + "," + Child_2.Epsilon + "," + Child_2.F + ","
                                                    + Child_2.N + "," + Child_2.Exp + "," + Child_2.Ts + "," + Child_2.As + "," + Child_2.Kappa + "," + Child_2.Epsilon_0 + "," + Child_2.St + "," + Child_2.GenerateTime + ",child 2");
                    Configuration.Problem.WriteLine(Parent_1.C.state + "," + Configuration.T + "," + Parent_1.P + "," + Parent_1.M + "," + Parent_1.Epsilon + "," + Parent_1.F + ","
                                                    + Parent_1.N + "," + Parent_1.Exp + "," + Parent_1.Ts + "," + Parent_1.As + "," + Parent_1.Kappa + "," + Parent_1.Epsilon_0 + "," + Parent_1.St + "," + Parent_1.GenerateTime + ",Parent1");

                    Configuration.Problem.WriteLine(Parent_2.C.state + "," + Configuration.T + "," + Parent_2.P + "," + Parent_2.M + "," + Parent_2.Epsilon + "," + Parent_2.F + ","
                                                    + Parent_2.N + "," + Parent_2.Exp + "," + Parent_2.Ts + "," + Parent_2.As + "," + Parent_2.Kappa + "," + Parent_2.Epsilon_0 + "," + Parent_2.St + "," + Parent_2.GenerateTime + ",Parent2");
                }
                if (Configuration.DoGASubsumption)
                {
                    if (Parent_1.DoesSubsume(Child_1))
                    {
                        Parent_1.N++;
                    }
                    else if (Parent_2.DoesSubsume(Child_1))
                    {
                        Parent_2.N++;
                    }
                    else
                    {
                        P.Insert(Child_1);
                    }
                    P.Delete();

                    if (Parent_1.DoesSubsume(Child_2))
                    {
                        Parent_1.N++;
                    }
                    else if (Parent_2.DoesSubsume(Child_2))
                    {
                        Parent_2.N++;
                    }
                    else
                    {
                        P.Insert(Child_2);
                    }
                    P.Delete();
                }
                else
                {
                    P.Insert(Child_1);
                    P.Delete();
                    P.Insert(Child_2);
                    P.Delete();
                }
            }
        }
 /// <summary>
 /// Classifier消去
 /// </summary>
 /// <param name="C"></param>
 public abstract void Remove( Classifier C );
 // ListからClassifier削除
 public override void Remove(Classifier C)
 {
     this.CList.Remove(C);
 }
Example #28
0
        // 包摂
        protected override void Subsumption(Population Pop)
        {
            List <Classifier> copyActionSet = new List <Classifier>();

            foreach (Classifier classifier in CList)
            {
                copyActionSet.Add(classifier);
            }
            int N = copyActionSet.Count;

            //最大N回実行する
            //for (int i = 0; i < N; i++)
            //{
            #region subsume
            Classifier Cl = null;

            //actionsetなかに最も一般的な分類子をClにする
            foreach (Classifier C in copyActionSet)
            {
                if (C.CouldSubsume())
                {
                    if ((Cl == null) || (C.C.NumberOfSharp > Cl.C.NumberOfSharp) || ((C.C.NumberOfSharp == Cl.C.NumberOfSharp) && (Configuration.MT.NextDouble() < 0.5)))
                    {
                        Cl = C;
                    }
                }
            }

            if (Cl != null)
            {
                // 削除中にforeachできない

                List <Classifier> CL = new List <Classifier>();

                // 包摂された、削除したいClassifier C をCLに登録
                foreach (Classifier C in copyActionSet)
                {
                    if (Cl.IsMoreGeneral(C))
                    {
                        SigmaNormalClassifier Snc_ko  = (SigmaNormalClassifier)C;
                        SigmaNormalClassifier Snc_oya = (SigmaNormalClassifier)Cl;

                        // e0 の値を3位まで見る、近いものは差がないとみなす
                        var subsumer = Math.Round(Cl.Epsilon_0, 3);
                        var subsumed = Math.Round(C.Epsilon_0, 3);

                        if ((subsumer <= (subsumed + subsumer / 10)) &&
                            Snc_ko.IsConvergenceEpsilon() &&
                            Snc_oya.IsConvergenceEpsilon()
                            )
                        {
                            Cl.N += C.N;

                            CL.Add(C);
                        }
                    }
                }

                foreach (Classifier C in CL)
                {
                    SigmaNormalClassifier SNC = (SigmaNormalClassifier)Cl;


                    if (C.C.state[4] == '0' & C.C.state[7] == '1')    //"bath0 rehabi1"
                    {
                        Configuration.Problem.WriteLine(C.C.state + "," + Configuration.T + "," + C.P + "," + C.M + "," + C.Epsilon + "," + C.F + "," + C.N + "," + C.Exp + "," + C.Ts + "," + C.As + "," + C.Kappa + "," + C.Epsilon_0 + "," + C.St + "," + C.GenerateTime + ", in AS");
                    }

                    this.Remove(C);   //as から削除
                    Pop.Remove(C);    //pop から削除
                }

                //いまの最も一般化されたものを削除する
                //copyActionSet.Remove(Cl);
            }
            #endregion
            //}
        }
Example #29
0
 /// <summary>
 /// 分類子追加 かぶらないと分かっているのでInsertと統合可能
 /// </summary>
 /// <param name="C">生成された分類子を追加</param>
 abstract public void Add(Classifier C);
Example #30
0
 /// <summary>
 /// Classifier消去
 /// </summary>
 /// <param name="C"></param>
 public abstract void Remove( Classifier C );
Example #31
0
 /// <summary>
 /// 交差
 /// </summary>
 /// <param name="C">交差相手</param>
 public abstract void Crossover( Classifier C );
        //学習終了後に圧縮にする
        public override void Compact()
        {
            List <Classifier> copyActionSet = new List <Classifier>();

            foreach (Classifier classifier in CList)
            {
                copyActionSet.Add(classifier);
            }

            int N = copyActionSet.Count;

            for (int i = 0; i < N; i++)
            {
                #region subsume
                Classifier Cl = null;

                //なかに最も一般的な分類子をClにする
                foreach (Classifier C in copyActionSet)
                {
                    if (C.CouldSubsume())
                    {
                        if ((Cl == null) || (C.C.NumberOfSharp > Cl.C.NumberOfSharp) || ((C.C.NumberOfSharp == Cl.C.NumberOfSharp) && (Configuration.MT.NextDouble() < 0.5)))
                        {
                            Cl = C;
                        }
                    }
                }

                //Cl が包摂できる分類子を吸収する
                if (Cl != null)
                {
                    // 削除中にforeachできない
                    List <Classifier> CL = new List <Classifier>();

                    foreach (Classifier C in copyActionSet)
                    {
                        if (Cl.IsMoreGeneral(C))
                        {
                            SigmaNormalClassifier Snc_ko  = (SigmaNormalClassifier)C;
                            SigmaNormalClassifier Snc_oya = (SigmaNormalClassifier)Cl;
                            //10の数字は適当 可変にするか? 1/10にする 10-7 あんまり変わらない
                            //分散が同じの判断基準 他に??t test を使う 予定  特殊化がでない
                            //
                            //double t = (Snc_oya.M - Snc_ko.M)/Math.Sqrt(Snc_oya.S/30 + Snc_ko.S/30);

                            //double studentT = StudentT.InvCDF(0, 1, 60, 0.005);

                            //if (t < studentT || t > Math.Abs(studentT))//t test で有意差がある 包摂しない
                            //{

                            //}
                            // else//有意差がない 統合しでもよい ただ 特殊化ルールどう識別するか
                            //{
                            if (/*Math.Abs(Cl.M - C.M) < 10 &&*/
                                // Math.Abs(Cl.Epsilon_0 - C.Epsilon_0)< 10&&
                                // Cl.Kappa == 1
                                //&& Snc_oya.Epsilon < Snc_ko.Epsilon
                                (Cl.Epsilon_0 < C.Epsilon_0 || Math.Abs(Cl.Epsilon_0 - C.Epsilon_0) < Cl.Epsilon_0 / 10)
                                //&& Math.Abs(Cl.Epsilon_0 - C.Epsilon_0) < 10//case 1 +- 10
                                // Cl.Epsilon < C.Epsilon
                                && Snc_ko.IsConvergenceEpsilon() &&
                                Snc_oya.IsConvergenceEpsilon()

                                ) //
                            {
                                Cl.N += C.N;
                                // 包摂された、削除したいClassifier C をCLに登録
                                CL.Add(C);
                            }
                            // }
                        }
                    }

                    foreach (Classifier C in CL)
                    {
                        this.Remove(C);//包摂された分類子 C を pop からCを削除
                    }
                }

                //最も一般化されるもの copyActionSetからを削除 
                copyActionSet.Remove(Cl);

                #endregion
            }
        }
Example #33
0
 /// <summary>
 /// 包摂できるか
 /// </summary>
 /// <param name="C">包摂相手</param>
 /// <returns>包摂できる(true)</returns>
 public abstract bool DoesSubsume( Classifier C );
 // Actionsetから削除
 public override void Remove( Classifier C )
 {
     this.CList.Remove( C );
 }
        protected override double DeletionVote( Classifier C, double AvFitness )
        {
            double Vote = C.As * C.N;

            if( ( C.Exp > Configuration.Theta_del ) && ( C.F / C.N < Configuration.Delta * AvFitness ) )
            {
                //Vote *= AvFitness / ( C.F / C.N )* (C.Epsilon_0/SumEpsilon_0()); //2015/10/8 cho ε小さいのも残す
                //Vote *= AvFitness / (C.F / C.N) * (C.Epsilon_0 / MaxEpsilon_0());//10-14 chou failled
                Vote *= AvFitness / (C.F / C.N);
            }

            return Vote;
        }