Advertisement
finalmail

temp 1

Nov 3rd, 2019
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const N = 500;
  2. let board = [];
  3.  
  4. const toZero = _ => 0;
  5.  
  6. const getRandomInt = max => Math.floor(Math.random() * Math.floor(max));
  7.  
  8. const generateBoard = () => {
  9.   const newBoard = [];
  10.   for (let i = 0; i < N; i++) {
  11.     newBoard.push(i);
  12.   }
  13.   for (let i = 0; i < N; i++) {
  14.     const ind = getRandomInt(N);
  15.     const temp = newBoard[i];
  16.     newBoard[i] = newBoard[ind];
  17.     newBoard[ind] = temp;
  18.   }
  19.  
  20.   return newBoard;
  21. };
  22.  
  23. const getConflicts = () => {
  24.   let conflictCount = 0;
  25.   let conflicts = board.map(toZero);
  26.   for (let i = 0; i < N - 1; i++) {
  27.     for (let j = i + 1; j < N; j++) {
  28.       if (board[i] === board[j]) {
  29.         conflicts[i]++;
  30.         conflicts[j]++;
  31.         conflictCount++;
  32.       } else if (Math.abs(board[i] - board[j]) === Math.abs(i - j)) {
  33.         conflicts[i]++;
  34.         conflicts[j]++;
  35.         conflictCount++;
  36.       }
  37.     }
  38.   }
  39.  
  40.   return [conflictCount, conflicts];
  41. };
  42.  
  43. const pickRandomConflictedQueen = conflicts => {
  44.   const randomIndex = getRandomInt(N);
  45.   if (conflicts[randomIndex] !== 0) {
  46.     return randomIndex;
  47.   }
  48.   return pickRandomConflictedQueen(conflicts);
  49. };
  50.  
  51. const solve = () => {
  52.   let [conflictCount, conflicts] = getConflicts();
  53.   const MAX_STEPS = 2 * N;
  54.   let step = 0;
  55.   while (step++ < MAX_STEPS) {
  56.     if (conflictCount === 0) {
  57.       return "S";
  58.     }
  59.  
  60.     const maxConfl = Math.max(...conflicts);
  61.     const maxConfclits = conflicts.map(confl =>
  62.       confl === maxConfl ? maxConfl : 0
  63.     );
  64.     const queenAtCol = pickRandomConflictedQueen(maxConfclits);
  65.     let min = conflictCount;
  66.     let u = [];
  67.     let uArr = [];
  68.  
  69.     for (let j = 0; j < N; j++) {
  70.       board[queenAtCol] = j;
  71.       let [conflCountAtJ, conflictsAtJ] = getConflicts();
  72.       if (conflCountAtJ < min) {
  73.         min = conflCountAtJ;
  74.         u = [j];
  75.         uArr = [conflictsAtJ];
  76.       } else if (conflCountAtJ === min) {
  77.         u.push(j);
  78.         uArr.push(conflictsAtJ);
  79.       }
  80.     }
  81.     // tva ne e new row
  82.     const newRow = getRandomInt(u.length - 1);
  83.     board[queenAtCol] = u[newRow];
  84.  
  85.     conflictCount = min;
  86.     conflicts = uArr[newRow];
  87.   }
  88.   return "F";
  89. };
  90.  
  91. console.time("l");
  92. while (true) {
  93.   board = generateBoard();
  94.   const res = solve();
  95.   if (res === "S") {
  96.     break;
  97.   }
  98. }
  99. console.timeEnd("l");
  100.  
  101. console.log("end");
  102. // console.log("conflictCount, conflicts", conflictCount, conflicts);
  103. // console.log('board', board)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement