public void CalculateWeights(BoltzmannMachine logic) { for (int sourceTour = 0; sourceTour < NUM_CITIES; sourceTour++) { for (int sourceCity = 0; sourceCity < NUM_CITIES; sourceCity++) { int sourceIndex = sourceTour * NUM_CITIES + sourceCity; for (int targetTour = 0; targetTour < NUM_CITIES; targetTour++) { for (int targetCity = 0; targetCity < NUM_CITIES; targetCity++) { int targetIndex = targetTour * NUM_CITIES + targetCity; double weight = 0; if (sourceIndex != targetIndex) { int predTargetTour = (targetTour == 0 ? NUM_CITIES - 1 : targetTour - 1); int succTargetTour = (targetTour == NUM_CITIES - 1 ? 0 : targetTour + 1); if ((sourceTour == targetTour) || (sourceCity == targetCity)) { weight = -gamma; } else if ((sourceTour == predTargetTour) || (sourceTour == succTargetTour)) { weight = -distance[sourceCity][targetCity]; } } logic.SetWeight(sourceIndex, targetIndex, weight); } } logic.Threshold[sourceIndex] = -gamma / 2; } } }
public void run() { var boltz = new BoltzmannMachine(NEURON_COUNT); CreateCities(); CalculateWeights(boltz); boltz.Temperature = 100; do { boltz.EstablishEquilibrium(); Console.WriteLine(boltz.Temperature + " : " + DisplayTour(boltz.CurrentState)); boltz.DecreaseTemperature(0.99); } while (!IsValidTour(boltz.CurrentState)); Console.WriteLine("Final Length: " + LengthOfTour(boltz.CurrentState)); }