Bu calisma 5 ve 6 mart 2018 tarihlerinde Süleyman Demirel Üniversitesi Robotik ve İnovasyon Topluluğu'na sunulmak üzere Uzay Cetin tarafindan hazirlanmistir. Ayrica bu calisma Sariyer Akademi'de duzenlenen Liseler için Yapay Zekaya Giriş Eğitimi'nde ve Istanbul Bilgi Universitesi CMPE373 Agent-Based Modeling dersinde kullanılacaktır.
from IPython.display import HTML
# Youtube
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/NGtzSd3wFY4" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>')
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/XcinBPhgT7M" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>')
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/uwz8JzrEwWY" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>')
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/cP035M_w82s" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>')
rationality is relative to performance measure. A rational agent tries to maximize its perfomance measure.
import numpy as np
kisi1 = [np.random.choice([0,1]) for i in range(5)]
kisi1
kisi2 = [np.random.choice([0,1]) for i in range(5)]
kisi2
def kisi(n):
return [np.random.choice([0,1]) for i in range(n)]
kisi(4)
def uyum(kisi):
return np.mean(kisi)
uyum(kisi1)
toplum = np.array([kisi(5) for i in range(10)])
toplum
toplum[1]
uyumlar = np.array([uyum(toplum[i]) for i in range(10)])
uyumlar
olasiliklar = uyumlar / uyumlar.sum()
olasiliklar
print(olasiliklar.argsort())
eniyi = olasiliklar.argsort()[-1]
eniyi
toplum[eniyi]
secim = np.random.choice(10, 2, replace= False, p=olasiliklar)
secim
toplum[secim]
kisi0 = toplum[secim[0]]
print("kisi0: ", kisi0)
kisi1 = toplum[secim[1]]
print("kisi1: ", kisi1)
n = len(kisi0)//2
print("Kesim noktasi: ",n)
print(kisi0[:n], kisi1[n:])
# birlestir
np.hstack((kisi0[:n],kisi1[n:]))
help(np.random.rand)
print(toplum.shape)
print(toplum.shape[1])
z = np.zeros((3,5))
z
z[1] = np.array([1,1,1,1,1])
z
z[[0,2]] = np.array(
[[2,2,2,2,2],
[2,2,2,2,2]])
z
# global array degeri fonksiyon icinden degisiyor
a = np.array([1,1,1,1])
def degisim(a):
a[0] = 4
degisim(a)
a
# global int degeri fonksiyon icinden degisMIYOR
a = 0
def my_function(a):
a = 3
my_function(a)
print(a)
# hizli matris ve vektor islemleri icin,
# Numpy kutuphanesinden yararlaniyoruz
import numpy as np
#################################################################
def kisi1(n):
""" n uzunlugunda 0-1'lerden olusan genotip
ornek: kisi(4) >> [1, 0, 1, 1]
"""
return [np.random.choice([0,1]) for i in range(n)]
def uyum1(kisi):
""" probleme gore uyum degisir.
Burada maksimizasyon probleminde, ne kadar cok bire sahipseniz o kadar uyumlusunuz."""
return np.mean(kisi)
def mutasyon1(kisi, p):
""" p olasilikla kisinin bir biti degistirilir."""
if np.random.rand() < p:
m = np.random.choice(len(kisi))
if(kisi[m] == 0):
kisi[m] = 1
else:
kisi[m] = 0
#################################################################
def olasilik(toplum, uyum = uyum1, elitist = True):
"""her bireyin uyum degeri hesaplanip, olasilik degerine dondurulur.
(uyumlar) [0.2, 0.2, 0.4, 0.4, 0.8] >> (olasiliklar) [0.1, 0.1, 0.2, 0.2, 0.4]
if elitist == True
[0.2, 0.2, 0.4, 0.4, 0.8] >>[ 0.10225857, 0.10225857, 0.16859588, 0.16859588, 0.45829111]
"""
uyumlar = np.array([uyum(toplum[i]) for i in range(len(toplum))])
if elitist:
uyumlar = np.exp(uyumlar / uyumlar.mean()) # ortalamadan kucuk degerler iyice kuculur
olasiliklar = uyumlar / uyumlar.sum()
return olasiliklar
def secim(olasiliklar):
"""p=olasiliklara gore bireyler secilir. Olasiligi yuksek olan daha fazla secilir."""
secim = np.random.choice(len(olasiliklar), 2, replace= False, p=olasiliklar)
return secim
def caprazlama(toplum, secim):
"""Basarili 2 birey kisi0 ve kisi1 secilip caprazlanir."""
kisi0 = toplum[secim[0]]
kisi1 = toplum[secim[1]]
n = len(toplum[secim[0]])//2
return np.hstack((kisi0[:n],kisi1[n:]))
def yeni_toplum(toplum, olasiliklar, mutasyon = mutasyon1, p = 0.05):
""" Toplumun (basarisiz) yarisi emekli edilip,
basarili bireylerin cocuklari topluma eklenecek.
"""
k = len(toplum)//2
emekli = olasiliklar.argsort()[:k] # basarisizlar
#yeniler = np.zeros((k,toplum.shape[1]))
for i in range(k):
s = secim(olasiliklar)
yeni_kisi = caprazlama(toplum, s)
mutasyon(yeni_kisi, p)
#yeniler[i] = yeni_kisi
toplum[emekli[i]]= yeni_kisi
#toplum[emekli] = yeniler
return toplum
def en_iyi(toplum, olasiliklar):
eniyi = olasiliklar.argsort()[-1]
return toplum[eniyi]
N = 20 # Toplumdaki kisi sayisi N
n = 20 # kisilerin bit uzunlugu
toplum = np.array([kisi1(n) for i in range(N)])
olasiliklar = olasilik(toplum)
if N < 40:
print(toplum)
print(olasiliklar)
print(en_iyi(toplum, olasiliklar))
for i in range(1000):
toplum = yeni_toplum(toplum, olasiliklar)
olasiliklar = olasilik(toplum)
if N < 40:
print(toplum)
print(olasiliklar)
print(en_iyi(toplum, olasiliklar))
Pedro Domingos Master Algoritma kitabindan,
import matplotlib.pyplot as plt
plt.plot([2.25,3.75], [5,5], 'go', markersize=40)
plt.plot([3], [3], 'r^', markersize=60)
plt.plot([2.5,3,3.5], [1.15,1,1.15], 'b', linewidth=8)
plt.axis((1,5,0,6))
plt.show()
gozler = [2.25,3.75,5,5,4] # 40 yerine 4 yazdim, butun degerler 1-10 arasinda olsun
burun = [3,3,6]# ayni nedenle 60 yerine 6 yazdim,
agiz = [2.5,3,3.5, 1.15,1,1.15,8]
adam = np.array(gozler + burun + agiz)
adam
def adam_ciz(adam):
plt.plot([adam[0],adam[1]], [adam[2],adam[3]], 'go', markersize=adam[4]*10)
plt.plot(adam[5], adam[6], 'r^', markersize=adam[7]*10)
plt.plot([adam[8],adam[9],adam[10]], [adam[11],adam[12],adam[13]], 'b', linewidth=adam[14])
plt.show()
adam_ciz(adam)
len(adam)
# rastegele 15 elemanli, degerler 1-10 arasinda olan, bir vektor yazalim
v = np.random.rand(15) * 10
v
adam_ciz(v)
1/ (1 + sum((adam - v)**2))
sum(np.array([0,4,3])**2)
#################################################################
def kisi2():
# rastegele 15 elemanli, degerler 1-10 arasinda olan, bir vektor yazalim
return np.random.rand(15) * 10
def uyum2(birey):
return 1/ (1 + sum((adam - birey)**2))
def mutasyon2(kisi, p):
""" p olasilikla kisinin bir ozelligine 0-10 arasinda rastgele
deger atanir."""
if np.random.rand() < p:
m = np.random.choice(len(kisi))
kisi[m] = np.random.rand() * 10
#################################################################
N = 100 # Toplumdaki kisi sayisi N
toplum = np.array([kisi2() for i in range(N)])
olasiliklar = olasilik(toplum, uyum=uyum2)
adam_ciz(en_iyi(toplum, olasiliklar))
for i in range(100):
toplum = yeni_toplum(toplum, olasiliklar, mutasyon = mutasyon2, p= 0.15)
olasiliklar = olasilik(toplum, uyum=uyum2)
adam_ciz(en_iyi(toplum, olasiliklar))
for i in range(100):
toplum = yeni_toplum(toplum, olasiliklar, mutasyon = mutasyon2, p= 0.15)
olasiliklar = olasilik(toplum, uyum=uyum2)
adam_ciz(en_iyi(toplum, olasiliklar))
for i in range(100):
toplum = yeni_toplum(toplum, olasiliklar, mutasyon = mutasyon2, p= 0.15)
olasiliklar = olasilik(toplum, uyum=uyum2)
adam_ciz(en_iyi(toplum, olasiliklar))
hx, hy = 5, 5 # hedef
x, y = 2, 0 # baslangic
yolx = [x]
yoly = [y]
def ciz():
global x, y
plt.plot(hx, hy, 'go', markersize=10)
plt.plot(x, y, 'r^', markersize=15)
plt.plot(yolx, yoly)
plt.axis((-2,hx+2,0,hx+2))
plt.grid()
plt.show()
ciz()
def sag():
global x, y
x = x +1
yolx.append(x)
yoly.append(y)
def sol():
global x, y
x = x -1
yolx.append(x)
yoly.append(y)
def yukari():
global x, y
y = y + 1
yolx.append(x)
yoly.append(y)
def reset():
global yolx, yoly, x, y
x, y = 2, 0 # baslangic
yolx = [x]
yoly = [y]
reset()
yukari()
sag()
yukari()
sag()
yukari()
sag()
yukari()
sol()
print(yolx)
print(yoly)
ciz()
hareket = {"YUK":yukari, "SAG":sag, "SOL":sol}
cozum = np.random.choice(["YUK","SAG","SOL"], 8)
cozum
m = np.random.choice(len(cozum))
m
cozum[m] = np.random.choice(["YUK","SAG","SOL"])
cozum
cozum1 = np.random.choice(["YUK","SAG","SOL"], 8)
cozum2 = np.random.choice(["YUK","SAG","SOL"], 8)
print(cozum1)
print(cozum2)
n =3
np.hstack((cozum1[:n],cozum2[n:]))
reset()
for c in cozum:
hareket[c]()
print(yolx)
print(yoly)
ciz()
def cozumciz(cozum):
reset()
for c in cozum:
hareket[c]()
print(yolx)
print(yoly)
ciz()
#################################################################
def kisi3(n = 8):
""" n uzunlugunda OYA harflerinden olusan genotip
ornek: kisi3() >> ['SAG', 'YUK', 'SOL', 'YUK', 'YUK', 'SAG', 'YUK', 'SOL']
"""
return np.random.choice(["YUK","SAG","SOL"], 8)
def uyum3(cozum):
""" probleme gore uyum degisir.
Burada maksimizasyon probleminde, ne kadar cok bire sahipseniz o kadar uyumlusunuz."""
reset()
for c in cozum:
hareket[c]()
fark_kare = (yolx[-1] - hx)**2 + (yoly[-1] - hy)**2
return 1/(1+fark_kare**(0.5))
def mutasyon3(kisi, p):
""" p olasilikla kisinin bir ozelligine OYA harflerinden rastgele
biri atanir."""
if np.random.rand() < p:
m = np.random.choice(len(kisi))
kisi[m] = np.random.choice(["YUK","SAG","SOL"])
#################################################################
N = 10 # Toplumdaki kisi sayisi N
toplum = np.array([kisi3() for i in range(N)])
olasiliklar = olasilik(toplum, uyum=uyum3)
eniyi = en_iyi(toplum, olasiliklar)
eniyi
toplum
cozumciz(eniyi)
for i in range(10):
toplum = yeni_toplum(toplum, olasiliklar, mutasyon = mutasyon3, p= 0.15)
olasiliklar = olasilik(toplum, uyum=uyum3)
cozumciz(en_iyi(toplum, olasiliklar))
for i in range(10):
toplum = yeni_toplum(toplum, olasiliklar, mutasyon = mutasyon3, p= 0.15)
olasiliklar = olasilik(toplum, uyum=uyum3)
cozumciz(en_iyi(toplum, olasiliklar))
toplum
for i in range(10):
toplum = yeni_toplum(toplum, olasiliklar, mutasyon = mutasyon3, p= 0.15)
olasiliklar = olasilik(toplum, uyum=uyum3)
cozumciz(en_iyi(toplum, olasiliklar))
toplum