예제 #1
0
        // とりあえず書いておく
        public void anneal(double inittemp, int Nepoch, int Niter, double tconst,
                           int Nprof, Action <int, int, double, int> callback = null,
                           bool inSlot = false, bool complexloss = true)
        {
            double exist_loss  = exist_count();
            int    change_loss = change_count();
            int    cont_bonus  = continue_count(Nprof);
            int    gap_loss    = gap_count(Nprof);
            double loss        = exist_loss * OVERLAP_PENALTY + change_loss * CHANGE_PENALTY
                                 + gap_loss * GAP_PENALTY - cont_bonus * CONTINUE_BONUS;
            double temp = inittemp;

            for (int j = 0; j < Nepoch; j++)
            {
                for (int i = 0; i < Niter; i++)
                {
                    Eventpair p = new Eventpair(this, inSlot);
                    p.swap();
                    exist_loss = exist_count();
                    if (complexloss)
                    {
                        change_loss = change_count();
                        cont_bonus  = continue_count(Nprof);
                        gap_loss    = gap_count(Nprof);
                    }
                    else
                    {
                        change_loss = cont_bonus = gap_loss = 0;
                    }
                    double newloss = exist_loss * OVERLAP_PENALTY + change_loss * CHANGE_PENALTY
                                     + gap_loss * GAP_PENALTY - cont_bonus * CONTINUE_BONUS;
                    if (newloss < loss)
                    {
                        loss = newloss;
                        if (callback != null)
                        {
                            callback(j, i, loss, (int)exist_loss);
                        }
                    }
                    else
                    {
                        double prob = Math.Exp((loss - newloss) / temp);
                        if (rand.NextDouble() < prob)
                        {
                            loss = newloss;
                            if (callback != null)
                            {
                                callback(j, i, loss, (int)exist_loss);
                            }
                        }
                        else
                        {
                            p.swap();
                        }
                    }
                }
                temp /= tconst;
            }
        }
예제 #2
0
 // かき混ぜる
 public void shuffle(int Niter)
 {
     for (int i = 0; i < Niter; i++)
     {
         Eventpair p = new Eventpair(this);
         p.swap();
     }
 }
예제 #3
0
        // とりあえず書いておく
        public void anneal(double inittemp, int Nepoch, int Niter, double tconst = 2.0, Action <int, int, double> callback = null)
        {
            double loss = this.loss();
            double temp = inittemp;

            for (int j = 0; j < Nepoch; j++)
            {
                for (int i = 0; i < Niter; i++)
                {
                    Eventpair p = new Eventpair(this);
                    p.swap();
                    double newloss = this.loss();
                    if (newloss < loss)
                    {
                        loss = newloss;
                        if (callback != null)
                        {
                            callback(j, i, loss);
                        }
                    }
                    else
                    {
                        double prob = Math.Exp((loss - newloss) / temp);
                        if (rand.NextDouble() < prob)
                        {
                            loss = newloss;
                            if (callback != null)
                            {
                                callback(j, i, loss);
                            }
                        }
                        else
                        {
                            p.swap();
                        }
                    }
                }
                temp /= tconst;
            }
        }