Advertisement
hishlishter

Untitled

Mar 6th, 2025 (edited)
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.71 KB | Source Code | 0 0
  1. package org.example;
  2.  
  3. import javax.swing.*;
  4. import java.awt.*;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7.  
  8. public class Main extends JPanel implements ActionListener {
  9.     // Константы
  10.     private static final int N = 100;
  11.     private static final double TAU = 0.05;
  12.     private static final double TAU_STEP = 0.005;
  13.     private static final double D_H = 0.01;
  14.     private static final double ALPHA = 0.005;
  15.     private static final int R = 10;
  16.     private static final double START_X = -7.0;  // Начальное значение c_x
  17.     private static final double END_X = 1.0;     // Конечное значение c_x
  18.  
  19.     private static final double A0 = 0.45;
  20.     private static final double A1 = 3.06;
  21.     private static final double A2 = 8.08;
  22.     private static final double A3 = 13.06;
  23.     private static final double A4 = 6.03;
  24.     private static final double A5 = -3.8;
  25.  
  26.     // Переменные нейросети
  27.     private double c_x;
  28.     private double[] u_t;
  29.     private double[] u;
  30.     private double[] u_n;
  31.     private double[] g;
  32.     private int n_t;
  33.     private int step;
  34.     private int err;
  35.     private double learningPercentage;
  36.  
  37.     // Графические параметры
  38.     private double graphW, graphH, graphDx, graphBx, graphRx;
  39.  
  40.     // Таймер для анимации
  41.     private Timer timer;
  42.  
  43.     public Main() {
  44.         // Инициализация переменных
  45.         c_x = START_X;  // Начинаем с -7
  46.         u_t = new double[N];
  47.         u = new double[N];
  48.         u_n = new double[N];
  49.         g = new double[R];
  50.         for (int i = 0; i < N; i++) {
  51.             u[i] = 0.0;
  52.             u_t[i] = 0.0;
  53.             u_n[i] = 0.0;
  54.         }
  55.         for (int i = 0; i < R; i++) {
  56.             g[i] = 0.0;
  57.         }
  58.         n_t = N / 2 + 1;  // Обучаемая точка в середине
  59.         step = 1;
  60.         err = 0;
  61.         learningPercentage = 0.0;
  62.  
  63.         // Запуск таймера (обновление каждые 10 мс)
  64.         timer = new Timer(10, this);
  65.         timer.start();
  66.     }
  67.  
  68.     // Функция sign(x)
  69.     private double sign(double x) {
  70.         if (x > 0) return 1.0;
  71.         else if (x < 0) return -1.0;
  72.         return 0.0;
  73.     }
  74.  
  75.     // Функция f(x)
  76.     private double f(double x) {
  77.         return A0 * Math.pow(x, 5) + A1 * Math.pow(x, 4) + A2 * Math.pow(x, 3)
  78.                 + A3 * Math.pow(x, 2) + A4 * x + A5;
  79.     }
  80.  
  81.     // Функция обучения
  82.     private void teach(double[] u, double[] g, int n_t, double delta) {
  83.         double[] delta_g = new double[R];
  84.         for (int r = 0; r < R; r++) {
  85.             double x_r = u[n_t - 1 - r];
  86.             delta_g[r] = ALPHA * sign(x_r) * sign(delta);
  87.         }
  88.         for (int r = 0; r < R; r++) {
  89.             g[r] += delta_g[r];
  90.         }
  91.         err++;
  92.     }
  93.  
  94.     // Вычисление процента обучения
  95.     private void calculateLearningPercentage() {
  96.         double totalError = 0.0;
  97.         double minVal = u[0], maxVal = u[0];
  98.         for (int i = 0; i < N; i++) {
  99.             totalError += Math.abs(u_n[i] - u_t[i]);
  100.             if (u[i] < minVal) minVal = u[i];
  101.             if (u[i] > maxVal) maxVal = u[i];
  102.         }
  103.         double avgError = totalError / N;
  104.         double range = maxVal - minVal;
  105.         if (range < 1e-9) range = 1.0;
  106.         learningPercentage = 100 * (1 - avgError / range);
  107.         if (learningPercentage < 0) learningPercentage = 0;
  108.         if (learningPercentage > 100) learningPercentage = 100;
  109.     }
  110.  
  111.     // Выполнение одного шага
  112.     private void newStep() {
  113.         // Новое положение F
  114.         for (int i = 0; i < N; i++) {
  115.             u_n[i] = f(c_x + i * TAU);
  116.         }
  117.         c_x += TAU_STEP;
  118.  
  119.         // Сброс c_x при выходе за пределы
  120.         if (c_x > END_X) {
  121.             c_x = START_X;
  122.         }
  123.  
  124.         // Прогноз u_t
  125.         for (int i = 0; i < N; i++) {
  126.             u_t[i] = 0.0;
  127.         }
  128.         for (int i = R; i < N; i++) {
  129.             for (int r = 0; r < R; r++) {
  130.                 u_t[i] += g[r] * u[i - 1 - r];
  131.             }
  132.         }
  133.         for (int i = 0; i < R; i++) {
  134.             u_t[i] = u[i];
  135.         }
  136.  
  137.         // Обучение
  138.         double d_u = u_n[n_t] - u_t[n_t];
  139.         if (d_u < -D_H || d_u > D_H) {
  140.             teach(u, g, n_t, d_u);
  141.         }
  142.         step++;
  143.     }
  144.  
  145.     // Обновление переменных
  146.     private void updateVars() {
  147.         newStep();
  148.         for (int i = 0; i < N; i++) {
  149.             u[i] = u_n[i];
  150.         }
  151.         calculateLearningPercentage();
  152.     }
  153.  
  154.     @Override
  155.     protected void paintComponent(Graphics gCanvas) {
  156.         super.paintComponent(gCanvas);
  157.         Graphics2D g2 = (Graphics2D) gCanvas;
  158.         int panelW = getWidth();
  159.         int panelH = getHeight();
  160.  
  161.         // Инициализация графических параметров
  162.         graphW = panelW;
  163.         graphH = panelH;
  164.         graphDx = graphW / N;
  165.         graphBx = (graphW - graphDx * (N - 1)) / 2.0;
  166.         graphRx = graphBx + (N - 1) * graphDx;
  167.  
  168.         // Масштабирование
  169.         double minVal = u[0], maxVal = u[0];
  170.         for (int i = 1; i < N; i++) {
  171.             if (u[i] < minVal) minVal = u[i];
  172.             if (u[i] > maxVal) maxVal = u[i];
  173.         }
  174.         double mid = (maxVal + minVal) / 2.0;
  175.         double diff = maxVal - minVal;
  176.         minVal = mid - diff * 1.5;
  177.         maxVal = mid + diff * 1.5;
  178.         if (Math.abs(maxVal - minVal) < 1e-9) {
  179.             minVal -= 1.0;
  180.             maxVal += 1.0;
  181.         }
  182.         double localMtt = graphH / (maxVal - minVal);
  183.         double y_c = localMtt * maxVal;
  184.  
  185.         // Рисуем оси
  186.         g2.setColor(Color.BLACK);
  187.         g2.drawLine((int)graphBx, 0, (int)graphBx, (int)graphH);
  188.         g2.drawLine((int)graphRx, 0, (int)graphRx, (int)graphH);
  189.         g2.drawLine((int)graphBx, 0, (int)graphRx, 0);
  190.         g2.drawLine((int)graphBx, (int)graphH, (int)graphRx, (int)graphH);
  191.         g2.drawLine((int)graphBx, (int)y_c, (int)graphRx, (int)y_c);
  192.         for (int i = 1; i < N - 1; i++) {
  193.             int x = (int)(graphBx + i * graphDx);
  194.             g2.drawLine(x, (int)(y_c - 3), x, (int)(y_c + 3));
  195.         }
  196.         int x_nt = (int)(graphBx + (n_t - 1) * graphDx);
  197.         g2.drawLine(x_nt, 0, x_nt, (int)graphH);
  198.  
  199.         // Рисуем кривую u (зелёная)
  200.         g2.setColor(Color.GREEN.darker());
  201.         int oldX = (int)graphBx;
  202.         int oldY = (int)(y_c - localMtt * u[0]);
  203.         for (int i = 1; i < N; i++) {
  204.             int x = (int)(graphBx + i * graphDx);
  205.             int y = (int)(y_c - localMtt * u[i]);
  206.             g2.drawLine(oldX, oldY, x, y);
  207.             oldX = x;
  208.             oldY = y;
  209.         }
  210.  
  211.         // Рисуем прогноз u_t (красная)
  212.         g2.setColor(Color.RED);
  213.         oldX = (int)graphBx;
  214.         oldY = (int)(y_c - localMtt * u_t[0]);
  215.         for (int i = 1; i < N; i++) {
  216.             int x = (int)(graphBx + i * graphDx);
  217.             int y = (int)(y_c - localMtt * u_t[i]);
  218.             g2.drawLine(oldX, oldY, x, y);
  219.             oldX = x;
  220.             oldY = y;
  221.         }
  222.  
  223.         // Рисуем текст
  224.         g2.setColor(Color.BLACK);
  225.         int textX = 20;
  226.         int textY = 20;
  227.         g2.drawString("Step = " + step, textX, textY); textY += 16;
  228.         g2.drawString(String.format("dH = %.2f", D_H), textX, textY); textY += 16;
  229.         g2.drawString(String.format("dG = %.3f", ALPHA), textX, textY); textY += 16;
  230.         for (int i = 0; i < R; i++) {
  231.             g2.drawString(String.format("G[%d] = %.3f", i, g[i]), textX, textY);
  232.             textY += 16;
  233.         }
  234.         g2.drawString(String.format("Learning: %.2f%%", learningPercentage), textX, textY);
  235.         textY += 16;
  236.         g2.drawString(String.format("c_x = %.3f", c_x), textX, textY);  // Добавим c_x для отладки
  237.     }
  238.  
  239.     @Override
  240.     public Dimension getPreferredSize() {
  241.         return new Dimension(800, 600);
  242.     }
  243.  
  244.     @Override
  245.     public void actionPerformed(ActionEvent e) {
  246.         updateVars();
  247.         repaint();
  248.     }
  249.  
  250.     public static void main(String[] args) {
  251.         SwingUtilities.invokeLater(() -> {
  252.             JFrame frame = new JFrame("Прогнозирование функции (нейросеть)");
  253.             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  254.             Main panel = new Main();
  255.             frame.setContentPane(panel);
  256.             frame.pack();
  257.             frame.setLocationRelativeTo(null);
  258.             frame.setVisible(true);
  259.         });
  260.     }
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement