The philosophy of computer science is concerned with those philosophical issues that arise from within the academic discipline of computer science. It is intended to be the philosophical endeavor that stands to computer science as philosophy of mathematics does to mathematics and philosophy of technology does to technology. Indeed, the abstract nature of computer science, coupled with its technological ambitions, ensures that many of the conceptual questions that arise in the philosophies of mathematics and technology have computational analogues. In addition, the subject will draw in variants of some of the central questions in the philosophies of mind, language and science. We shall concentrate on a tightly related group of topics which form the spine of the subject. These include specification, implementation, semantics, programs, programming, correctness, abstraction and computation.
my latest work entitled Second Order Swarm Intelligence with Vitorino Ramos and Jorge Louçã will be presented at the HAIS’2013 Conference in Salamanca, latter this year. It is an exploration of Ant Colony Systems by introducing a second order feedback mechanism. This is done with a negative pheromone that acts as a `non-entry’ signal.
Abstract
An artificial Ant Colony System (ACS) algorithm to solve general-purpose combinatorial Optimization Problems (COP) that extends previous AC models [21] by the inclusion of a negative pheromone, is here described. Several Travelling Salesman Problem (TSP) were used as benchmark. We show that by using two different sets of pheromones, a second-order co-evolved compromise between positive and negative feedbacks achieves better results than single positive feedback systems. The algorithm was tested against known NP-complete combinatorial Optimization Problems, running on symmetrical TSP’s. We show that the new algorithm compares favourably against these benchmarks, accordingly to recent biological findings by Robinson [26,27], and Gruter [28] where “No entry” signals and negative feedback allows a colony to quickly reallocate the majority of its foragers to superior food patches. This is the first time an extended ACS algorithm is implemented with these successful characteristics.
47th HAWAII INTERNATIONAL CONFERENCE ON SYSTEM SCIENCES (HICSS)
Minitrack: Network Analysis of Social and Digital Media
Track: Digital and Social Media
Conference: JANUARY 6-9, 2014 http://www.hicss.hawaii.edu/
Multilevel innovation networks PDW
2013 Academy of Management Meetings; Orlando, FL, USA
Friday, Aug 9 2013 3:00PM – 7:00PM at WDW Swan Resort in Swan 7
Organizers: Corey Phelps (HEC Paris), Srikanth Paruchuri (Penn State), Martin Goossen (HEC Paris)
Deadline for applications: June 30, 2013 http://tinyurl.com/multilevelnetworks
Social Science Computer Review
Special issue on “Social interaction- the bridge between micro and macro”
Guest editors: Bruce Edmonds (Centre for Policy Modelling, Manchester Metropolitan University Business School) and Flaminio Squazzoni (GECS Research Group, University of Brescia)
Deadlines to submit a full paper: 24th June 2013
Tentative issue publication: Second 2014 issue http://ssc.sagepub.com/
The Second International Conference on E-Learning and E-Technologies in Education (ICEEE2013)
Technical University of Lodz, Lodz, Poland
September 23-25, 2013 http://sdiwc.net/
The Lorenz System is one of the most famous system of equations in the realm of chaotic systems first studied by Edward Lorenz. The double lob remembering a butterfly wing is on the imagination of any complex systems enthusiast.
Lorenz Attractor Equations
The three equations that govern its behavior are:
where usually
So let's define the parameters, the initial state of the system and the equations in the form of a function called Lorenz
parameters <-c(s =10, r =28, b =8/3)
state <-c(X =0, Y =1, Z =1)
Lorenz <-function(t, state, parameters){with(as.list(c(state, parameters)), {
dX <- s *(Y - X)
dY <- X *(r - Z)- Y
dZ <- X * Y - b * Z
list(c(dX, dY, dZ))})}
parameters <- c(s = 10, r = 28, b = 8/3)
state <- c(X = 0, Y = 1, Z = 1)Lorenz <- function(t, state, parameters) {
with(as.list(c(state, parameters)), {
dX <- s * (Y - X)
dY <- X * (r - Z) - Y
dZ <- X * Y - b * Z
list(c(dX, dY, dZ))
})
}
We can now start processing this and plotting it.
times <-seq(0, 50, by=0.01)library(deSolve)
out <- ode(y = state, times = times, func = Lorenz, parms = parameters)par(oma =c(0, 0, 3, 0))plot(out, xlab ="time", ylab ="-")plot(out[, "Y"], out[, "Z"], pch =".", type ="l")mtext(outer= TRUE, side =3, "Lorenz model", cex =1.5)
times <- seq(0, 50, by = 0.01)
library(deSolve)
out <- ode(y = state, times = times, func = Lorenz, parms = parameters)par(oma = c(0, 0, 3, 0))
plot(out, xlab = "time", ylab = "-")
plot(out[, "Y"], out[, "Z"], pch = ".", type = "l")
mtext(outer = TRUE, side = 3, "Lorenz model", cex = 1.5)
The above example is mainly copied from the the deSolve package documentation that uses the same example. What I'd like to point out in this is how simple it is to solve and plot a system of differential equations in R. The language is simple and clear and it is much more practical than implementing everything from scratch.
I've already shown how to plot multiple data series in R with a traditional plot by using the par(new=T), par(new=F) trick. Now I'll show how to do it within ggplot2.
First let's generate two data series y1 and y2 and plot them with the traditional points methods
x <-seq(0, 4*pi, 0.1)
n <-length(x)
y1 <-0.5*runif(n)+sin(x)
y2 <-0.5*runif(n)+cos(x)-sin(x)plot(x, y1, col="blue", pch =20)points(x, y2, col="red", pch =20)
This is exactly the R code that produced the above plot. It is just a simple plot and points functions to plot multiple data series. It is not really the greatest, smart looking R code you want to use. Better plots can be done in R with ggplot.
Plotting with Ggplot2
Now, let's try this with ggplot2.
First we need to create a data.frame with our series.
If we have very few series we can just plot adding geom_point as needed.
library(ggplot2)df<-data.frame(x, y1, y2)
ggplot(df, aes(x, y = value, color = variable))+
geom_point(aes(y = y1, col="y1"))+
geom_point(aes(y = y2, col="y2"))
library(ggplot2)
df <- data.frame(x, y1, y2)
ggplot(df, aes(x, y = value, color = variable)) +
geom_point(aes(y = y1, col = "y1")) +
geom_point(aes(y = y2, col = "y2"))
But if we have many series to plot an alternative is using melt to reshape the data.frame and with this plot an
arbitrary number of rows. For example:
library(reshape)# This creates a new data frame with columns x, variable and value# x is the id, variable holds each of our timeseries designation
df.melted<- melt(df, id ="x")
ggplot(data= df.melted, aes(x = x, y = value, color = variable))+
geom_point()
library(reshape)
# This creates a new data frame with columns x, variable and value
# x is the id, variable holds each of our timeseries designation
df.melted <- melt(df, id = "x")ggplot(data = df.melted, aes(x = x, y = value, color = variable)) +
geom_point()
And thats how to plot multiple data series using ggplot. The basic trick is that you need to melt your data into a new data.frame. Remember, in data.frames each row represents an observation.
update:
Another option, pointed to me in the comments by Cosmin Saveanu (Thanks!), it to plot the multiple data series with facets (good for B&W):
O valor do Pi é 3.14159… mas o valor do Pi é um número irracional e não é possível determinar um padrão nos dígitos de Pi que se repita infinitamente — embora todas as sequências de números se encontrem algures no número Pi. Um número irracional é aquele em que não é possível representar pela divisão dois números inteiros.
Então como calcular o valor de Pi? Qual o significado de Pi?
Pi é o rácio entre o perímetro e o diâmetro de uma circunferência. pi=P/D
A primeira definição que provavelmente aprendemos na escola sobre Pi tem a ver com a determinação do perímetro de uma circunferência de diâmetro 1. O valor do perímetro desta circunferência é o valor de Pi e daqui surge logo a primeira forma de determinarmos o seu valor. Desenha-se uma circunferência com um compasso cuja amplitude seja 0.5 e o perímetro será de 3.14… (as unidades são arbitrárias) que teria que ser medido com um cordel pousado sobre o perímetro. Ora este método não é muito preciso e já no passado se sabia que o valor de Pi poderia ser calculado desta forma.
1) Um pouco da História antiga de Pi
Claro que na história já havia uma ideia do valor de Pi. Os Babilónios antigos tinha ideia de que o valor de Pi seria próximo de 3 e há um gravação onde é indicado o valor de 3.125. Por seu lado, os egípcios determinavam a área do círculo como [(8d)/9)^2 (com d igual ao diâmetro) o que dá um valor de Pi de 3.1605.
Arquimedes de Siracusa por seu lado percebendo que não podia determinar o valor exacto de Pi através de um número racional decidiu enquadrá-lo entre dois números racionais. Segundo ele, Pi estaria no intervalo [223/71, 22/7]. O método geométrico consistia na utilização de poligonos que eram inseridos ou que cobriam a circunferência. Desta forma era possível obter um intervalo para o valor de Pi.
Até na Bíblia aparece uma referência indirecta de Pi como sendo igual a 3 (ver passagem sobre o mar de bronze onde para uma circunferência de dez côvados de diâmetro era preciso usar um fio de trinta côvados para medir o perímetro).
No século XVI e XVII a cálculo de Pi beneficiou dos recentes avanços matemáticos na domínio séries infinitas permitindo o cálculo de Pi com muito maior precisão que os métodos geométricos utilizados até então. Na Europa James Gregory em 1671 e Leibniz em 1674 redescobriram uma série infinta de Madhava de Sangamagram em que
Esta fórmula é igual a Pi/4 quando z=1, mas converge lentamente pelo que John Machin apresentou em 1706 uma fórmula que converge muito mais rapidamente e que é a fórmula usualmente utilizada no cálculo de Pi nos computadores modernos:
Se expandirmos a fórmula em série, apenas com 4 parcelas é possível ter um erro na 6 casa decimal. Nada mau.
Foi também no século XVIII que a letra grega π foi introduzida para designar este valor, tendo a sua utilização sido popularizada por Eüler.
Podem experimentar a comparação dos dois valores com o seguinte código em python:
def arctan(z, it):
out=0.0for a inrange(1,it+1):
p=2*a-1
s=1if a%2==0:
s=-1
out+=s*(z**p)/p
return out
for a inrange(1,5):
print4*arctan(1.0,a),4*(4*arctan(1.0/5,a)-arctan(1.0/239.0,a))
def arctan(z, it):
out=0.0
for a in range(1,it+1):
p=2*a-1
s=1
if a%2==0:
s=-1
out+=s*(z**p)/p
return outfor a in range(1,5):
print 4*arctan(1.0,a), 4*(4*arctan(1.0/5,a)-arctan(1.0/239.0,a))
2) Calcular Pi com berlindes
Mas há outras razões que também dão Pi, uma delas é a que permite o cálculo de Pi através do atirar berlindes para dentro de uma caixa. Imagine que tem uma caixa quadrada e uma hula-hoop que encaixa perfeitamente dentro desta caixa. Se atirarmos berlindes para dentro da caixa de forma a que caiam aleatoriamente, calcularmos a fracção dos berlindes que caíram dentro do círculo e multiplicarmos por 4 temos uma aproximação de Pi.
A razão pela qual isto funciona tem a ver com o facto da razão entre as área do círculo e do quadro que o inscreve estarem relacionadas por Pi/4 (π.r^2/4.r^2= π/4). Se tiver paciência experimente lançar 400 berlindes para dentro da caixa e verifique. Claro que uma forma mais simples é fazê-lo através de um programa de computador. Por exemplo o código seguinte escrito em python lança o equivalente a 400 000 berlindes para fazer uma estimativa de Pi.
importrandom
pi=0for a inrange(400000):
x=random.random()
y=random.random()if x**2+y**2<1:
pi+=1print"Estimativa de Pi", pi / 100000.0
import random
pi=0
for a in range(400000):
x=random.random()
y=random.random()
if x**2+y**2<1:
pi+=1
print "Estimativa de Pi", pi / 100000.0
3) Calcular Pi com fósforos
Uma outra forma de calcular Pi é a partir de fósforos (quantos mais melhor) e um cartolina. Desenhe na cartolina linhas horizontais paralelas com uma distância entre si igual ao tamanho dos fósforos. Depois atire da forma mais aleatória possível os fósforos para cima da cartolina. Duas coisas podem acontecer: ou os fósforos tocam uma linha (não podem tocar as duas linhas ao mesmo tempo) ou não tocam em linha nenhuma. Agora é só uma questão de contar. Conte o número de fósforos que atirou (N) e o número de fósforos que cruzaram linhas (C). Depois, o valor de Pi é aproximado por $latex 2\times N/C$. Este método é também conhecido como o método da agulha de Buffon. O Conde de Buffon viveu no século XVIII e foi um naturalista francês que ainda antes Darwin apresentou ideias sobre a evolução das espécies.
4) Calcular Pi com Computadores
Hoje em dia o cálculo de Pi é feito por computadores através de diferentes estratégias de computação do valor de Pi. O número de dígitos calculados atinge valores para lá do racional (perdoem a chalaça) na ordem dos 10 triliões (10^13). Tanta precisão é inútil para aplicações práticas mas o software desenvolvido para fazer estes cálculo é muito utilizado para benchmarks de computadores e como testes de stress de máquinas pela comunidade de Overclocking.
O princípio básico do cálculo de Pi através de computadores é através de aproximações numéricas de séries infinitas. Os recordes mais actuais são batidos utilizando normalmente o algoritmo de Chudnobsky
Isto é mais uma excelente oportunidade para as grandes agências de notícias monetizarem os seus canais de twitter. Sabendo o seu alcance, podem ganhar “poder” sobre a publicidade que tentam mostrar nos seus links de retorno.
Por outro lado seria interessante perceber quanto tempo demoram as notícias das agências a espalhar-se em situações de “breaking events” onde utilizadores no local colocam as notícias no twitter primeiro. No fim será um balanço entre centralidade e proximidade.