// とりあえず書いておく 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; } }
// かき混ぜる public void shuffle(int Niter) { for (int i = 0; i < Niter; i++) { Eventpair p = new Eventpair(this); p.swap(); } }
// とりあえず書いておく 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; } }