[JAVA] Simuler la méthode simplex avec GUI

1. Aperçu du programme

Ce programme est un programme pour trouver la solution optimale de la fonction de maximisation dans la méthode de programmation linéaire. En programmation linéaire (dans le cas de la maximisation), il existe des fonctions de maximisation et des contraintes. La fonction de maximisation est une fonction linéaire et est une fonction à des fins de maximisation. La condition de contrainte est une inégalité linéaire ou une équation linéaire, qui définit la plage de la solution de la fonction de maximisation. Cependant, dans ce programme, la fonction de maximisation et la condition de contrainte sont respectivement définies sur 2 variables (X, Y) (pour plus de détails sur la fonction de maximisation et la condition de contrainte dans ce programme, reportez-vous à la méthode d'opération au chapitre 3). Il existe une méthode simplex comme algorithme pour trouver la solution optimale. La méthode simplex commence à partir d'un certain point dans la zone viable et répète le déplacement de ce point vers la fonction de maximisation plus large. Lorsque le point cesse de bouger, la fonction de maximisation devient la solution optimale. Dans ce programme, l'utilisateur entre et définit la fonction de maximisation et les contraintes. Ensuite, sur la base de la fonction de maximisation d'entrée et des conditions de contrainte, le mouvement des points par la méthode du simplexe est simulé, et la solution optimale est obtenue et affichée. Cependant, ce programme simule uniquement le mouvement des points dans la méthode simplex à l'aide de l'interface graphique, et ne trouve pas réellement la solution optimale en utilisant la méthode simplex. Pour la solution optimale, les coordonnées de chaque sommet dans la zone réalisable sont affectées à la fonction de maximisation, et la solution avec la plus grande valeur est affichée comme solution optimale.

2. Structure du programme

La structure du programme est la suivante.

  1. Classe Simplex_simu
  2. méthode principale Classe 2.MyPanel7
  3. Constructeur
  4. méthode paintComponent
  5. méthode d'exécution
  6. méthode actionPerformed

3. Contenu de traitement de classe

Le contenu de chaque processus sera expliqué. Veuillez le lire en le comparant avec le code (chapitre 5).

3.1. Classe Simplex_simu

Dans la méthode principale de cette classe, le panneau affiché par la fonction de la classe MyPanel7 est collé dans la fenêtre. De plus, le traitement de base de la fenêtre, tel que la taille de la fenêtre, le réglage du traitement lorsque le bouton de fermeture est enfoncé, et l'état visible de la fenêtre, sont décrits pour que l'utilisateur puisse l'actionner.

3.2.MyPanel7 classe

Dans le constructeur, un champ de texte permettant de saisir la fonction de maximisation et les conditions de contrainte est déclaré et organisé. De plus, afin de permettre à l'utilisateur de comprendre plus facilement où et quoi saisir, des étiquettes sont également déclarées et placées pour inviter l'utilisateur à entrer. Ensuite, la valeur d'entrée est reflétée dans le programme, et deux boutons, un bouton pour tracer une ligne droite sur le graphique (bouton1) et un bouton pour démarrer la simulation (bouton2), sont également déclarés et agencés. De cette manière, le constructeur décrit principalement la partie d'entrée dans l'écran. La méthode actionPerformed décrit le processus lorsque l'utilisateur clique sur le bouton. Lorsque vous cliquez sur button1, la valeur est extraite du champ de texte et stockée dans les informations du tableau. Lorsque button2 est cliqué, la simulation de la méthode simplex démarre. Dans la méthode d'exécution, le thread est arrêté pendant 100 ms. En s'arrêtant pendant 100 ms, l'utilisateur peut vérifier le mouvement des points pendant la simulation. Ensuite, dans la méthode paintComponent, la simulation (déplacement des points) et le calcul de la solution optimale sont effectués. Veuillez lire le texte du commentaire du code source pour savoir quel type de description est exécuté. Ici, un processus approximatif sera décrit. Tout d'abord, tracez trois lignes droites sur le graphique à partir des trois contraintes d'entrée. Ensuite, la section x, la section y et l'intersection sont obtenues à partir des trois lignes droites. À partir de ces points, les points qui ne sont pas inclus dans la zone exécutable sont définis sur les coordonnées (-1, -1) et exclus. Les points non exclus ici sont les pics de la zone de faisabilité et sont candidats à la solution optimale. De cette manière, celui qui donne la solution maximale est recherché parmi les candidats pour la solution optimale obtenue. Celui qui donne la solution maximale est la solution optimale. Maintenant que la solution optimale a été trouvée, nous allons effectuer une simulation. Tout d'abord, faites attention au coefficient de la fonction de maximisation et augmentez la variable avec le coefficient le plus élevé. Autrement dit, à partir de l'origine, le point est déplacé vers la section de la variable avec le coefficient le plus élevé. À ce stade, si la section donne la solution optimale, arrêtez-vous là. Ensuite, après être passé à la section, déplacez-vous vers l'intersection de deux lignes droites près de la section. Si cette intersection donne la solution optimale, arrêtez-vous là. Ensuite, il est déplacé vers l'intersection suivante. Si cette intersection donne la solution optimale, arrêtez-vous là. De cette manière, une ramification conditionnelle est effectuée et le mouvement des points est déterminé en fonction du point dans la zone réalisable où se trouve le point de solution optimale. Ensuite, lorsqu'il s'arrête au point où la solution optimale est obtenue, la solution optimale est affichée dans le coin supérieur droit du graphique, et le processus est terminé.

4. Méthode de fonctionnement

Lorsque la fonction objectif est S₁X + S₂Y, l'utilisateur peut saisir et déterminer S₁ et S₂, qui sont les coefficients de X et Y, à partir du champ d'entrée. Cependant, les valeurs saisies dans S₁ et S₂ sont limitées aux entiers positifs. De plus, les conditions de contrainte pour déterminer la zone exécutable sont limitées à trois équations par commodité. Lorsque les trois équations sont αiX + βiY ≤ γi (1 ≤ i ≤ 3), l'utilisateur peut saisir et déterminer αi, βi et γi à partir du champ d'entrée (pour plus de commodité, les trois équations ont des nombres d'inégalité). ≤). Cependant, ces valeurs sont également limitées aux entiers positifs. Après avoir saisi la fonction de maximisation et les conditions de contrainte, cliquez sur le bouton "(1) Définir la valeur d'entrée et la sortie sur le graphique". En cliquant sur ce bouton, la valeur saisie sera affectée à chaque variable du programme. Ensuite, la condition de contrainte est écrite dans le graphique. Ensuite, cliquez sur le bouton "② Démarrer la simulation". En cliquant sur ce bouton, le déplacement des points par la méthode simplex commence par l'origine comme point de départ. Ensuite, (X, Y) où le point s'arrête donne la solution optimale de la fonction de maximisation. La solution optimale à ce moment est affichée dans le coin supérieur droit du graphique et le programme se termine. Voici comment faire fonctionner ce programme. Vous pouvez le faire autant de fois que vous le souhaitez en entrant à nouveau les chiffres et en cliquant sur les deux boutons dans l'ordre.

5. Code

Simplex_simu.java


import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.Font;

public class Simplex_simu {
    public static void main(String[] args) {
        JFrame frame = new JFrame();     //Génération de trames
        
        frame.setTitle("Simulation de méthode simplex");       //Titre de la fenêtre
        frame.setSize(675, 680);                                      //La taille de la fenêtre
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   //Traitement lorsque le bouton × est enfoncé
        
        MyPanel panel = new MyPanel(); //Générer MyPanel
        frame.getContentPane().add(panel); //Coller mon panneau sur le cadre
        
        frame.setVisible(true);             //Rendre la fenêtre visible
    }
}

class MyPanel extends JPanel implements Runnable,ActionListener {
    int count = 0;
    int info[] = new int[11];
    
    int simu_judge = 0;       //Variables pour déterminer s'il faut démarrer la simulation
                              //simu_judge=1 pour démarrer la simulation
    
    int scale_judge = 0;      //Variable pour déterminer s'il faut écrire l'échelle sur l'axe du graphique
                              //scale_judge=1 pour démarrer la simulation
    
    //Cercle(Montrez la solution à ce moment)Coordonnées du centre de
    int x = 100;
    int y = 600;
    
    //Stockez le nombre d'étapes pour trouver la solution optimale(step=En 4, la solution optimale est trouvée et terminée)
    int step = 0;
    
    //X à l'intersection de trois droites,Variable pour stocker les coordonnées y
    int x_intersection12 = -1;   //Coordonnée X de l'intersection de la première ligne droite entrée et de la seconde ligne droite entrée
    int x_intersection13 = -1;   //Coordonnée X de l'intersection de la première ligne droite entrée et de la troisième ligne droite entrée
    int x_intersection23 = -1;   //La coordonnée x de l'intersection des deuxième et troisième lignes droites
    int y_intersection12 = -1;   //Coordonnée Y de l'intersection de la première ligne droite entrée et de la seconde ligne droite entrée
    int y_intersection13 = -1;   //Coordonnée Y de l'intersection de la première ligne droite entrée et de la troisième ligne droite entrée
    int y_intersection23 = -1;   //Coordonnée Y de l'intersection de la deuxième ligne droite entrée et de la troisième ligne droite entrée
    
    //Champ de texte(Fonction de maximisation)
    JTextField o_x = new JTextField(10);
    JTextField o_y = new JTextField(10);
    JTextField o_n = new JTextField(10);
    
    //Champ de texte(Condition de contrainte 1, ligne droite à saisir en premier)
    JTextField s_x1 = new JTextField(10);
    JTextField s_y1 = new JTextField(10);
    JTextField s_n1= new JTextField(10);
    
    //Champ de texte(Contrainte 2 et 2ème ligne droite à saisir)
    JTextField s_x2 = new JTextField(10);
    JTextField s_y2 = new JTextField(10);
    JTextField s_n2 = new JTextField(10);
    
    //Champ de texte(Condition de contrainte 3ème et 3ème ligne droite d'entrée)
    JTextField s_x3 = new JTextField(10);
    JTextField s_y3 = new JTextField(10);
    JTextField s_n3 = new JTextField(10);
    
    //étiquette(Conseils pour demander une entrée à l'écran)
    JLabel label1 = new JLabel("x            +");
    JLabel label2 = new JLabel("y");
    JLabel label3 = new JLabel("");
    JLabel label4 = new JLabel("x            +");
    JLabel label5 = new JLabel("y           ≦");
    JLabel label6 = new JLabel("x            +");
    JLabel label7 = new JLabel("y           ≦");
    JLabel label8 = new JLabel("x            +");
    JLabel label9 = new JLabel("y           ≦");
    JLabel label10 = new JLabel("x≧0、y≧0");
    JLabel label11 = new JLabel("Fonction objective(Fonction de maximisation)");
    JLabel label12 = new JLabel("Contraintes");
    
    //Bouton 1(Refléter la valeur saisie dans le programme et tracer une ligne droite sur le graphique)
    JButton button1 = new JButton("(1) Réglez la valeur d'entrée et la sortie sur le graphique");
    //Bouton 2(Commencez à simuler la méthode simplex)
    JButton button2 = new JButton("② Lancer la simulation");
    
    public MyPanel() {
        //Enregistrer l'écouteur d'événements
        button1.addActionListener(this);
        button2.addActionListener(this);
        
        //Paramètres de disposition du panneau
        JPanel panel1 = new JPanel();
        panel1.setLayout(new GridLayout(1,1));
        JPanel panel2 = new JPanel();
        panel2.setLayout(new GridLayout(1,5));
        JPanel panel3 = new JPanel();
        panel3.setLayout(new GridLayout(1,1));
        JPanel panel4 = new JPanel();
        panel4.setLayout(new GridLayout(1,5));
        JPanel panel5 = new JPanel();
        panel5.setLayout(new GridLayout(1,5));
        JPanel panel6 = new JPanel();
        panel6.setLayout(new GridLayout(1,5));
        JPanel panel7 = new JPanel();
        panel7.setLayout(new GridLayout(1,1));
        
        //Unifier la couleur de chaque panneau au blanc
        panel1.setBackground(Color.WHITE);
        panel2.setBackground(Color.WHITE);
        panel3.setBackground(Color.WHITE);
        panel4.setBackground(Color.WHITE);
        panel5.setBackground(Color.WHITE);
        panel6.setBackground(Color.WHITE);
        panel7.setBackground(Color.WHITE);
        
        //Ajouter chaque composant à chaque panneau
        panel1.add(label11);
        
        panel2.add(o_x);
        panel2.add(label1);
        panel2.add(o_y);
        panel2.add(label2);
        panel2.add(label3);
        
        panel3.add(label12);
        
        panel4.add(s_x1);
        panel4.add(label4);
        panel4.add(s_y1);
        panel4.add(label5);
        panel4.add(s_n1);
        
        panel5.add(s_x2);
        panel5.add(label6);
        panel5.add(s_y2);
        panel5.add(label7);
        panel5.add(s_n2);
        
        panel6.add(s_x3);
        panel6.add(label8);
        panel6.add(s_y3);
        panel6.add(label9);
        panel6.add(s_n3);
        
        panel7.add(label10);
        
        
        //Chaque panneau, un panneau f_Coller sur panneau1
        JPanel f_panel1 = new JPanel();
        f_panel1.setLayout(new GridLayout(9,1));
        f_panel1.add(panel1);
        f_panel1.add(panel2);
        f_panel1.add(panel3);
        f_panel1.add(panel4);
        f_panel1.add(panel5);
        f_panel1.add(panel6);
        f_panel1.add(panel7);
        f_panel1.add(button1);
        f_panel1.add(button2);
        
        f_panel1.setBackground(Color.WHITE);    //f_Installez le panneau 1 en blanc
        add(f_panel1);                          //f_Ajouter panel1 à MyPanel
        
        setBackground(Color.WHITE);
        Thread refresh = new Thread(this);
        refresh.start();
        
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);             //Remplissez le composant avec la couleur d'arrière-plan
        int seppen[] = new int[6];
        int seppen_max = 0;        //Section(x,y les deux)Valeur maximale de
        int xy_max = 0;               //X dans le graphique,Valeur maximale de y
        int x_min = 0;                 //x valeur minimale de la section
        int y_min = 0;                 //Valeur minimale de la section y
        int n_x_min = 0;              //x Numéro de l'expression avec la valeur minimale de la section
        int n_y_min = 0;              //Le numéro de l'expression avec la valeur minimale de la section y
        double d_masu = 0;         //Unité graphique par pixel
        int select3 = 0;           //À l'étape 3, enregistrez les numéros des lignes droites impliquées dans les intersections restantes qui n'ont pas encore bougé
        
        //Trouvez les valeurs temporaires des sections X et Y et attribuez-les à chaque variable(Attribuez jusqu'à 1 chiffre à une variable en convertissant plus de 10 fois le type int)
        int temporary_x1 = (int)(((double)info[4]/(double)info[2])*10);   //Section X de la première ligne droite entrée
        int temporary_y1 = (int)(((double)info[4]/(double)info[3])*10);   //Section Y de la première ligne droite entrée
        int temporary_x2 = (int)(((double)info[7]/(double)info[5])*10);   //Section X de la deuxième ligne droite entrée
        int temporary_y2 = (int)(((double)info[7]/(double)info[6])*10);   //Section Y de la deuxième ligne droite entrée
        int temporary_x3 = (int)(((double)info[10]/(double)info[8])*10);  //Section X de la troisième ligne droite entrée
        int temporary_y3 = (int)(((double)info[10]/(double)info[9])*10);  //Section Y de la troisième ligne droite d'entrée
        
        //La section obtenue ci-dessus est séquencée seppen[]Stocker dans
        seppen[0] = temporary_x1;
        seppen[1] = temporary_y1;
        seppen[2] = temporary_x2;
        seppen[3] = temporary_y2;
        seppen[4] = temporary_x3;
        seppen[5] = temporary_y3;
        
        //Trouvez la valeur maximale de la section.
        seppen_max = seppen[0];
        for(int i=1; i<6; i++){
            if(seppen[i] > seppen_max){
                seppen_max = seppen[i];
            }
        }
        
        //À partir de la valeur maximale de la section, trouvez la valeur maximale de l'échelle du graphique.
        while(true){
            //Lorsque la valeur maximale de l'échelle du graphique dépasse la valeur maximale de la section
            if(xy_max >= seppen_max){
                break;                //Sortez de la boucle et xy à ce stade_Réglez max à la valeur maximale de l'échelle
            }
            xy_max = xy_max + 150;    //xy_Augmenter le maximum de 150
                                      //(Puisque la section est multipliée par 10 en haut, la valeur maximale de l'échelle augmente en fait de 15)
        }
        
        //Trouvez l'unité graphique par pixel
        d_masu = ((double)300)/((double)xy_max)*10;     //300 est le nombre de pixels dans la direction verticale du graphique
                                                        //Divisez 300 par la valeur maximale de l'échelle et multipliez par 10 pour obtenir la valeur en unités graphiques.
        
        //Trouvez les coordonnées de chaque section dans le graphique
        int decisive_x1 = (int)(((double)info[4]/(double)info[2])*d_masu);   //Section X de la première ligne droite entrée
        int decisive_y1 = (int)(((double)info[4]/(double)info[3])*d_masu);   //Section Y de la première ligne droite entrée
        int decisive_x2 = (int)(((double)info[7]/(double)info[5])*d_masu);   //Section X de la deuxième ligne droite entrée
        int decisive_y2 = (int)(((double)info[7]/(double)info[6])*d_masu);   //Section Y de la deuxième ligne droite entrée
        int decisive_x3 = (int)(((double)info[10]/(double)info[8])*d_masu);  //Section X de la troisième ligne droite entrée
        int decisive_y3 = (int)(((double)info[10]/(double)info[9])*d_masu);  //Section Y de la troisième ligne droite d'entrée
        
        //Précautions lors de l'entrée
        g.drawString("* Assurez-vous de saisir un entier positif dans tous les champs de saisie.",120,640);
        
        
        g.drawLine(100,275,100,600);    //axe y
        g.drawLine(100,600,425,600);    //axe x
        
        g.drawLine(95,300,105,300);     //échelle de l'axe y(D'abord du haut)
        g.drawLine(95,400,105,400);     //échelle de l'axe y(Deuxième du haut)
        g.drawLine(95,500,105,500);     //échelle de l'axe y(Troisième à partir du haut)
        
        g.drawLine(200,595,200,605);    //échelle de l'axe des x(Premier de la gauche)
        g.drawLine(300,595,300,605);    //échelle de l'axe des x(Deuxième à partir de la gauche)
        g.drawLine(400,595,400,605);    //échelle de l'axe des x(Troisième à partir de la gauche)
        
        //flèche de l'axe y
        g.drawLine(100,275,95,280);
        g.drawLine(100,275,105,280);
        //flèche de l'axe des x
        g.drawLine(425,600,420,595);
        g.drawLine(425,600,420,605);
        
        //Tracez un graphique des trois lignes droites d'entrée
        g.drawLine(decisive_x1+100,600,100,600-decisive_y1);
        g.drawLine(decisive_x2+100,600,100,600-decisive_y2);
        g.drawLine(decisive_x3+100,600,100,600-decisive_y3);
        
        //Calculez la valeur de chaque échelle
        int n_xy1 = xy_max/30;
        int n_xy2 = (xy_max/30)*2;
        int n_xy3 = xy_max/10;
        
        //Convertit la valeur numérique de chaque échelle en une chaîne de caractères(Pour compter le nombre de chiffres dans chaque balance)
        String s_xy1 = String.valueOf(n_xy1);
        String s_xy2 = String.valueOf(n_xy2);
        String s_xy3 = String.valueOf(n_xy3);
        
        //Obtenez le nombre de chiffres de chaque échelle et remplacez(Pour éviter que la position de la valeur numérique sur l'échelle ne change en fonction du nombre de chiffres)
        int xy1_length = String.valueOf(n_xy1).length();
        int xy2_length = String.valueOf(n_xy2).length();
        int xy3_length = String.valueOf(n_xy3).length();
        
        //Lorsque bottan1 est entré(Écrivez la valeur de chaque échelle sur le graphique)
        if(scale_judge == 1){
            g.drawString(s_xy1, 200-(xy1_length*3), 620);
            g.drawString(s_xy2, 300-(xy2_length*3), 620);
            g.drawString(s_xy3, 400-(xy3_length*3), 620);
            g.drawString(s_xy1, 90-(xy1_length*6), 505);
            g.drawString(s_xy2, 90-(xy2_length*6), 405);
            g.drawString(s_xy3, 90-(xy3_length*6), 305);
        }
        
        //Trouvez les valeurs minimales des sections x et y. En outre, le numéro de la ligne droite avec la valeur minimale(Quel numéro a été entré)Cherchant
        x_min = decisive_x1;
        n_x_min = 1;
        y_min = decisive_y1;
        n_y_min = 1;
        
        if(x_min > decisive_x2){
            x_min = decisive_x2;
            n_x_min = 2;
        }
        if(x_min > decisive_x3){
            x_min = decisive_x3;
            n_x_min = 3;
        }
        
        
        if(y_min > decisive_y2){
            y_min = decisive_y2;
            n_y_min = 2;
        }
        if(y_min > decisive_y3){
            y_min = decisive_y3;
            n_y_min = 3;
        }
        
        //Chaque ligne droite(Ligne droite en raison de contraintes)Valeur limite supérieure de(Terme constant)À une valeur en unités de graphique et substitut
        int upper1 = (int)(((double)info[4])*d_masu);
        int upper2 = (int)(((double)info[7])*d_masu);
        int upper3 = (int)(((double)info[10])*d_masu);
        
        
        //Trouvez la coordonnée x de l'intersection de chaque ligne droite
        x_intersection12 = (int)((((double)info[7]/(double)info[6])-((double)info[4]/(double)info[3]))/(((double)info[5]/(double)info[6])-((double)info[2]/(double)info[3]))*d_masu);
        x_intersection13 = (int)((((double)info[10]/(double)info[9])-((double)info[4]/(double)info[3]))/(((double)info[8]/(double)info[9])-((double)info[2]/(double)info[3]))*d_masu);
        x_intersection23 = (int)((((double)info[10]/(double)info[9])-((double)info[7]/(double)info[6]))/(((double)info[8]/(double)info[9])-((double)info[5]/(double)info[6]))*d_masu);
        
        //Trouvez la coordonnée y de l'intersection de chaque ligne droite
        y_intersection12 = (int)((((double)info[7]/(double)info[5])-((double)info[4]/(double)info[2]))/(((double)info[6]/(double)info[5])-((double)info[3]/(double)info[2]))*d_masu);
        y_intersection13 = (int)((((double)info[10]/(double)info[8])-((double)info[4]/(double)info[2]))/(((double)info[9]/(double)info[8])-((double)info[3]/(double)info[2]))*d_masu);
        y_intersection23 = (int)((((double)info[10]/(double)info[8])-((double)info[7]/(double)info[5]))/(((double)info[9]/(double)info[8])-((double)info[6]/(double)info[5]))*d_masu);
        
        //S'il n'y a pas d'intersection, les coordonnées(-1,-1)Mis à.(-1,-1)Est hors de la zone exécutable
        //Lorsque les droites 1 et 2 sont parallèles
        if(x_intersection12>2000000000 || y_intersection12>2000000000){
            x_intersection12 = -1;
            y_intersection12 = -1;
        }
        //Lorsque les droites 1 et 3 sont parallèles
        if(x_intersection13>2000000000 || y_intersection13>2000000000){
            x_intersection13 = -1;
            y_intersection13 = -1;
        }
        //Lorsque les droites de 2 et 3 sont parallèles
        if(x_intersection23>2000000000 || y_intersection23>2000000000){
            x_intersection23 = -1;
            y_intersection23 = -1;
        }
        
        //Lorsque l'intersection de 1 et 2 est en dehors de la plage de la zone viable
        if(info[8]*x_intersection12+info[9]*y_intersection12 > upper3){
            x_intersection12 = -1;
            y_intersection12 = -1;
        }
        //Lorsque l'intersection de 1 et 3 est en dehors de la plage de la zone viable
        if(info[5]*x_intersection13+info[6]*y_intersection13 > upper2){
            x_intersection13 = -1;
            y_intersection13 = -1;
        }
        //Lorsque l'intersection de 2 et 3 est en dehors de la plage de la zone viable
        if(info[2]*x_intersection23+info[3]*y_intersection23 > upper1){
            x_intersection23 = -1;
            y_intersection23 = -1;
        }
        
        
        int answer_x = info[0]*x_min;    //section x(valeur minimum)Solution en
        int answer_y = info[1]*y_min;    //section x(valeur minimum)Solution en
        
        //Solution à l'intersection de chaque ligne droite(La valeur initiale est-1)
        int answer12 = -1;
        int answer13 = -1;
        int answer23 = -1;
        
        //Si la solution à l'intersection de chaque ligne droite se trouve dans la zone de faisabilité, attribuez cette solution à chaque variable
        if(x_intersection12>0 && y_intersection12>0){
            answer12 = info[0]*x_intersection12+info[1]*y_intersection12;
        }
        if(x_intersection13>0 && y_intersection13>0){
            answer13 = info[0]*x_intersection13+info[1]*y_intersection13;
        }
        if(x_intersection23>0 && y_intersection23>0){
            answer23 = info[0]*x_intersection23+info[1]*y_intersection23;
        }
        
        //La solution maximale à partir des solutions obtenues ci-dessus(Solution optimale)Rechercher et répondre_Remplacer par max
        int answer_max = answer_x;
        if(answer_max < answer_y){
            answer_max = answer_y;
        }
        if(answer_max < answer12){
            answer_max = answer12;
        }
        if(answer_max < answer13){
            answer_max = answer13;
        }
        if(answer_max < answer23){
            answer_max = answer23;
        }
        
        //Lorsque le bouton pour démarrer la simulation est cliqué
        if(simu_judge == 1){
            
            g.setColor(Color.red);          //Définissez la couleur du cercle à dessiner sur le rouge
            
            g.fillOval(x-4, y-4, 8, 8);     //Tracez un cercle((x-4,y-4)Est le centre du cercle)
            //étape 1(Déplacer une section depuis l'origine)
            if(step == 1){
                //Lorsque le coefficient de la section y de la fonction objectif est plus grand
                if(info[0] <= info[1]){
                    y = y-1;              //Se déplacer le long de l'axe y à partir de l'origine
                    //Lorsque le point atteint la valeur minimale de la section y
                    if(y == 600-y_min){
                        //Si ce point donne la solution optimale
                        if(answer_max == answer_y){
                            step = 4;          //Passez à l'étape 4
                        }
                        //Si ce point ne donne pas la solution optimale
                        else{
                            step = 2;          //Passez à l'étape 2
                        }
                    }
                }
                //Lorsque le coefficient de la section y de la fonction objectif est plus petit
                else if(info[0] > info[1]){
                    x = x+1;              //Se déplacer le long de l'axe des x à partir de l'origine
                    //Lorsque le point atteint la valeur minimale de x section
                    if(x == x_min+100){
                        //Si ce point donne la solution optimale
                        if(answer_max == answer_x){
                            step = 4;         //Passez à l'étape 4
                        }
                        //Si ce point ne donne pas la solution optimale
                        else{
                            step = 2;         //Passez à l'étape 2
                        }
                    }
                }
            }
            //Étape 2(Passer d'une section à une intersection)
            else if(step == 2){
                //Lorsque le coefficient de la section y de la fonction objectif est plus grand
                if(info[0] <= info[1]){
                    //Ligne droite 1,Lorsque l'intersection de 2 est atteinte(Limité à la plage de la zone exécutable)
                    if(x_intersection12>0 && x>x_intersection12+100){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x-(x - (x_intersection12+100));
                        y = y-(y - (600-y_intersection12));
                        //Si ce point donne la solution optimale
                        if(answer12 > answer13 && answer12 > answer23){
                            step = 4;          //Passez à l'étape 4
                        }
                        //Si ce point ne donne pas la solution optimale
                        else{
                            step = 3;       //Passez à l'étape 3
                            select3 = 1;    //N'oubliez pas la ligne droite 1 comme indice pour trouver les intersections restantes
                        }
                    }
                    //Ligne droite 1,En atteignant l'intersection de 3(Limité à la plage de la zone exécutable)
                    else if(x_intersection13>0 && x>x_intersection13+100){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x-(x - (x_intersection13+100));
                        y = y-(y - (600-y_intersection13));
                        //Si ce point donne la solution optimale
                        if(answer13 > answer12 && answer13 > answer23){
                            step=4;          //Passez à l'étape 4
                        }
                        //Si ce point ne donne pas la solution optimale
                        else{
                            step = 3;       //Passez à l'étape 3
                            select3 = 2;    //N'oubliez pas la ligne droite 2 comme indice pour trouver les intersections restantes
                        }
                    }
                    //Ligne droite 2,En atteignant l'intersection de 3(Limité à la plage de la zone exécutable)
                    else if(x_intersection23>0 && x>x_intersection23+100){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x-(x - (x_intersection23+100));
                        y = y-(y - (600-y_intersection23));
                        //Si ce point donne la solution optimale
                        if(answer23 > answer12 && answer23 > answer13){
                            step=4;          //Passez à l'étape 4
                        }
                        //Si ce point ne donne pas la solution optimale
                        else{
                            step = 3;       //Passez à l'étape 3
                            select3 = 3;    //N'oubliez pas la ligne droite 3 comme indice pour trouver les intersections restantes
                        }
                    }
                    //Lorsque la solution optimale est x section et que le point est atteint
                    else if(answer_max == answer_x && y>600){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x-(x - (x_min+100));
                        y = y-(y - 600);
                        step = 4;          //Passez à l'étape 4
                    }
                    
                    //Ces trois branches donnent le déplacement de coordonnées correspondant à chaque droite(Pour avancer sur cette ligne droite)
                    else if(n_y_min == 1){
                        x = x+info[3];
                        y = y+info[2];
                    }
                    else if(n_y_min == 2){
                        x = x+info[6];
                        y = y+info[5];
                    }
                    else if(n_y_min == 3){
                        x = x+info[9];
                        y = y+info[8];
                    }
                }
                //Lorsque le coefficient de la section y de la fonction objectif est plus petit
                else if(info[0] > info[1]){
                    //Ligne droite 1,Lorsque l'intersection de 2 est atteinte(Limité à la plage de la zone exécutable)
                    if(y_intersection12>0 && y<600-y_intersection12){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x + ((x_intersection12+100)-x);
                        y = y + ((600-y_intersection12)-y);
                        //Si ce point donne la solution optimale
                        if(answer12 > answer13 && answer12 > answer23){
                            step=4;          //Passez à l'étape 4
                        }
                        //Si ce point ne donne pas la solution optimale
                        else{
                            step=3;         //Passez à l'étape 3
                            select3 = 1;    //N'oubliez pas la ligne droite 1 comme indice pour trouver les intersections restantes
                        }
                    }
                    //Ligne droite 1,En atteignant l'intersection de 3(Limité à la plage de la zone exécutable)
                    else if(y_intersection13>0 && y<600-y_intersection13){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x + ((x_intersection13+100)-x);
                        y = y + ((600-y_intersection13)-y);
                        //Si ce point donne la solution optimale
                        if(answer13 > answer12 && answer13 > answer23){
                            step=4;          //Passez à l'étape 4
                        }
                        //Si ce point ne donne pas la solution optimale
                        else{
                            step=3;         //Passez à l'étape 3
                            select3 = 2;    //N'oubliez pas la ligne droite 2 comme indice pour trouver les intersections restantes
                        }
                    }
                    //Ligne droite 2,En atteignant l'intersection de 3(Limité à la plage de la zone exécutable)
                    else if(y_intersection23>0 && y<600-y_intersection23){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x + ((x_intersection23+100)-x);
                        y = y + ((600-y_intersection23)-y);
                        //Si ce point donne la solution optimale
                        if(answer23 > answer12 && answer23 > answer13){
                            step=4;          //Passez à l'étape 4
                        }
                        //Si ce point ne donne pas la solution optimale
                        else{
                            step=3;         //Passez à l'étape 3
                            select3 = 3;    //N'oubliez pas la ligne droite 3 comme indice pour trouver les intersections restantes
                        }
                    }
                    //Lorsque la solution optimale est la section y et que le point est atteint
                    else if(answer_max == answer_y && x<100){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x + (100-x);
                        y = y + ((600-y_min)-y);
                        step = 4;          //Passez à l'étape 4
                    }
                    
                    //Ces trois branches donnent le déplacement de coordonnées correspondant à chaque droite(Pour avancer sur cette ligne droite)
                    else if(n_x_min == 1){
                        x = x-info[3];
                        y = y-info[2];
                    }
                    else if(n_x_min == 2){
                        x = x-info[6];
                        y = y-info[5];
                    }
                    else if(n_x_min == 3){
                        x = x-info[9];
                        y = y-info[8];
                    }
                }
            }
            //Étape 3(Se déplacer d'une intersection à l'autre)
            else if(step == 3){
                //Lorsque le coefficient de la section y de la fonction objectif est plus grand
                if(info[0] <= info[1]){
                    //Ligne droite 1 qui est l'intersection restante,Lorsque l'intersection de 3 est atteinte et que ce point est la solution d'exécution
                    if(select3 == 1 && x_intersection13>0 && x>x_intersection13+100){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x-(x - (x_intersection13+100));
                        y = y-(y - (600-y_intersection13));
                        step=4;          //Passez à l'étape 4
                    }
                    //Ligne droite 2 qui est l'intersection restante,Lorsque l'intersection de 3 est atteinte et que ce point est la solution d'exécution
                    else if(select3 == 1 && x_intersection23>0 && x>x_intersection23+100){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x-(x - (x_intersection23+100));
                        y = y-(y - (600-y_intersection23));
                        step=4;          //Passez à l'étape 4
                    }
                    //Ligne droite 1 qui est l'intersection restante,Lorsque l'intersection de 2 est atteinte et que ce point est la solution d'exécution
                    else if(select3 == 2 && x_intersection12>0 && x>x_intersection12+100){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x-(x - (x_intersection12+100));
                        y = y-(y - (600-y_intersection12));
                        step=4;          //Passez à l'étape 4
                    }
                    //Ligne droite 2 qui est l'intersection restante,Lorsque l'intersection de 3 est atteinte et que ce point est la solution d'exécution
                    else if(select3 == 2 && x_intersection23>0 && x>x_intersection23+100){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x-(x - (x_intersection23+100));
                        y = y-(y - (600-y_intersection23));
                        step=4;          //Passez à l'étape 4
                    }
                    //Ligne droite 1 qui est l'intersection restante,Lorsque l'intersection de 2 est atteinte et que ce point est la solution d'exécution
                    else if(select3 == 3 && x_intersection12>0 && x>x_intersection12+100){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x-(x - (x_intersection12+100));
                        y = y-(y - (600-y_intersection12));
                        step=4;          //Passez à l'étape 4
                    }
                    //Ligne droite 1 qui est l'intersection restante,Lorsque l'intersection de 3 est atteinte et que ce point est la solution d'exécution
                    else if(select3 == 3 && x_intersection13>0 && x>x_intersection13+100){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x-(x - (x_intersection13+100));
                        y = y-(y - (600-y_intersection13));
                        step=4;          //Passez à l'étape 4
                    }
                    
                    //Ces trois branches donnent le déplacement de coordonnées correspondant à chaque droite(Pour avancer sur cette ligne droite)
                    else if(n_y_min == 1){
                        if(n_x_min == 2){
                            x = x+info[9];
                            y = y+info[8];
                        }
                        else if(n_x_min == 3){
                            x = x+info[6];
                            y = y+info[5];
                        }
                    }
                    else if(n_y_min == 2){
                        if(n_x_min == 1){
                            x = x+info[9];
                            y = y+info[8];
                        }
                        else if(n_x_min == 3){
                            x = x+info[3];
                            y = y+info[2];
                        }
                    }
                    else if(n_y_min == 3){
                        if(n_x_min == 1){
                            x = x+info[6];
                            y = y+info[5];
                        }
                        else if(n_x_min == 2){
                            x = x+info[3];
                            y = y+info[2];
                        }
                    }
                }
                //Lorsque le coefficient de la section y de la fonction objectif est plus petit
                else if(info[0] > info[1]){
                    if(select3 == 1 && y_intersection13>0 && y<600-y_intersection13){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x + ((x_intersection13+100)-x);
                        y = y + ((600-y_intersection13)-y);
                        step=4;          //Passez à l'étape 4
                    }
                    else if(select3 == 1 && y_intersection23>0 && y<600-y_intersection23){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x + ((x_intersection23+100)-x);
                        y = y + ((600-y_intersection23)-y);
                        step=4;          //Passez à l'étape 4
                    }
                    else if(select3 == 2 && y_intersection12>0 && y<600-y_intersection12){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x + ((x_intersection12+100)-x);
                        y = y + ((600-y_intersection12)-y);
                        step=4;          //Passez à l'étape 4
                    }
                    else if(select3 == 2 && y_intersection23>0 && y<600-y_intersection23){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x + ((x_intersection23+100)-x);
                        y = y + ((600-y_intersection23)-y);
                        step=4;          //Passez à l'étape 4
                    }
                    else if(select3 == 3 && y_intersection12>0 && y<600-y_intersection12){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x + ((x_intersection12+100)-x);
                        y = y + ((600-y_intersection12)-y);
                        step=4;          //Passez à l'étape 4
                    }
                    else if(select3 == 3 && y_intersection13>0 && y<600-y_intersection13){
                        //Lorsqu'il atteint, corrigez-le pour que le point soit exactement la coordonnée centrale du cercle.
                        x = x + ((x_intersection13+100)-x);
                        y = y + ((600-y_intersection13)-y);
                        step=4;          //Passez à l'étape 4
                    }
                    
                    //Ces trois branches donnent le déplacement de coordonnées correspondant à chaque droite(Pour avancer sur cette ligne droite)
                    else if(n_x_min == 1){
                        if(n_y_min == 2){
                            x = x-info[9];
                            y = y-info[8];
                        }
                        else if(n_y_min == 3){
                            x = x-info[6];
                            y = y-info[5];
                        }
                    }
                    else if(n_x_min == 2){
                        if(n_y_min == 1){
                            x = x-info[9];
                            y = y-info[8];
                        }
                        else if(n_y_min == 3){
                            x = x-info[3];
                            y = y-info[2];
                        }
                    }
                    else if(n_x_min == 3){
                        if(n_x_min == 1){
                            x = x-info[6];
                            y = y-info[5];
                        }
                        else if(n_x_min == 2){
                            x = x-info[3];
                            y = y-info[2];
                        }
                    }
                }
            }
            //Étape 4(point(Cercle)Arrête de bouger et la solution optimale est trouvée. Afficher la solution optimale)
            else if(step == 4){
                //Réglez la couleur de la valeur de solution optimale à afficher sur le noir
                g.setColor(Color.black);
                
                //Définissez la taille de la police pour la rendre plus facile à voir
                Font fo = new Font("Serif",Font.PLAIN,20);
                g.setFont(fo);
                
                //Convertissez la solution optimale en unités graphiques en unité de problème
                double best_answer = ((double)answer_max/d_masu);
                //Convertir la valeur de la solution optimale en chaîne
                String ba = String.valueOf(best_answer);
                
                //Afficher la solution optimale
                g.drawString("La solution optimale est approximative",450,325);
                g.drawString(String.format("%.2f", best_answer), 475, 350);
            }
            
        }
        
        
        
        
    }
    
    //Contrôlez l'intervalle d'exécution du thread pour déplacer le cercle
    public void run() {
        while(true) {
            repaint();
            try {
                Thread.sleep(300);       //Arrêtez le fil pendant 100 ms
            }catch(Exception e) {
                System.out.println(e);
            }
        }
    }
    
    public void actionPerformed(ActionEvent ae){
        //Quand button1 est cliqué
        if(ae.getSource() == button1){
            //Stocker la valeur saisie à partir du champ de texte dans les informations du tableau
            info[0] = Integer.parseInt(o_x.getText());
            info[1] = Integer.parseInt(o_y.getText());
            info[2] = Integer.parseInt(s_x1.getText());
            info[3] = Integer.parseInt(s_y1.getText());
            info[4] = Integer.parseInt(s_n1.getText());
            info[5] = Integer.parseInt(s_x2.getText());
            info[6] = Integer.parseInt(s_y2.getText());
            info[7] = Integer.parseInt(s_n2.getText());
            info[8] = Integer.parseInt(s_x3.getText());
            info[9] = Integer.parseInt(s_y3.getText());
            info[10] = Integer.parseInt(s_n3.getText());	
            scale_judge = 1;     //scale_judge=Mettre à 1 et écrire 3 lignes droites de contraintes sur le graphique
        }
        //Lorsque button2 est cliqué
        else if(ae.getSource() == button2){
            //Définissez les coordonnées du cercle sur l'origine du graphique
            x = 100;
            y = 600;
            
            step = 1;          //Réglez l'étape de simulation sur 1
            simu_judge = 1;    //simu_Réglez le juge sur 1 et démarrez la simulation
        }
    }
}

6. Image

image.png

Recommended Posts

Simuler la méthode simplex avec GUI
À propos de la méthode
Sortez avec un suffixe sur la méthode
Sortez avec un suffixe sur la méthode 2
Sortie sur la méthode, partie 2
À propos de la méthode de longueur
À propos de la méthode cartographique
À propos de la méthode des ancêtres
À propos de la méthode to_s.
Je suis immédiatement tombé sur la méthode d'entrée standard avec AtCoder.
Notez la méthode StringUtils # containsAny
Quelle est la méthode pluck?
Changer de port avec SpringBoot
Sortie sur la méthode Partie 1
Comment vérifier les nombres entiers avec ruby
Comprendre la méthode d'assistance form_with
Différents tests de méthode avec MockRestServiceServer
Mock le constructeur avec PowerMock
Prise en compte de la méthode des temps
Branche conditionnelle avec méthode d'assistance
Avec l'erreur Cordova-> Looper.prepare ()
[ruby] Appel d'une méthode avec un argument
Quelle est la méthode d'initialisation?
Connexion à une base de données avec Java (partie 1) Peut-être la méthode de base