Exemplo n.º 1
0
func Run(conf Config) error {
	rand.Seed(time.Now().UTC().UnixNano())

	fmt.Println("Loading proteins...")
	id, start, end, err := db.GetProteins(conf.DB)
	if err != nil {
		panic(err)
	}

	fmt.Println("Initializing probabilities...")
	r, _ := rules.Create(conf.CA.InitStates, conf.CA.TransStates, conf.CA.HasJoker, conf.CA.R)
	probs := NewProbs(r.Prm)

	var pop Population

	pop.rule = make([]*rules.Rule, conf.Design.Population)
	pop.fitness = make([]float64, conf.Design.Population)

	pop.rule[0], _ = rules.Create(conf.CA.InitStates, conf.CA.TransStates, conf.CA.HasJoker, conf.CA.R)
	cellauto, _ := ca.Create1D(id, start, end, pop.rule[0], conf.CA.Steps, conf.CA.Consensus)
	pop.fitness[0] = Fitness(cellauto)

	for i := 1; i < conf.Design.Population; i++ {

		pop.rule[i] = probs.GenRule()
		cellauto.SetRule(pop.rule[i])
		pop.fitness[i] = Fitness(cellauto)

	}

	pop.save("")

	return nil
}
Exemplo n.º 2
0
// func Run(selby string, fnrulein string, fnruleout string, fnprobout string, gen int, pop int, steps int, ca *ca.CellAuto1D, prm rules.Params) error {
func Run(conf Config) error {
	rand.Seed(time.Now().UTC().UnixNano())

	fmt.Println("Loading proteins...")
	id, start, end, err := db.GetProteins(conf.DB)
	if err != nil {
		panic(err)
	}

	fmt.Println("Initializing probabilities...")
	rule, _ := rules.Create(conf.CA.InitStates, conf.CA.TransStates, conf.CA.HasJoker, conf.CA.R)
	probs := NewProbs(rule.Prm)
	fmt.Println(probs)

	var calist []*ca.CellAuto1D

	calist = make([]*ca.CellAuto1D, conf.CGA.Selection)

	for i := 0; i < len(calist); i++ {
		r := probs.GenRule()
		calist[i], _ = ca.Create1D(id, start, end, r, conf.CA.Steps, conf.CA.Consensus)
	}

	var wg1 sync.WaitGroup
	for i := 0; i < conf.CGA.Generations; i++ {
		fmt.Println("Generation", i)
		fmt.Println("Adjusting probabilities...")
		probs.AdjustByRanking(calist, 1.0/float64(conf.CGA.Population))
		fmt.Println("OK")

		if probs.Converged() {
			fmt.Println("Probabilities converged\nDONE")
			break
		}

		for i := 0; i < len(calist); i++ {
			wg1.Add(1)
			go func(i int) {
				defer wg1.Done()
				calist[i].SetRule(probs.GenRule())
			}(i)
			// calist[i], _ = ca.Create1D(id, start, end, r, conf.CA.Steps)
		}
		fmt.Printf("Waiting ")
		wg1.Wait()
		fmt.Println("OK")
	}

	err = ioutil.WriteFile(conf.CGA.OutputProbs, []byte(probs.String()), 0644)
	if err != nil {
		fmt.Println("Erro gravar as probabilidades")
		fmt.Println(probs)
	}

	return nil
}
Exemplo n.º 3
0
func RunSlave(conf Config) {

	// Cria o receptor que recebe a probabilidade emitida pelo master na porta A
	receiver, _ := zmq.NewSocket(zmq.PULL)
	defer receiver.Close()
	receiver.Connect("tcp://" + conf.Dist.MasterURL + ":" + conf.Dist.PortA)

	// Cria o emissor que envia o individuo vencedor do torneio na rede pela
	// porta B
	sender, _ := zmq.NewSocket(zmq.PUSH)
	defer sender.Close()
	sender.Connect("tcp://" + conf.Dist.MasterURL + ":" + conf.Dist.PortB)

	// semente randomica
	rand.Seed(time.Now().UTC().UnixNano())

	// Le os dados das proteinas no DB
	fmt.Println("Loading proteins...")
	id, start, end, err := db.GetProteins(conf.DB)
	if err != nil {
		fmt.Println("Erro no banco de DADOS")
		panic(err)
	}
	fmt.Println("Done")
	// ? Ha vantagem em enviar um sinal de Ok (proteinas lidas) para o master?

	var prob Probabilities

	var tourn Tournament
	tourn = make([]Individual, conf.EDA.Tournament)
	// tourn.rule = make([]*rules.Rule, conf.EDA.Tournament)
	// tourn.fitness = make([]float64, conf.EDA.Tournament)

	r, _ := rules.Create(conf.CA.InitStates, conf.CA.TransStates, conf.CA.HasJoker, conf.CA.R)
	// probabilidade temporaria para ser substituida pelas recebidas
	p_tmp := NewProbs(r.Prm)
	cellAuto := make([]*ca.CellAuto1D, conf.EDA.Tournament)
	for i := 0; i < conf.EDA.Tournament; i++ {
		// tourn.rule[i] = p_tmp.GenRule()
		tourn[i].Rule = p_tmp.GenRule()

		// cellAuto[i], _ = ca.Create1D(id, start, end, tourn.rule[i], conf.CA.Steps, conf.CA.Consensus)
		cellAuto[i], _ = ca.Create1D(id, start, end, tourn[i].Rule, conf.CA.Steps, conf.CA.Consensus)
	}

	// Individuo vencedor do torneio
	var (
		ind    Individual
		b      []byte
		m      string
		conerr error
	)

	for {
		// m é a mensagem com as probabilidades
		m, conerr = receiver.Recv(0)
		// m, err := conn.Request(conf.Dist.TopicFromMaster, []byte("get"), 2*time.Second)
		if conerr == nil {
			// para cada individuo no torneio
			// gera uma regra de acordo com a probabilidade atual
			// roda o automato celular
			// calcula o fitness
			// seleciona o vencedor do torneio
			// retorna sua regra e seu fitness)

			// converte a probabilidade recebida em JSON para uma estrutura
			json.Unmarshal([]byte(m), &prob)
			fmt.Printf("PID: %d, Geracacao: %d\n", prob.PID, prob.Generation)
			// for i := 0; i < len(tourn.rule); i++ {
			for i := 0; i < len(tourn); i++ {

				// copia a probabilidade recebida para a probabilidade dos individuos
				copy(p_tmp.probs, prob.Data)
				// gera a regra e atribui ao membro do torneio
				tourn[i].Rule = p_tmp.GenRule()
				// define a regra do automato como sendo a nova regra
				cellAuto[i].SetRule(tourn[i].Rule)
				// retorna o fitness e outras medidas de desempenho do autômato
				tourn[i].Fitness, tourn[i].Q3 = FitnessAndQ3(cellAuto[i])

				// fmt.Println("Individuo", i, "Fitness", tourn.fitness[i])
				fmt.Println("Individuo", i, "Fitness", tourn[i].Fitness)

			}

			// Ordena os individuos do torneio de acordo com o fitness (maior primeiro)
			sort.Sort(sort.Reverse(tourn))
			// ind.PID, ind.Generation, ind.Rule, ind.Fitness = prob.PID, prob.Generation, tourn.rule[0], tourn.fitness[0]
			ind.PID, ind.Generation, ind.Rule, ind.Fitness, ind.Q3 = prob.PID, prob.Generation, tourn[0].Rule, tourn[0].Fitness, tourn[0].Q3

			// Codifica o individuo vencedor em JSON e envia para o master
			b, _ = json.Marshal(ind)
			fmt.Println("Fitness selecionado", tourn[0].Fitness)
			sender.Send(string(b), 0)

		} else {
			// Erro na conexão
			fmt.Println(err)
		}

	}
}