Problema do Contrabandista

Secção dedicada à linguagem de programação favorita dos quarkianos: Python!

Problema do Contrabandista

Mensagempor ruifm em Sábado Abr 28, 2012 11:54 pm

boas quarkianos!
deixo aqui a minha abordagem ao problema do contrabandista (muito simples e eficaz) como alternativa ao programa do professor jap :)
grande problema e grandes sessoões em Coimbra!
EDIT: Enhanced!

Código: Seleccionar Todos
from visual import *
scene.width=800
scene.height=600
scene.title='Problema do Contrabandista'

def distance(a,b):
    return mag(vector(a.pos-b.pos))

criminal=sphere(color=color.red, make_trail=False)
police=sphere(pos=(-10,0,0), color=color.blue, make_trail=False)



def motion(k):
    t=0
    dt=0.01
    criminal.vel=vector(0,1,0)
    criminal.pos=(0,0,0)
    police.pos=(-10,0,0)
    while distance(criminal,police)>0.5:
        rate(100)
        t+=dt
        criminal.make_trail=True
        police.make_trail=True
        criminal.pos+=criminal.vel*dt
        police.vel=vector(criminal.pos-police.pos)
        police.vel.mag=k*mag(criminal.vel)
        police.pos+=police.vel*dt
    criminal.make_trail=False
    police.make_trail=False
    print 'Distance: '+str(criminal.pos.y)

while True:
    k=input('Insert velocity factor: ')
    motion(k)
última vez editado por ruifm s Segunda Abr 30, 2012 5:13 pm, editado 1 vez no total
"Everything is determined, the beginning as well as the end, by forces over which we have no control." - Albert Einstein
Avatar do utilizador
ruifm
down-Quark!
down-Quark!
 
Mensagens: 205
Registado: Segunda Jan 16, 2012 12:04 am
Localização: Lisboa - IST

Re: Problema do Contrabandista

Mensagempor jap em Domingo Abr 29, 2012 8:33 pm

Rui,

Obrigado pelo teu programa, que é muito mais elegante do que o meu :hands: , porque o meu trabalha com as coordenadas cartesianas e as projecções da velocidade, porque é uma adaptação Q&D de um programa antigo meu que não usava as facilidades do VPython para trabalhar com vectores... :lol:

Mais sobre o problema do contabandista (e para perceber a origem do meu código) aqui:

http://algol.fis.uc.pt/quark/viewtopic.php?f=35&t=20

Código: Seleccionar Todos

"""
Problema do contrabandista

Linha da praia: o eixo OX;

Coordenadas da policia (a,b)
Coordenadas do contrabandista (c,d)

No inicio da perseguicao:

contrabandista esta em (0,0)
policia esta em (1,0)

ou seja, para t= 0:

a = 1
b= 0
c = 0
d = 0

O contrabandista move-se na perpendicular a praia, ou seja, segundo OY, logo c = 0 em qualquer
instante!

jap 21/4/2012

"""

from visual import *

def dist(rp,rc):
    "calculates the distance between the two boats"
    return mag(rc-rp)

def deg(x):
    "converts x from radians to degrees"
    return x*180./pi

def angle(rp,rc):
    "calculates the angle between the velocity of the police boat and the OX axis"
    if rp.x < 1e-8:
        return pi/2.
    else:
        return atan((rc-rp).y/rp.x)

dt = 1E-5
t = 0.0
v = 1.0

phi = (1+sqrt(5))/2. # golden number

tol = 1E-4 # tolerance for the distance between the two boats

print "Start, please wait..."
print "Aiming a distance not bigger than",tol,"between boats, and b = d = 1.0!"


window = display(title ="Problema do contrabandista",width=800,height=600,range=2.0,center=(0.5,0.5,0))
window.select()
window.autoscale=True

xaxis = arrow(pos=(0,0,0),axis=(1,0,0),shaftwidth=0.001)
yaxis = arrow(pos=(0,0,0),axis=(0,1,0),shaftwidth=0.001)

scene.title= "Policia e contrabandista"

rate(100)

trials = (3,2,1.8,1.5,phi)

f = open('dados.txt')

for k in trials:
    label(pos=(0.5,0.75),text = "k= %1.5f" %k)
   
    a,b,c,d= 1.0,0.0,0.0,0.0
    rp = vector((a,b,0))
    rc = vector((c,d,0))


    police = sphere(pos=rp,color=color.red,radius=0.03)
    burglar = sphere(pos=rc,color = color.green,radius=0.03)
    police.trail = curve(color=police.color)
    police.velocity = arrow(pos=police.pos,axis=(-0.1*v*k,0,0),shaftwidth=0.01)

    t=0.
    vp = v* k

    while  dist(rp,rc) > tol:
        alpha = angle(rp,rc)

        vpx = -vp*cos(alpha)
        vpy = vp*sin(alpha)

        a += vpx*dt
        b += vpy*dt
        d += v*dt

        rp = vector((a,b,0))
        rc = vector((c,d,0))
       
        t += dt
       
        police.pos = rp
        police.velocity.pos = police.pos
        police.velocity.axis = (0.1*vpx,0.1*vpy,0)
        police.trail.append(pos=police.pos)

        print>>f police.pos.x,police.pos.y
       
        burglar.pos=rc
       
    label(pos=(0.5,0.60),text="d=%10.5f" % d)

    dummy = raw_input('Press any key to continue')   
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6790
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Problema do Contrabandista

Mensagempor ruifm em Domingo Abr 29, 2012 10:32 pm

de nada ;). lembrei me de usar o calculo vectorial durante essa sessao porque fiz a associaçao com o programa do sistema solar que tambem foi falado.

o vypthon é espetacular!
off topic: tambem ja consegui fazer plots com o gnuplot, apesar de ao inicio aquilo nao ter corrido bem por nao fazer ideia que era preciso mostrar lhe o directorio do ficheiro que queria plotar :S
"Everything is determined, the beginning as well as the end, by forces over which we have no control." - Albert Einstein
Avatar do utilizador
ruifm
down-Quark!
down-Quark!
 
Mensagens: 205
Registado: Segunda Jan 16, 2012 12:04 am
Localização: Lisboa - IST

Re: Problema do Contrabandista

Mensagempor ruifm em Segunda Abr 30, 2012 5:12 pm

Por chamada de atençao do Filipe, experimentei o valor 55 como coeficiente (grande diferença de velocidades) e o programa ficou simplesmente ridiculo, descrevendo um movimento helicoidal interminavel.

Tentei perceber porque, e a explicaçao ate é engraçada:

Com um vector de velocidade muito grande para o policia, os defeitos e aproximaçoes de calculo do python fazem com que o vector velocidade nao tenha a mesma direcçao que a trajectoria do contrabandista no momento imediatamente antes à 'colisao'. Assim, o vector nunca estabiliza e esta sempre a oscilar a procura de um equilibrio que nunca vai encontrar...

A soluçao que encontrei foi aumentar a tolerancia para a paragem das esferas: aumentei de 0.0001 para 0.1.
Desta forma o programa encontrou soluçao para o valor 55 :)

O downside desta soluçao é que cada vez que aumento a tolerancia para admitir valores cada vez mais altos de coeficiente de velocidade, vou obtendo uma incerteza na distancia cada vez maior. Com uma tolerancia de 0.1 o numero de ouro ja nao me da exactamente a distancia inicial :(

Cheguei por isso a uma especie de principio da incerteza JK ! Ou sei exactamente a distancia para valores baixos de coeficiente, ou sei a distancia para valores muito altos de coeficiente. Parece ser uma das desvantagens de trabalhar com vectores no vpython

@Filipe que raio de ideia a tua de experimentar o valor 55! Nao tens mais nada para fazer ao meu programa xD
"Everything is determined, the beginning as well as the end, by forces over which we have no control." - Albert Einstein
Avatar do utilizador
ruifm
down-Quark!
down-Quark!
 
Mensagens: 205
Registado: Segunda Jan 16, 2012 12:04 am
Localização: Lisboa - IST

Re: Problema do Contrabandista

Mensagempor jap em Terça Maio 01, 2012 9:24 pm

ruifm Escreveu:Por chamada de atençao do Filipe, experimentei o valor 55 como coeficiente (grande diferença de velocidades) e o programa ficou simplesmente ridiculo, descrevendo um movimento helicoidal interminavel.

Tentei perceber porque, e a explicaçao ate é engraçada:

Com um vector de velocidade muito grande para o policia, os defeitos e aproximaçoes de calculo do python fazem com que o vector velocidade nao tenha a mesma direcçao que a trajectoria do contrabandista no momento imediatamente antes à 'colisao'. Assim, o vector nunca estabiliza e esta sempre a oscilar a procura de um equilibrio que nunca vai encontrar...

A soluçao que encontrei foi aumentar a tolerancia para a paragem das esferas: aumentei de 0.0001 para 0.1.
Desta forma o programa encontrou soluçao para o valor 55 :)

O downside desta soluçao é que cada vez que aumento a tolerancia para admitir valores cada vez mais altos de coeficiente de velocidade, vou obtendo uma incerteza na distancia cada vez maior. Com uma tolerancia de 0.1 o numero de ouro ja nao me da exactamente a distancia inicial :(

Cheguei por isso a uma especie de principio da incerteza JK ! Ou sei exactamente a distancia para valores baixos de coeficiente, ou sei a distancia para valores muito altos de coeficiente. Parece ser uma das desvantagens de trabalhar com vectores no vpython

@Filipe que raio de ideia a tua de experimentar o valor 55! Nao tens mais nada para fazer ao meu programa xD


Não bastará utilizar um intervalo dt (bastante) mais pequeno? :roll: Acho que o defeito não é do Python, mas sim da nossa aproximação ao fazermos

\Delta \vec r = \vec v \Delta t

o que só é verdade para intervalos de tempo infinitesimais, se a velocidade estiver sempre a mudar (em direcção, para o polícia), como é o caso. :lol:

Ora testa lá esta minha teoria (que não é tão interessante, sorry, como a de um novo enunciado do princípio da incerteza pitónico! :lol:)
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6790
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Problema do Contrabandista

Mensagempor ruifm em Terça Maio 01, 2012 9:45 pm

wow isso foi mind blown.
Faz tão mais sentido. Como é que nao pensei nisso. As vezes a melhor explicaçao é a mais simples :D

funcionou na perfeiçao. parece que ja tenho certos maneirismos mecanizados como o dt=0.01, rate(100)
"Everything is determined, the beginning as well as the end, by forces over which we have no control." - Albert Einstein
Avatar do utilizador
ruifm
down-Quark!
down-Quark!
 
Mensagens: 205
Registado: Segunda Jan 16, 2012 12:04 am
Localização: Lisboa - IST


Voltar para Pitónica

Quem está ligado

Utilizadores a navegar neste fórum: Nenhum utilizador registado e 1 visitante