Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1516:logistische_probleme:annealing

Der Code für das Simulated Annealing. fcool steht für den Abkühlungsfaktor.

# -*- coding: utf8 -*-
 
import read
from auswertungsprogramm import *
from simulation import *
from nfaq import *
import copy
import math
import random
from tauschheuristik import tauschen
 
 
def annealing(zuege, streckendaten, anschlussdaten, fcool):
    T = 1  # Temperatur wird auf 1 gesetzt
    Tmin = 0.1  # Temperatur bei der abgebrochen werden soll
 
    bestereihe = zuege
    bestesergebnis = auswertung(simulieren(bestereihe), anschlussdaten)
    ralt = copy.deepcopy(bestereihe)
    salt = copy.deepcopy(bestesergebnis)
    counter = 0
    while T > Tmin:
        for i in range(0,25): # pro Temperatur wird öfters simuliert
 
            rneu = tauschen( zuege, random.randint( 0, len( zuege ) - 1 ), random.randint( 0, len( zuege ) - 1 ) )  # zufaelliges tauschen zweier Zuege
            rneu = deepcopy(rneu)
            sneu = auswertung( simulieren(rneu), anschlussdaten)
            if akzeptanz(salt, sneu, T) > random.random(): # Akzeptanz wird mit random wert (0-1) verglichen, ggf gewechselt
                salt = sneu
                ralt = rneu
            if salt < bestesergebnis: # Wenn globales Optimum gefunden, dieses festlegen
                bestesergebnis = copy.deepcopy(salt)
                bestereihe = copy.deepcopy(ralt)
            counter += 1
        T = T*fcool
 
    print("SimAnn: " + str(counter) + " Tauschversuche durchgeführt")
    return bestereihe
 
 
def akzeptanz(salt, sneu, T):
    return math.exp((salt-sneu)/(1000*T))
ws1516/logistische_probleme/annealing.txt · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)