Witam.
Napisałem taki oto algorytm PSO. Problem nie leży w algorytmie, lecz w wyświetlaniu wyniku działania przez vpytona. Wszystko co wymaluje jest bardzo "wąskie". Tzn: np funkcja Beala
http://www-optima.amp.i.kyoto-u.ac.jp/member/student/hedar/Hedar_files/TestGO_files/Page288.htm
w formie punktów jest wyświetlana jako baaaaaaaaardzo długi cylinder wypełniony punktami. Moim celem miałaby być płaszczyzna w takiej formie, jak na podanym wyżej linku; Z kolei funkcja f() = x2 + y2 jest potwornie strzelista. Czy jest jakaś funkcja umożliwiająca mi skalowanie widoku, tak aby wykresy były w "normalnej" proporcji?
Oraz pytanie 2: Czy jest sposób na wymalowanie ładnej płaszczyzny funkcji? [convex łączy punkty w figurę]
Z góry dziękuję za odpowiedzi.
'''
Created on 30-03-2011
@author: jakub
'''
from threading import Thread
import matplotlib.pyplot as plt
import numpy as np
from copy import copy
import random
from visual import *
bestX = []
wywolania = 0
def eval(args):
# return np.abs((args[0])**2+(args[1])**2)
global wywolania
wywolania +=1
return (1.5 - args[0] + (args[0] * args[1])) ** 2 + (2.25 - args[0] + (args[0] * args[1] ** 2)) ** 2 + (2.625 - args[0] + (args[0] * args[1] ** 3)) ** 2
class Swarm(Thread, object):
def __init__(self):
Thread.__init__(self)
self.min = -4.5
self.max = 4.5
self.dimmensions = 2
self.isMinimizing = True
self.best = []
self.particles = []
self.omega = 0.9
self.fiP = 0.01
self.fiS = 0.01
def eval(self):
return eval(self.best)
def info(self):
print "Najlepszy wynik to:\t\t\t\t\t", eval(self.best)
print "we wspolrzednych:", self.best
print "w ", wywolania, "wywolaniach."
print "------------------\n sklad roju:"
for particle in self.particles:
print "\t", particle.best, "\t", eval(particle.best)
plt.plot(bestX)
plt.show()
def addParticles(self, howMany):
for i in range(howMany):
particle = Particle(self)
if i == 0:
self.best = copy(particle.position)
if self.isMinimizing:
if particle.eval() < self.eval():
self.best = copy(particle.position)
else:
if particle.eval() > self.eval():
self.best = copy(particle.position)
self.particles.append(particle)
def run(self):
# L = [ ]
# for t in arange(self.min,self.max,1):
# for s in arange(self.min,self.max,1):
# L.append((s, t, eval([t,s])))
# points(pos=L, color=(0.5,0,0.5), axis = [20,20,20], size = 1)
maxIteracji = 500
iteracji = 0
complete = False
while not complete:
# rate(30)
iteracji += 1
bestX.append(eval(self.best))
if iteracji > maxIteracji:
complete = True
print "SKONCZYLEM!", iteracji
self.info()
for particle in self.particles:
for i in range(len(particle.vel)):
rP = random.uniform(0, 1)
rS = random.uniform(0, 1)
particle.vel[i] = self.omega * particle.vel[i] + \
self.fiP * rP * (particle.best[i] - particle.position[i]) + \
self.fiS * rS * (self.best[i] - particle.position[i])
for j in range(len(particle.position)):
particle.position[j] += particle.velocity[j]
particle.update()
if self.isMinimizing:
if particle.eval() < particle.bestEval():
particle.best = copy(particle.position)
if particle.eval() < self.eval():
self.best = copy(particle.position)
else:
if particle.eval() > particle.bestEval():
particle.best = copy(particle.position)
if particle.eval() > self.eval():
self.best = copy(particle.position)
class Particle(sphere):
def __init__(self, swarm):
# super(Particle, self).__init__()
sphere.__init__(self, make_trail=True, trail_type="points",
interval=10, retain=50)
self.swarm = swarm
self.material = materials.plastic
self.position = []
self.make_trail = True
for i in range(self.swarm.dimmensions):
self.position.append(random.uniform(swarm.min, swarm.max))
self.pos = vector(self.position + [eval(self.position)])
self.radius = 1
self.color = color.orange
self.vel = []
for i in range(self.swarm.dimmensions):
self.vel.append(random.uniform(-(self.swarm.max - self.swarm.min) , (self.swarm.max - self.swarm.min)))
self.velocity = vector(copy(self.vel))
self.z = self.eval()
self.best = copy(self.position)
def eval(self):
return eval(self.position)
def bestEval(self):
return eval(self.best)
def update(self):
self.pos = vector(self.position + [eval(self.position)])
self.velocity = vector(self.vel)
pszczoly = Swarm()
print pszczoly
pszczoly.addParticles(100)
pszczoly.start()