Algoritmos Las Vegas,Monte carlo

Pessoal

Eu procurei bastante no GOOGLE inteiro algum material pra mim estudar algoritmos Não deterministicos(algoritmos como Las Vegas e Monte Carlo) em Java e não encontrei nada a respeito,será que alguerm poderia me dar uma dica?

Grato,

Achei isso:

http://www.inf.ufpr.br/~murilo/prob-slides.pdf

[]'s

[quote=“Diana”]Achei isso:

http://www.inf.ufpr.br/~murilo/prob-slides.pdf

[]'s[/quote]

:sad: Pois é,obrigado Diana! A internet toda e tb só achei isso.

aea blz?

cara tu achou algum algoritmo desse genero em C ou C++?

se achou algo me passa o link q eu tenhu interesse :grin:

depois é soh quebrar a cabeça pra traduzir pra JAVA :wink:

[]´s

[quote=“AnjoSupremo”]aea blz?

cara tu achou algum algoritmo desse genero em C ou C++?

se achou algo me passa o link q eu tenhu interesse :grin:

depois é soh quebrar a cabeça pra traduzir pra JAVA :wink:

[]´s[/quote]

Cara é o seguinte eu não achei praticamente NADA de codigo mesmo não.Só mesmo o link acima,um colega me falou que existe um livro que tem e pensei que alguem aqui da lista iria o me sugerir,mas não sei qual o titulo…

Alguém já implementou Monte Carlo em Java? Como foi a experiência…?

Boa noite amigo,

Serve em C?

[code]/* rand example: guess the number */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main (){

int iSecret, iGuess;
int n = 0, i, cont = 0;
printf(“TAM do vetor: “);
scanf(”%d”,&n);
double vet1[n],vet2[n],vet3[n],vet4[n], calc = 0, area = 1.0;
/* initialize random seed: /
srand ( time(0) );
for(i = 0; i< n; i++){
vet1[i] = (1.0
random())/(1.0+RAND_MAX);
vet2[i] = (1.0*random())/(1.0+RAND_MAX);
}

for(i = 0; i<n; i++){
vet3[i] = vet1[i] * vet1[i];
}

for(i=0; i<n; i++){
if(vet2[i] < vet3[i]){
cont++;
}
}

calc = (area*cont)/n;
printf("%f\n",calc);

return 0;
}
[/code]
[]'s

Oi getAdicted, tudo jóia? Primeiramente, obrigado pela ajuda…

A verdade é q tou tentando traduzir alguns fontes que encontrei para Java… E gostaria d ver algo em Java mesmo se possível…

Este algoritmo não é difícil de traduzir para o Java, mas parece estar incompleto.

O iSecret e iGuess nunca estão sendo usados (assim como o vetor 4).
Se o iSecret e o iGuess são as principais variáveis do algoritmo e nunca estão sendo usadas… algo está errado.

EDIT: Se estiverem realmente interessados no algoritmo, isso pode ajudar: http://www.javaquant.net/books/MCBook-1.2.pdf

[code]/* rand example: guess the number */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main (){
int n = 0, i, cont = 0;
printf("TAM do vetor: ");
scanf("%d",&n);
double vet1[n],vet2[n],vet3[n],calc = 0, area = 1.0;
/* initialize random seed: /
srand ( time(0) );
for(i = 0; i< n; i++){
vet1[i] = (1.0
rand())/(1.0+RAND_MAX);
vet2[i] = (1.0*rand())/(1.0+RAND_MAX);
}

for(i = 0; i<n; i++){
vet3[i] = vet1[i] * vet1[i];
}

for(i=0; i><n; i++){
if(vet2[i] >< vet3[i]){
cont++;
}
}

calc = (area*cont)/n;
printf("%f\n",calc);

system("pause");
return 0;
}
[/code]

Desculpem, jah faz um tempinho que tive Matemática para Simulação de Sistemas na faculdade, eu soh copiei e colei aqui.

Eu dei uma refatorada e agora está compilando, se não me falha a memória, o Profº dizia que 4 casas decimais após a virgula jah seria uma boa simulação. Eu vou colocar alocação dinamina nesse código para aceitar um N maior que 10000.

[EDIT]O material recomendado acima, pelo amigo, eh muito bom.[EDIT/]

[]'s

Implementei os algoritmos em Java, pra quem estava pedindo.
Fiz da maneira mais simples possível, já que não sei o nível de complexidade que estão buscando.

Uma dica é criarem um array com todos os números já testados, para não tentar o mesmo número duas vezes…
Eu faria agora, mas estou no trabalho :P.

Monte Carlo:

public static void monteCarlo(int maximoIteracoes) {
	int secret = (int) (Math.random() * 100);
	int iteracoes = 0;
	int guess;

	do {
		guess = (int) (Math.random() * 100);
		iteracoes++;
	} while (secret != guess && iteracoes < maximoIteracoes);

	if (secret == guess) {
		System.out.println("MONTE CARLO: Foram necessarias " + iteracoes + " iterações para descobrir o número.");
	} else {
		System.out.println("MONTE CARLO: O número não foi descoberto nas " + maximoIteracoes + " iterações realizadas!");
	}
}

Las Vegas:

public static void lasVegas() {
	int secret = (int) (Math.random() * 100);
	int iteracoes = 0;
	int guess;

	do {
		guess = (int) (Math.random() * 100);
		iteracoes++;
	} while (guess != secret);

	System.out.println("LAS VEGAS: Foram necessarias " + iteracoes + " iterações para descobrir o número.");
}

Oh legal…

danielfariati / getAdicted vcs poderiam comentar em qual situação usaram Monte Carlo?

[quote=andredecotia]Oh legal…

danielfariati / getAdicted vcs poderiam comentar em qual situação usaram Monte Carlo?
[/quote]

Modifiquei um pouco o código para mostrar quando utilizar Monte Carlo é melhor que Las Vegas…

import java.util.ArrayList;

public class AlgoritmosDiversos {

	public static final long MAX_SECRET = 9999999;

	public static void main(String[] args) {
		lasVegas();
		monteCarlo(100);
	}

	public static void lasVegas() {
		long runningTime = System.currentTimeMillis();

		long secret = (int) (Math.random() * MAX_SECRET);
		long guess;
		int iteracoes = 0;

		ArrayList<Long> guessList = new ArrayList<Long>();

		do {
			guess = (long) (Math.random() * MAX_SECRET);

			if (!guessList.contains(guess)) {
				guessList.add(guess);
				iteracoes++;
			}
		} while (guess != secret);

		runningTime = System.currentTimeMillis() - runningTime;
		System.out.println("LAS VEGAS: Foram necessarias " + iteracoes + " iterações para descobrir o número.");
		System.out.println("LAS VEGAS: O algoritmo ficou " + runningTime + "ms em execução.");
	}

	public static void monteCarlo(long maximoIteracoes) {
		long runningTime = System.currentTimeMillis();

		long secret = (long) (Math.random() * MAX_SECRET);
		long guess;
		int iteracoes = 0;

		ArrayList<Long> guessList = new ArrayList<Long>();

		do {
			guess = (long) (Math.random() * MAX_SECRET);

			if (!guessList.contains(guess)) {
				guessList.add(guess);
				iteracoes++;
			}
		} while (secret != guess && iteracoes < maximoIteracoes);

		if (secret == guess) {
			System.out.println("MONTE CARLO: Foram necessarias " + iteracoes + " iterações para descobrir o número.");
		} else {
			System.out.println("MONTE CARLO: O número não foi descoberto nas " + maximoIteracoes + " iterações realizadas!");
		}

		runningTime = System.currentTimeMillis() - runningTime;
		System.out.println("MONTE CARLO: O algoritmo ficou " + runningTime + "ms em execução.");
	}

}

Como verá se rodar o programa, o algoritmo Las Vegas ficará rodando por muito tempo até encontrar a solução (mas com certeza encontrará).
Pode ser usado quando você precisar saber exatamente a resposta, sem estimativas.

O Monte Carlo terá um número limitado de tentativas, evitando este tempo gigantesco de espera (mas pode não encontrar a solução).
Pode ser usado quando apenas uma estimativa for o bastante, não o valor exato. Ou então quando não puder ficar esperando tanto tempo para saber a solução.
(Isto pode não ter ficado claro no meu algoritmo, pois ele não está fazendo estimativas de qual é o número correto, apenas comparando dados)

Eu nunca precisei utilizar o Monte Carlo, para ser sincero.
Talvez alguém que já tenha utilizado em aplicações reais possa dar uma explicação melhor (e corrigir se falei besteira :P).

EDIT: To pensando em fazer um algoritmo que faça previsões, mais tarde, quando chegar em casa… Mas não garanto nada :stuck_out_tongue:

EDITED: Executando o código…

Modifiquei o código para ele prever, com os números que sobraram, qual o mais provável de ser o número secreto.
Consigo pensar em várias maneiras de melhorar esse código e subir a chance dele acertar a previsão, mas não quero deixar muito complexo :P.
O problema dele é com os extremos… Tipo se o número secreto for 1.
Mas já serve para demontrar melhor o que o Monte Carlo faz :P.

OBS: Ele só faz a previsão se não conseguir encontrar o número correto nas iterações que fez antes.

import java.util.ArrayList;

public class AlgoritmosDiversos {

	public static final double MAX_SECRET = 10;

	public static void main(String[] args) {
		monteCarlo(5);
	}

	public static void monteCarlo(long maximoIteracoes) {
		long runningTime = System.currentTimeMillis();

		long secret = (long) (Math.random() * MAX_SECRET) + 1;
		long guess;
		int iteracoes = 0;

		ArrayList<Long> remainingList = new ArrayList<Long>();

		for (long i = 1; i <= MAX_SECRET; i++) {
			remainingList.add(i);
		}

		do {
			guess = (long) (Math.random() * MAX_SECRET) + 1;

			if (remainingList.contains(guess)) {
				remainingList.remove(guess);
				iteracoes++;
			}
		} while (secret != guess && iteracoes < maximoIteracoes);

		if (secret == guess) {
			System.out.println("MONTE CARLO: Foram necessarias " + iteracoes + " iterações para descobrir o número.");
		} else {
			long prediction = remainingList.get(remainingList.size() / 2);

			System.out.println("MONTE CARLO: O número não foi descoberto nas " + maximoIteracoes + " iterações realizadas!");
			System.out.println("MONTE CARLO: Previsão: " + prediction);
			System.out.println("MONTE CARLO: Número real: " + secret);
		}

		runningTime = System.currentTimeMillis() - runningTime;
		System.out.println("MONTE CARLO: O algoritmo ficou " + runningTime + "ms em execução.");
	}

}