Ferramentas de votação e pesquisa

Sobre algumas ferramentas que podem ser interessantes, nesses tempos on-line.

——————–

O Mentimeter é muito bom para fazer pesquisas online e ver os resultados, em tempo real. Dá para fazer gráficos, nuvem de palavras, listas, etc.

https://www.mentimeter.com

A versão free permite duas perguntas.

(Resultado da enquete de hoje à tarde)

——————–

Outra ferramenta útil é a de criar QR codes – para passar rapidamente o link de sites e contatos.

Há várias possíveis, e esta é bem simples. Basta escrever o endereço do site e baixar o qr code:

https://br.qr-code-generator.com/

——————–

Por fim, o Google Forms, que já existe há muito tempo e é bastante conhecido. Serve para pessoas com acesso ao formulário preencherem, e a ferramenta consolida os resultados.

É possível configurar resposta única ou múltipla, respostas obrigatórias e várias outras opções.

——————–

Quem tiver outras boas sugestões, e de preferência free, fique à vontade para responder.

Metaheurística com 2 variáveis

Essa versão é um pouquinho mais elaborada que a versão com uma variável (https://ferramentasexcelvba.wordpress.com/2021/03/27/exemplo-de-metaheuristica-uma-variavel/)

Serve para resolver o problema linear:

Max 10*x +5*y

Sujeito a:

2*x+4*y <= 50

1*x -6*y <= 15

É semelhante ao anterior, mas agora as variáveis são matrizes.

‘Inicializando coeficientes FO

coefFO(1) = 10

coefFO(2) = 5

‘Inicializando coeficientes Matriz

coefMatriz(1, 1) = 2

coefMatriz(1, 2) = 4

coefMatriz(2, 1) = 1

coefMatriz(2, 2) = -6

‘Inicializando rhs

RHS(1) = 50

RHS(2) = 15

Um parâmetro adicional, restringindo as variáveis a assumir valor máximo 50 e mínimo 0.

For i = 1 To nvar

    varmin(i) = 0 ‘Range Mínimo

    varmax(i) = 50 ‘Range Máximo

Next i

Em linhas gerais:

– Escolhe valores aleatórios no range das variáveis

– Pondera o valor aleatório com a melhor solução até agora

– Lambda controla o mix valor aleatório x melhor solução até agora. No início lambda é pequeno, depois vai aumentando

– Verifica se cumpre todas as restrições

 – função objetivo que avalia a solução

– salva o histórico

‘Algoritmo evolutivo

For iter = 1 To Niteracoes ‘Numero de iteracoes

    lambda = iter / Niteracoes

    ‘Sorteia um valor

    sorteia var, varmin, varmax, varbest, lambda

    ‘Verifica restricoes

    isOk = verificaRestricoes(var, coefMatriz, RHS)

    If isOk Then

        ‘Avalia a função atual

        FOatual = FO(var, coefFO)

        ‘Salva a melhor (maximizando)

        If FOatual > FOBest Then

            FOBest = FOatual

            copiaUni var, varbest

        End If

    End If

    FOhist(iter, 1) = FOBest

Next iter

Usando o solver, as variáveis ótimas são 22,5 e 1,25.


A metaheurística chega a valores próximos ao ótimo, o que mostra que funciona para uma solução suficientemente boa.

Provavelmente, com muitas variáveis e muitas restrições, vai ficar bem mais difícil convergir para uma solução boa.

Uma coisa ruim é todas as equações serem hard coded, mas quem domina código consegue fazer isso fácil.

É possível “tunar” esse algoritmo básico com pré processamento, ou algum chute guiado ao invés de ser basicamente aleatório, mas aí vai depender do problema.

Planilha para download no Github: https://github.com/asgunzi/Metaheuristica-2-var

Exemplo de metaheurística – uma variável

A ideia aqui é escrever uma série de metaheurísticas de dificuldade crescente.

Começando do caso mais simples possível. Variável unidimensional “x”.

Defino um range de valores, no caso, x entre 0 e 100.

varmin = 0 ‘Range Mínimo

varmax = 100 ‘Range Máximo

Seja a função objetivo –x^3 + 20*x^2 + 100, mostrado no gráfico abaixo.

Private Function FO(ByVal var) As Double

    ‘Implementa a função objetivo

    FO = -var ^ 3 + 20 * var ^ 2 + 100

End Function

Este algoritmo vai:

 – escolher um valor aleatório entre 0 e 100

– ponderar o valor aleatório com a melhor solução até agora

– lambda controla o mix valor aleatório x melhor solução até agora. No início lambda é pequeno, depois vai aumentando

– função objetivo que avalia a solução

– salva o histórico

Trecho do código:

For iter = 1 To Niteracoes ‘Numero de iteracoes

    lambda = iter / Niteracoes

    ‘Sorteia um valor

    sorteia var, varmin, varmax, varbest, lambda

    ‘Avalia a função atual

    FOatual = FO(var)

    ‘Salva a melhor (maximizando)

    If FOatual > FOBest Then

        FOBest = FOatual

        varbest = var

    End If

    FOhist(iter, 1) = FOBest

Next iter

Resultado. Em apenas 100 iterações, já chegou num valor excelente: x = 13,3

Você pode mudar a FO, ranges, etc.

Próximo passo é fazer um exemplo multidimensional, etc.

Planilha para download no Github: https://github.com/asgunzi/Metaheuristica-uma-variavel

Dica – Validação de dados

Digamos que eu tenha um formulário, e a fim de evitar erros, quero restringir a entrada de dados. No campo “Data”, o usuário deve colocar uma data.

A validação de dados serve para isso.

Selecionar a célula, ir em Dados -> Validação de dados -> Validação de dados.

Há várias opções possíveis, entre elas, a de data.

Neste caso específico, vai pedir mais informações. Coloquei para permitir dadas maiores do que 01/01/2000.

É um truque útil.

Metaheurística para o Caixeiro-Viajante

Implementação em VBA de metaheurística para resolução do problema do caixeiro-viajante.

A metaheurística não vai dar o valor ótimo, porém na prática, pode entregar um valor bom o suficiente.

Algumas vantagens: é mais flexível em termos de modelar restrições, é grátis (um solver tem licença que pode custar algumas dezenas de milhares de dólares, no mínimo).

Algumas desvantagens: ter alguém que manje muito de otimização combinatória para adaptar o código corretamente, não garantir a solução ótima.

De qualquer forma, é uma alternativa viável, competitiva e possível de ser utilizada, para problemas de otimização combinatória.

Segue para download no Github.

https://github.com/asgunzi/travelingSalesmanVBA

Ideias técnicas com uma pitada de filosofia
https://ideiasesquecidas.com/

Texto para colunas e preenchimento relâmpago

Imagine que tenho uma lista, e quero separar o primeiro campo do segundo.

Dois métodos: Texto para colunas e preenchimento relâmpago

O primeiro.

Selecionar o range a separar, e ir em Dados -> Texto para colunas.

No caso, quero separar pelo traço “-“.

Escolher “delimitado”

No campo seguinte, preencher “Outros” com “-“ e Concluir.

É possível fazer com preenchimento relâmpago também.

Na tabela, preencher 10 na segunda coluna e dar ENTER, de modo ao cursor ficar embaixo da célula preenchida.

O preenchimento relâmpago vai compreender o padrão, e preencher o restante dos campos de forma correspondente.  

Tente replicar o exercício no Excel.          

O código da transposição

Dentre os métodos existentes em criptografia, há alguns bens simples (e fáceis de quebrar).

O código da transposição funciona assim.

Imagine uma mensagem a ser enviada: “Conta a lenda que dormia”.

Temos que ter um tamanho para quebrar a mensagem em pedaços menores.

Digamos que o tamanho seja 5.

Escrevemos a mensagem numa tabela, quebrando pelo tamanho dado.

Para codificar a mensagem, começamos a ler pelas colunas

A primeira coluna é codificada como “C nur”. A segunda é “oadem”.

A mensagem completa vira:

“C nuroademn a itl daaeqo”

Exercício: o que está escrito a seguir, sabendo que foi utilizado o código da transposição (com outro tamanho)?

“Tapem uule aéedena  no a npa a aãev sloq”

Exercício extra. Criar uma função que codifique e decodifique o código, com uma string e um tamanho de entrada.


Ideias técnicas com uma pitada de filosofia

https://ideiasesquecidas.com/

Veja também:

Alguns atalhos úteis no Power Point

É possível utilizar apontador laser, caneta, marcador, e apagar, caso você tenha feito errado.

Teste as técnicas abaixo em um ppt qualquer. Deve estar no modo de apresentação.

ctrl + l = ativa laser (o ponto vermelho da figura, que vai se mover com o mouse)

ctrl + c = ativa caneta

ctrl + i = ativa marcador

Com marcador e caneta, é possível destacar e escrever ao vivo, na apresentação.

Para apagar:

ctrl + e = ativa borracha

shift + e = apaga tudo escrito

É possível dar zoom para aumentar a região a ser mostrada da apresentação, com as teclas “+” e “-“ do computador.

+ Mais zoom na tela

– Mais zoom na tela

Essas técnicas acima podem ajudar bastante na comunicação, e são especialmente úteis nessa época de trabalho remoto.

Método babilônico para raiz quadrada

Uma forma de encontrar a raiz quadrada de um número é com um método conhecido desde os babilônios.

Digamos que eu queira encontrar a raiz de N = 81.

Escolho um número qualquer, digamos a = 5.

Fazemos a conta  (a + N/a)/2

Dá  (5 + 81/5) / 2 = 10,6

E continuamos  a fazer esse mesma conta:

(10,6 + 81/10,6) /2 = 9,12

Os próximos números já dá 9, raiz de 81.

Outro exemplo, quero a raiz de N = 121 e começo com a = 80:

80,00
40,76
21,86
13,70
11,27
11,00
11,00
11,00
11,00

Em poucos passos, converge para 11, raiz de 121.

É um exercício simples. Segue planilha para download.

Raiz.xlsx

Vide também: Método Babilônico para Aproximação de Raiz Quadrada de um Número n | O Baricentro da Mente

O ponto de parada ótimo

Imagine a seguinte situação. Quero alugar um apartamento num bairro muito concorrido de São Paulo. Vou visitar 20 imóveis, e assim que o fizer, ou eu faço a proposta para alugar na hora, ou decido ver o imóvel seguinte e perco o visitado para sempre (afinal, é um bairro concorrido).

O ordem de visitas é aleatória.

Qual a estratégia que maximiza a escolha?

É um claro tradeoff. Para conseguir informação, devo prospectar, porém, por ser uma prospecção destrutiva, vou descartar bons imóveis e acabar ficando sem opções.

Este problema é conhecido como o “Ponto de parada ótimo”, e a resposta ótima é 37%.

Primeiro, tenho que coletar informações, e a única forma de fazer é visitando os imóveis. Visito 37% dos imóveis, e avalio qual o melhor destes.

A seguir, pego o primeiro imóvel igual ou superior ao score avaliado anteriormente.

Exemplo:

Tenho uma lista de 20 imóveis, com notas aleatórias (quanto maior, melhor).

37% de 20 dá 7, arredondando. Visito os 7 primeiros imóveis, sem escolher nenhum deles, mas anotando qual o melhor.

No caso, o melhor imóvel visitado teve nota 65.

A seguir, continuo fazendo as visitas até encontrar algum igual ou superior a 65. No caso, faço a proposta na hora e fico com o imóvel de nota 77.

Na lista, há dois imóveis com score maior (de 91 e 97), de forma que a estratégia citada escolheu o terceiro melhor da lista (lembrando que, no problema, não teríamos essa informação da nota sem visitar – e descartar – o imóvel)

Desafio em Excel.

Dada uma lista com números aleatórios como o do anexo, escrever fórmulas (ou rotinas ou qualquer outro truque) para implementar o algoritmo de parada ótima descrito. Comparar com a melhor solução.

(Clicar em F9 ou mudar qualquer célula vai alterar os valores).

Segue a minha versão da solução, disponível para download no OneDrive.

PontoParada.xlsx

A ideia é sempre a mesma. Pegar o maior valor dos 37% primeiros, e depois o primeiro maior valor encontrado.

Da literatura, este problema tem vários nomes (como o problema da escolha da secretária).

Em geral, experimentos práticos x teoria mostram que tendemos a ser impacientes, e fechar um negócio mais cedo, sem explorar tanto – e optar por uma solução menos ótima do que poderia ser.

Fica a dica: explorar um pouco mais o mercado, antes de fechar algum negócio.

Recomendação de livro: Algoritmos para viver (https://amzn.to/2NxjGh4)