Kod üzerine Tavlama Benzetimi (Simulated Annealing) algoritmasını kurmak

Merhaba, Tavlama Benzetimi konusunda bir başlık açmıştım. daha açıklayıcı olması ve açık bir biçimde kodu paylaşıp yardım talep etmek için tekrar buradayım. Tavlama benzetimi yapılacak kodu hyperlinkte paylaştım. simanneal python için bu işi kolaylıyormuş.
simanneal kütüphanesini ve Traveling Salesman problemini çözdüm birkaç değişiklik de yaptım. Fakat liste sırlamasına nasıl uyarlayabilirim anlamadım.

Main.py github linkim kod

Kod excelden veri alarak çalışıyor. şu an hali hazırda 6x5 (6 iş 5 makine) verileri yüklü. Run edince makineye 5 işe 6 değerlerini girip işle ve getir ardından çalıştır dediğimizde hesap yapıyor.
kodda yukarıdaki algoritmalar sonucunda bir sıralama buluyorum bu da başlangıç sıralamam
Tavlama benzetimi kullanımı için aşağıdaki değişkenleri bilmeniz gerekiyor.

sonuc_siralamasi —> algoritmalar sonucu en iyi sıralama (başlangıç sıralaması)
SA(yazmasirasi) —>Bu fonksiyonumuz çağrılınca Gannt Hesabı ile Fmax buluyor
Sa_fmax ----> FMax değeri yani SA(yazmasirasi) fonksiyonun bulduğu değer. En küçükleme yapmak istediğimiz. 53’e yaklaşmalı
Simulated_sira ------> fonksiyonda hesaplanacak sıra. aynı zamanda move ile yeri değiştirilecek sıra
Aslında amaç 53 ü bulmaktan ziyade 55i geliştirebilmek.

Kodun temiz biçimde yazılmamasından dolayı yalnızca yukarıdaki açıklamaların işe yarayacağını düşünmekteyim.
SA(yazmasirasi) bu fonksiyon sıralamanın değerini fmaxını buluyor. en önemli bilinmez bu olmalı.

yani sizden talebim. kodun 1035. satırına tavlama benzetimi algoritması kurabilmeniz. (böyle betimliyorum çünkü temiz bir kod değil ve bunun için sürem malesef yok :frowning: ) run etme şartını da yukarıda belirttim tkintere 5 ve 6 değeri girip işleyip çalıştırdıktan sonra konsol çalışır.

Şimdiden teşekkür ediyor, dilerseniz çıkacak makalede isminizi de paylaşmayı teklif ediyorum. İyi çalışmalar dilerim :pray:

Referans olsun diye buraya iki degisik SA modulu kullanan kodu birakiyorum:

import itertools
import math
import random

import numpy
import scipy.optimize
import simanneal

inp  = list(itertools.permutations([1, 2, 3, 4, 5, 6, 7, 8]))
outp = list(range(len(inp)))

mapping = { tuple(k): v / len(inp) for k, v in zip(inp, random.sample(outp, len(outp))) }
def func(s):
	sp = tuple(map(lambda x: round(x), s))
	return mapping[sp]

def get_cost(state):
	return func(state)

def get_neighbors(state):
	states = []
	for i in range(len(state)):
		for j in range(i + 1, len(state)):
			s = list(state)
			tmp = s[i]
			s[i] = s[j]
			s[j] = tmp
			states.append(tuple(s))
	return states

# Burada yukaridaki iki fonksiyonu kullanan 3. bir yontem daha vardi ama calismadi

class TravellingSalesmanProblem(simanneal.Annealer):
	def __init__(self, state):
		super().__init__(state)

	def move(self):
		initial_energy = self.energy()
		self.state = step(self.state)
		return self.energy() - initial_energy

	def energy(self):
		return func(self.state)

def step(state):
	muts = list(state)
	a = random.randint(0, len(muts) - 1)
	b = random.randint(0, len(muts) - 1)
	muts[a], muts[b] = muts[b], muts[a]
	return tuple(muts)

bh = scipy.optimize.basinhopping(func, (1, 2, 3, 4, 5, 6, 7, 8), take_step=step, niter=2000)
print(f"{bh.x} = {bh.fun:.6f}, {bh.message}")

sa = TravellingSalesmanProblem((1, 2, 3, 4, 5, 6, 7, 8))
sa.set_schedule(sa.auto(minutes=0.001))
sa.copy_strategy = "slice"
state, e = sa.anneal()
print("")
print(f"{state}, e={e:.6f}, c={func(state):.3f}")

OP’nin kodunu cozmeye vakti olan biri direk buraya takabilir.

2 Beğeni