@@ -247,6 +247,24 @@ Na aula passada você deveria ter sumido com os erros do código fornecido, e a
247247??? note "Busca Exaustiva - Nivel além do horizonte"
248248 ```cpp
249249 // Foi o Emil
250+ /*
251+ 1. Primeira troca foi deixar de utilizar o algoritmo recursivo para utilizar
252+ um algoritmo iterativo, dessa forma o compilador consegue fazer maiores
253+ inferências para melhorar as otimizações;
254+ https://en.wikipedia.org/wiki/Heap%27s_algorithm
255+ ver: permutarItter
256+
257+ 2. A segunda troca foi utilizar a técnica de "branchless programming" para o
258+ calculo do custo.
259+ Utilizar o operador ternário (? :) pode ser que se evite ramificação no
260+ assembly (CMOV - Conditional Move) e o erro de branch prediction.
261+ Outra técnica é utilizar operações bitwise quando possível.
262+
263+ 3. A terceira troca e extramamente específica para nosso caso, nem sempre
264+ será possivel, é pré-calcular as distâncias que temos em nosso problema,
265+ assim trocamos um calculo matemático sqrt(u * u + v * v), lembrando que
266+ sqrt ainda é uma operação lenta, por um acesso direto à memoria.
267+ */
250268 #include <algorithm>
251269 #include <chrono>
252270 #include <cmath>
@@ -255,9 +273,6 @@ Na aula passada você deveria ter sumido com os erros do código fornecido, e a
255273 #include <limits>
256274 #include <vector>
257275
258- // 1. calcula custo Branchless
259- // 2. precalculated matrix
260-
261276 using namespace std;
262277
263278 const int CAPACIDADE_MOTO = 5;
@@ -333,9 +348,6 @@ Na aula passada você deveria ter sumido com os erros do código fornecido, e a
333348 return custo;
334349 }
335350
336- /*
337- https://en.wikipedia.org/wiki/Heap%27s_algorithm
338- */
339351 static void permutarItter(const int motorista, const int coleta, vector<Ponto>& __restrict entregas,
340352 vector<int>& rota, int inicio, double &melhorCusto,
341353 vector<int>& melhorRota) {
0 commit comments