public static void nextW_DeltaSearch() { if (!userRequestedW.isEmpty()) { w = userRequestedW.pollFirst(); return; } if (!wasFract[0]) { w = leftW; wasFract[0] = true; return; } else if (!wasFract[wasFract.length - 1]) { w = rightW; wasFract[wasFract.length - 1] = true; return; } else { for (int i = maxFractPow2; i > 0; i--) { for (int j = 0; (1 << (i - 1)) + j * (1 << i) < wasFract.length; j++) { float tmp = leftW + (rightW - leftW) * (1 + 2 * j) / (float) (1 << (maxFractPow2 + 1 - i)); if (!wasFract[(1 << (i - 1)) + j * (1 << i)] && tmp >= chosenLeftW && tmp <= chosenRightW) { w = tmp; wasFract[(1 << (i - 1)) + j * (1 << i)] = true; return; } } } } frame.stop(); JOptionPane.showMessageDialog(frame, "Максимальная точность на данном отрезке достигнута"); }
private static void refresh() { place = a = V = 0; time = 0; graphSpring.clear(); frame.jSliderdY2.setValue(2); maxA = minA = 0; periodCount = 0; graph2X0 = 0; idleProcess = false; idleTime = 0; frame.setDone(0); curExtremumCount = 0; }
public static void count(float dt) { if (idleProcess) { idleTime -= dt; if (idleTime < 0) { refresh(); if (searchType == SearchType.DELTA) { nextW_DeltaSearch(); } else { nextW_TernarySearch(); } saveToFile(); frame.setW(w); } } if (m == 0) { return; } try { a = -k * place - V * b + (float) ex.count(); } catch (Exception exc) { log("Exception while changing \'a\' value", exc); } if (!idleProcess && V >= 0 && V + a * dt <= 0 && a * dt != 0 || V <= 0 && V + a * dt >= 0 && a * dt != 0) { extremums[curExtremumCount++] = place; int T = checkForDone(); frame.setDone(periodCount); if (T > 0) { minA = maxA = extremums[curExtremumCount - 1]; for (int i = 1; i < T; i++) { minA = Math.min(minA, extremums[curExtremumCount - 1 - i]); maxA = Math.max(maxA, extremums[curExtremumCount - 1 - i]); } } } V += a * dt; place += V * dt; if (showHOGraph) { graphSpring.addLast(new Vector2f(time, place)); while (2 * place / graph2dY > height2) { frame.jSliderdY2.setValue(frame.jSliderdY2.getValue() + 1); } } if (updateCount == 0) { updateCount++; averageDT = dt; } else { averageDT = (averageDT * updateCount + dt) / (updateCount + 1); updateCount++; } if (!idleProcess && (periodCount >= maxPeriodsNeeded || skipW)) { if (!skipW) { if (maxA - minA > EPS) { add(w, (maxA - minA) / 2); } else { add(w, Math.abs(maxA)); } } else { skipW = false; } if (searchType == SearchType.TERNARY) { if (Float.isNaN(A1_tern)) { A1_tern = (maxA - minA) / 2; } else { A2_tern = (maxA - minA) / 2; } } idleTime = startIdleTime; idleProcess = true; } skipW = false; }