Gecen haftaki Oyun

Gecen haftaki Oyun

Ege Demir'in NetLogo Kodu

Python Giris Kodlari

Netlogo ve R dillerinde daha önce gördüğümüz, veri tipleri, fonksiyonlar, kontrol yapıları ve döndüler pythın dilinin de temellerini oluşturur.

In [1]:
# Liste
L = [1, [1,2], 3]
print(L)
[1, [1, 2], 3]
In [2]:
print(L[0])
1
In [3]:
print(L[1])
[1, 2]
In [4]:
# Listenin uzunlugu
print(len(L))
3

Python Felsefesi

Sadelik, karmaşadan üstündür.

In [5]:
a, b = 1, 8
a, b = b, a
print(a," ",b)
8   1
In [6]:
# Fonksiyon: Bir adi olan kod paketi
def degis(a,b):
    """Iki degiskenin degerlerini degistirir."""
    a, b = b, a
    return a, b

x, y = 3, 4
print("x, y = ", degis(x,y))
x, y =  (4, 3)
In [7]:
# Kontol
if(x > y):
    print(x, ",", y, "den buyuk")
else:
    print(y, ",", x, "den buyuk")
4 , 3 den buyuk
In [8]:
def kategori(yas):
    if yas<=18:
        durum="cocuk"
    elif yas>65:
        durum="emekli"
    else:
        durum="yetiskin"
    return durum

yas = input("yasinizi giriniz: ")
print("\t kategoriniz: ", kategori(int(yas)))
yasinizi giriniz: 3
	 kategoriniz:  cocuk
In [9]:
Say = [1,2,3,4,5,6,7]
for i in Say:  
    print(i**2)    
1
4
9
16
25
36
49
In [10]:
# range([bas,] son [,adim]) : bas varsayilan degeri 0, adim varsayilan degeri 1
for i in range(4,10,2):
    print(i)
4
6
8
In [11]:
# Dongu icerisinde 'yeter' yazilana kadar 'mesajiniz nedir?' diye soran program
mesaj = '' 
while mesaj != 'yeter': 
    mesaj = input("Mesajiniz nedir? ") 
    print(mesaj)
Mesajiniz nedir? 3
3
Mesajiniz nedir? yeter
yeter
In [12]:
# Dosya okuma
dosyaadi = "davet-siir.txt"
with open(dosyaadi) as file_object: 
    siir = file_object.readlines() 
    
for dize in siir:
    print(dize)
DAVET

Dörtnala gelip Uzak Asya'dan

Akdeniz'e bir kısrak başı gibi uzanan

		bu memleket, bizim.



Bilekler kan içinde, dişler kenetli, ayaklar çıplak

ve ipek bir halıya benziyen toprak,

		bu cehennem, bu cennet bizim.



Kapansın el kapıları, bir daha açılmasın,

yok edin insanın insana kulluğunu,

		bu dâvet bizim....



Yaşamak bir ağaç gibi tek ve hür

ve bir orman gibi kardeşçesine,

		bu hasret bizim...



Nâzım HİKMET
In [13]:
# Dosyaya yazma
# Ekleme icin "w" (write) yerine # "a" (append) yapin,
# Yoksa uzerine yazar
dosyaadi = "en-sevdigim-dize.txt"
with open(dosyaadi, "w") as file_object: 
    file_object.write("Yaşamak bir ağaç gibi tek ve hür\n")
    file_object.write("\tve bir orman gibi kardeşçesine")
    
In [14]:
# Simulate (or actually play) Guess the Number
#   The number lies in a given range. Choose the number in the middle.
#   If guess was too high, choose number in middle of lower half,
#   if guess was too low,  choose number in middle of upper half.
#   Halve the appropriate range & repeat unti the number is correct.
#   Authour: Alan Richmond, Python3.codes
 
binary=False                    # set this to True or False
lonum,hinum=1,128               # range for the number
 
import random as r
 
the_num=r.randint(lonum,hinum)  # computer chooses a number randomly
print("I'm thinking of a number between",lonum,"and",hinum)
 
lo=1
hi=hinum
guesses=0
 
for i in range(lonum,hinum):    # repeat this until guess is correct:
                                    # note the int!
#    guess=int(input ("What is your guess: ")) # uncomment to actually play
    if binary:  guess=lo+(hi-lo)//2     # integer division
    else:       guess=r.randint(lo,hi)
    print("Guess:",guess)
    guesses+=1                      # add 1 to count of guesses
                                    # check the guessed number
    if guess > the_num:
        print("Lower!")
        hi=guess                        # bring down the upper bound
    elif guess < the_num:
        print("Higher!")
        lo=guess                        # push up the lower bound
    else: break                     # yay!
 
print("That took",guesses,"guesses")
#print("That took {0} guesses".format(guesses)) # alternative to previous line
I'm thinking of a number between 1 and 128
Guess: 83
Higher!
Guess: 86
Higher!
Guess: 114
Lower!
Guess: 110
Lower!
Guess: 110
Lower!
Guess: 90
Lower!
Guess: 89
Lower!
Guess: 86
Higher!
Guess: 89
Lower!
Guess: 86
Higher!
Guess: 89
Lower!
Guess: 86
Higher!
Guess: 89
Lower!
Guess: 86
Higher!
Guess: 86
Higher!
Guess: 89
Lower!
Guess: 89
Lower!
Guess: 88
That took 18 guesses

Etmen-Temelli Modelleme Bakışı

Yaşamak bir ağaç gibi tek ve hür

ve bir orman gibi kardeşçesine

Etmenler tek ve hürdür :) ama birlikte toplumu yani birge'yi oluştururlar!

In [15]:
uzay = {"Star Wars": 4.5, "Superman": 3.5,"Batman": 4}
uzay["Star Wars"]
Out[15]:
4.5
In [16]:
# Sozlukler
DB = {
    "uzay" : {"Star Wars": 4.5, "Superman": 3.5,"Batman": 4,},
    "selin" : {"Venedik": 4.5, "Paris": 3.5,"Batman": 4,},
    "fatih" : {"Superman": 4,"Batman": 4},
}
print("\nUzay Begenileri: ", DB['uzay'])
print("Uzayin Star Wars filmine verdigi puan: ", DB['uzay']['Star Wars'])
Uzay Begenileri:  {'Star Wars': 4.5, 'Superman': 3.5, 'Batman': 4}
Uzayin Star Wars filmine verdigi puan:  4.5
In [17]:
# Yeni deger ekleme
DB.setdefault("Umut", {"Maymunlar Cehennemi": 4, "Babam ve Oglum": 3})
Out[17]:
{'Babam ve Oglum': 3, 'Maymunlar Cehennemi': 4}
In [18]:
for k in DB.keys():  
    print(k)  
uzay
selin
fatih
Umut
In [19]:
for deger in DB.values():  
    print(deger)  
{'Star Wars': 4.5, 'Superman': 3.5, 'Batman': 4}
{'Venedik': 4.5, 'Paris': 3.5, 'Batman': 4}
{'Superman': 4, 'Batman': 4}
{'Maymunlar Cehennemi': 4, 'Babam ve Oglum': 3}
In [20]:
# Ileri Liste Islemler
[x*5 for x in range(5)]
Out[20]:
[0, 5, 10, 15, 20]
In [21]:
[x for x in range(5) if x%2 == 0]
Out[21]:
[0, 2, 4]
In [130]:
import numpy as np
liste = np.array(range(5))
print(liste)
[0 1 2 3 4]
In [131]:
import math
for i in liste:
    print(math.sqrt(i))
0.0
1.0
1.4142135623730951
1.7320508075688772
2.0
In [132]:
liste = liste * liste
liste
Out[132]:
array([ 0,  1,  4,  9, 16])
In [134]:
liste[-3:]
Out[134]:
array([ 4,  9, 16])
In [25]:
liste.shape
Out[25]:
(5,)
In [26]:
len(liste)
Out[26]:
5
In [27]:
liste[2]
Out[27]:
4
In [28]:
liste[liste > 5]
Out[28]:
array([ 9, 16])
In [29]:
liste = np.append(liste, [25,36,49])
liste
Out[29]:
array([ 0,  1,  4,  9, 16, 25, 36, 49])
In [30]:
liste = liste - 16
liste
Out[30]:
array([-16, -15, -12,  -7,   0,   9,  20,  33])
In [31]:
liste[liste>0] = 1
liste[liste<0] = -1
liste
Out[31]:
array([-1, -1, -1, -1,  0,  1,  1,  1])
In [32]:
liste2 = np.zeros(8)
liste2[5:] = -1
liste2
Out[32]:
array([ 0.,  0.,  0.,  0.,  0., -1., -1., -1.])
In [33]:
liste + liste2
Out[33]:
array([-1., -1., -1., -1.,  0.,  0.,  0.,  0.])

Numpy (Numerical Python)

In [34]:
import numpy as np
np.random.seed(0)  # Tekrar uretim

# 20 defa yazi-tura atalim
dizi1 = np.random.randint(2, size=20)  # Bir boyutlu dizi, icinde 20 eleman var
print(dizi1)
[0 1 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1]
In [35]:
# Agirlik matrisi
theta = np.random.randint(10, size=(3, 4))  # Two-dimensional array
# theta = theta /10
theta
Out[35]:
array([[6, 7, 7, 8],
       [1, 5, 9, 8],
       [9, 4, 3, 0]])
In [36]:
print("theta boyutlar (theta.shape):", theta.shape)
print("theta butukluk (theta.size) :", theta.size)
theta boyutlar (theta.shape): (3, 4)
theta butukluk (theta.size) : 12
In [37]:
theta[1,0]
Out[37]:
1
In [38]:
x = [1, 2, 3, 4, 5]
print("x     =", x)
print("e^x   =", np.exp(x))
print("2^x   =", np.exp2(x))
print("3^x   =", np.power(10, x))
x     = [1, 2, 3, 4, 5]
e^x   = [   2.71828183    7.3890561    20.08553692   54.59815003  148.4131591 ]
2^x   = [  2.   4.   8.  16.  32.]
3^x   = [    10    100   1000  10000 100000]

Dinamik Sistemler

Farklı a değerleri için nasıl bir grafik elde ederiz? $$x_{t+1} = a x_t$$

In [39]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
In [40]:
def sistem(a, t = 20):
    x = 1 
    sistem = []
    for t in range(t):
        x = a * x
        sistem.append(a * x)
    return sistem

def sistemCiz(a, t = 20, baslik = ""):
    plt.figure(figsize=(10,6))
    plt.plot(range(t),sistem(a),'rx-',markersize=10)
    plt.grid(True) 
    plt.ylabel('$x_t$'); 
    plt.xlabel('t')
    plt.title(baslik)
In [41]:
sistemCiz(a = 1, baslik = "a = 1: Sabit") # a = 1: Sabit
In [42]:
sistemCiz(a = 2, baslik = "a > 1 : Artan") # a >1 : Artan
In [43]:
sistemCiz(a = 0.5, baslik = "0 < a < 1 : Azalan") # 0 < a < 1 : Azalan
In [44]:
sistemCiz(a = -1, baslik="a = -1 : Notr Salinim") # a = -1 : Notr Salinim
In [45]:
sistemCiz(a = -2, baslik="a < -1 : Buyuyen Salinim") # a < -1 : Buyuyen Salinim
In [46]:
sistemCiz(a = -0.5, baslik="0 < a < -1 : Kuculen Salinim") # 0 < a < -1 : Kuculen Salinim

Av Avci Modeli

Av y arrtikca, avci x artiyor ve avci x arttikca av y azaliyor.

$$x = 0.5 * x + y$$$$y = -0.5 * x + y$$
In [47]:
def av_avci(t = 20):
    """Avci (x) arttikca av (y) azalir    ==>> negatif (ters yonde) geri besleme
       Av (y) azaldikca avci (x) azalir   ==>> pozitif (ayni yonde) geri besleme
    """
    x = 1; y = 1;
    y_degerleri = []
    x_degerleri = []
    for t in range(t):
        yenix = 0.5 * x + y    # yenix, eski x ve y kullanarak hesaplanmali
        yeniy = -0.5 * x + y   # yeniy, eski x ve y kullanarak hesaplanmali
        
        x, y = yenix, yeniy    # Eger yenix, yeniy kullanmazsaniz, 
                               # x ve y hesabi karisir. 
        x_degerleri.append(x)
        y_degerleri.append(y)
    return x_degerleri, y_degerleri
In [48]:
t = 50
x_degerleri, y_degerleri = av_avci(t)

plt.figure(figsize=(10,6))
plt.plot(range(t),x_degerleri,'r-',markersize=10)
plt.plot(range(t),y_degerleri,'g--',markersize=10)
plt.grid(True) 
plt.ylabel('Nufus'); 
plt.xlabel('t')
plt.legend(("Avci", "Av"), shadow=True, fancybox=True)
Out[48]:
<matplotlib.legend.Legend at 0x11197a748>
In [49]:
plt.figure(figsize=(10,6))
plt.plot(x_degerleri,y_degerleri,'b-')
plt.grid(True)
plt.xlabel('Avci'); plt.ylabel('Av'); 

Havuz Problemi

Giren su: $$s_{gir}(t) = 10 + 0.3 * t$$

Cikan su: $$s_{cik}(t) = 0.5 * t$$

Havuzdaki su miktari, onceki su miktari arti birim zamanda giren ve cikan su miktari carpi zamandir.

$$H(t+\triangle t) = H(t) + (s_{gir} - s_{cik}) \triangle t$$
In [50]:
dt = 0.1
t = np.arange(0, 21, dt)
s_gir = 2 + 0.3 * t
s_cik = 0.5 * t

net = (s_gir - s_cik) * dt
H = [1]
for t in range(len(t)-1):
    H.append(H[t] + net[t])


plt.figure(figsize=(10,6))
plt.plot(s_gir,'g-',markersize=10)
plt.plot(s_cik,'r--',markersize=10)
plt.plot(H,'b-',markersize=10)
plt.grid(True) 
plt.ylabel('Havuz'); 
plt.xlabel('t')
plt.legend(("Giren Su", "Cikan Su", "Havuzdaki Su Miktari"), shadow=True, fancybox=True)
Out[50]:
<matplotlib.legend.Legend at 0x112a290b8>
In [51]:
len(H)
Out[51]:
210

Romeo ve Juliet Aski

$$ \frac{dR}{dt} = aJ $$$$ \frac{dJ}{dt} = -bR $$
In [124]:
# Yapilacak
a, b = 1, 2

dt = 0.1
zaman = np.arange(0, 10, dt)

R = [1];
J = [-1];
for t in range(len(zaman)-1):
    dR = a * J[t] * dt
    dJ = -b * R[t] * dt
    
    yeniR = R[t] + dR
    yeniJ = J[t] + dJ
    
    R.append(yeniR)
    J.append(yeniJ)
    
print(len(R))
print(len(J))
print(len(zaman))
100
100
100
In [125]:
plt.figure(figsize=(10,6))
plt.plot(R,'g-',markersize=10)
plt.plot(J,'r--',markersize=10)
plt.grid(True) 
plt.ylabel('Ask'); 
plt.xlabel('t')
plt.legend(("Romeonun Aski", "Julietin Aski"), shadow=True, fancybox=True)
Out[125]:
<matplotlib.legend.Legend at 0x118c87668>

Romeo ve Juliet, buyuyen ve giderek tehlikeli olan bir ask ve nefret sarmalina girmisler. Birinin aski sifir cizgisini gectiginde, digerinin davranisi degisiyor.

In [1]:
import random
x = random.randint(1,50)
tahmin = -1
while(tahmin != x):
    tahmin = int(input("tahmininiz? x = "))
    if x > tahmin : print("arttir")
    if x < tahmin : print("azalt")
    if x == tahmin: print("bildiniz")
tahmininiz? x = 25
azalt
tahmininiz? x = 12
azalt
tahmininiz? x = 6
azalt
tahmininiz? x = 3
bildiniz

Amac

$$ \frac{dx}{dt} = x - x^* $$
In [120]:
# amac x^*
amac = 10

dt = 0.1
zaman = np.arange(0, 10, dt)

y = [29];
x = [7];
for t in range(len(zaman)-1):
    dx = (amac - x[t]) * dt    
    yeniX = x[t] + dx
    x.append(yeniX)
    
    dy = (amac - y[t]) * dt    
    yeniY = y[t] + dy
    y.append(yeniY)  
    
print(len(zaman))
100
In [121]:
plt.figure(figsize=(10,6))
plt.plot(x,'g-',markersize=10)
plt.plot(y,'r--',markersize=10)
plt.grid(True) 
plt.ylabel('Amaci olan sistemler'); 
plt.xlabel('t')
plt.legend(("x","y"), shadow=True, fancybox=True)
Out[121]:
<matplotlib.legend.Legend at 0x1132fb4e0>

Tavsiye Sistemlerine Bakis

Toby Segaran'in Collective Intelligence adli kitabinin 2. bolumunden esinlenerek tavsiye sistemlerine bakalim.

Toby Segaran, Collective Intelligence Bolum 2 Toby Segaran, Collective Intelligence Bolum 2

In [ ]: