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()