[JAVA] Simulieren Sie die Simplex-Methode mit der GUI

1. Programmübersicht

Dieses Programm ist ein Programm zum Finden der optimalen Lösung der Maximierungsfunktion in der linearen Programmiermethode. Bei der linearen Programmierung (im Fall der Maximierung) gibt es Maximierungsfunktionen und -beschränkungen. Die Maximierungsfunktion ist eine lineare Funktion und dient der Maximierung. Die Randbedingung ist eine lineare Ungleichung oder eine lineare Gleichung, die den Lösungsbereich der Maximierungsfunktion definiert. In diesem Programm werden jedoch sowohl die Maximierungsfunktion als auch die Einschränkungsbedingung auf 2 Variablen (X, Y) festgelegt (Einzelheiten zur Maximierungsfunktion und zur Einschränkungsbedingung in diesem Programm finden Sie in der Operationsmethode in Kapitel 3). Es gibt eine Simplex-Methode als Algorithmus zum Finden der optimalen Lösung. Die Simplex-Methode beginnt an einem bestimmten Punkt im lebensfähigen Bereich und wiederholt das Verschieben dieses Punkts in Richtung der größeren Maximierungsfunktion. Wenn sich der Punkt nicht mehr bewegt, wird die Maximierungsfunktion zur optimalen Lösung. In diesem Programm gibt der Benutzer die Maximierungsfunktion und die Einschränkungen ein und definiert sie. Basierend auf der Eingangsmaximierungsfunktion und den Randbedingungen wird dann die Bewegung von Punkten durch das Simplex-Verfahren simuliert und die optimale Lösung erhalten und angezeigt. Dieses Programm simuliert jedoch nur die Bewegung von Punkten in der Simplex-Methode mithilfe der GUI und findet mit der Simplex-Methode nicht die optimale Lösung. Für die optimale Lösung werden die Koordinaten jedes Scheitelpunkts im realisierbaren Bereich der Maximierungsfunktion zugewiesen, und die Lösung mit dem größten Wert wird als optimale Lösung angezeigt.

2. Programmstruktur

Die Struktur des Programms ist wie folgt.

  1. Simplex_simu-Klasse
  2. Hauptmethode 2.MyPanel7-Klasse
  3. Konstruktor
  4. paintComponent-Methode
  5. Methode ausführen
  6. actionPerformed-Methode

3. Inhalt der Klassenverarbeitung

Der Inhalt jedes Prozesses wird erklärt. Bitte lesen Sie es, während Sie es mit dem Code vergleichen (Kapitel 5).

3.1. Simplex_simu-Klasse

Bei der Hauptmethode dieser Klasse wird das von der Funktion der MyPanel7-Klasse angezeigte Bedienfeld in das Fenster eingefügt. Darüber hinaus werden die grundlegende Verarbeitung des Fensters wie die Größe des Fensters, die Einstellung der Verarbeitung beim Drücken der Schaltfläche zum Schließen und der sichtbare Zustand des Fensters beschrieben, damit der Benutzer es bedienen kann.

3.2.MyPanel7-Klasse

Im Konstruktor wird ein Textfeld zum Eingeben der Maximierungsfunktion und der Einschränkungsbedingungen deklariert und angeordnet. Um dem Benutzer das Verständnis zu erleichtern, wo und was er eingeben soll, werden außerdem Beschriftungen deklariert und platziert, um den Benutzer zur Eingabe aufzufordern. Anschließend wird der Eingabewert im Programm wiedergegeben, und zwei Schaltflächen, eine Schaltfläche zum Zeichnen einer geraden Linie im Diagramm (Schaltfläche 1) und eine Schaltfläche zum Starten der Simulation (Schaltfläche 2), werden ebenfalls deklariert und angeordnet. Auf diese Weise beschreibt der Konstruktor hauptsächlich den Eingabeteil auf dem Bildschirm. Die actionPerformed-Methode beschreibt den Vorgang beim Klicken auf die Schaltfläche. Wenn Sie auf die Schaltfläche 1 klicken, wird der Wert aus dem Textfeld übernommen und in den Array-Informationen gespeichert. Wenn Sie auf die Schaltfläche 2 klicken, wird die Simulation der Simplex-Methode gestartet. Bei der Ausführungsmethode wird der Thread für 100 ms gestoppt. Durch Anhalten für 100 ms kann der Benutzer die Bewegung der Punkte während der Simulation überprüfen. Anschließend werden bei der paintComponent-Methode die Simulation (Bewegung von Punkten) und die Berechnung der optimalen Lösung durchgeführt. Bitte lesen Sie den Kommentartext des Quellcodes, um herauszufinden, welche Art von Beschreibung ausgeführt wird. Hier wird ein grober Prozess beschrieben. Zeichnen Sie zunächst drei gerade Linien aus den drei Eingabeeinschränkungen in das Diagramm. Dann werden der x-Abschnitt, der y-Abschnitt und der Schnittpunkt aus den drei geraden Linien erhalten. Von diesen Punkten werden Punkte, die nicht im ausführbaren Bereich enthalten sind, auf Koordinaten (-1, -1) gesetzt und ausgeschlossen. Die hier nicht ausgeschlossenen Punkte sind die Spitzen des realisierbaren Bereichs und Kandidaten für die optimale Lösung. Auf diese Weise wird derjenige, der die maximale Lösung ergibt, von den Kandidaten nach der optimalen Lösung durchsucht. Diejenige, die die maximale Lösung ergibt, ist die optimale Lösung. Nachdem die optimale Lösung gefunden wurde, führen wir eine Simulation durch. Achten Sie zunächst auf den Koeffizienten der Maximierungsfunktion und erhöhen Sie die Variable mit dem größeren Koeffizienten. Das heißt, mit dem Ursprung als Ausgangspunkt wird der Punkt in den Abschnitt der Variablen mit dem größeren Koeffizienten verschoben. Wenn der Abschnitt zu diesem Zeitpunkt die optimale Lösung bietet, halten Sie dort an. Bewegen Sie sich nach dem Verschieben zum Abschnitt zum Schnittpunkt zweier gerader Linien in der Nähe des Abschnitts. Wenn diese Kreuzung die optimale Lösung ergibt, halten Sie dort an. Dann wird es weiter zur nächsten Kreuzung bewegt. Wenn diese Kreuzung die optimale Lösung ergibt, halten Sie dort an. Auf diese Weise wird eine bedingte Verzweigung durchgeführt und die Bewegung der Punkte wird abhängig davon bestimmt, an welchem Punkt im realisierbaren Bereich sich der optimale Lösungspunkt befindet. Wenn es dann an dem Punkt stoppt, an dem die optimale Lösung erhalten wird, wird die optimale Lösung oben rechts im Diagramm angezeigt und der Vorgang ist abgeschlossen.

4. Betriebsmethode

Wenn die Zielfunktion S₁X + S₂Y ist, kann der Benutzer S₁ und S₂, die die Koeffizienten von X und Y sind, aus dem Eingabefeld eingeben und bestimmen. Die in S₁ und S₂ eingegebenen Werte sind jedoch auf positive ganze Zahlen beschränkt. Zusätzlich sind die Randbedingungen zum Bestimmen des ausführbaren Bereichs der Einfachheit halber auf drei Gleichungen beschränkt. Wenn die drei Gleichungen αiX + βiY ≤ γi (1 ≤ i ≤ 3) sind, kann der Benutzer αi, βi und γi aus dem Eingabefeld eingeben und bestimmen (der Einfachheit halber haben alle drei Gleichungen Ungleichungszahlen). ≤). Diese Werte sind jedoch auch auf positive ganze Zahlen beschränkt. Klicken Sie nach Eingabe der Maximierungsfunktion und der Einschränkungsbedingungen auf die Schaltfläche "(1) Legen Sie den Eingabewert und die Ausgabe in der Grafik fest". Durch Klicken auf diese Schaltfläche wird der eingegebene Wert jeder Variablen im Programm zugewiesen. Dann wird die Einschränkungsbedingung in das Diagramm geschrieben. Klicken Sie anschließend auf die Schaltfläche "② Simulation starten". Durch Klicken auf diese Schaltfläche beginnt die Bewegung von Punkten mit der Simplex-Methode mit dem Ursprung als Startpunkt. Dann ergibt (X, Y), wo der Punkt stoppt, die optimale Lösung der Maximierungsfunktion. Die zu diesem Zeitpunkt optimale Lösung wird oben rechts in der Grafik angezeigt, und das Programm endet. So bedienen Sie dieses Programm. Sie können dies so oft tun, wie Sie möchten, indem Sie die Zahlen erneut eingeben und nacheinander auf die beiden Schaltflächen klicken.

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();     //Rahmengenerierung
        
        frame.setTitle("Simplex-Methodensimulation");       //Fenstertitel
        frame.setSize(675, 680);                                      //Fenstergröße
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   //Verarbeitung beim Drücken der Taste ×
        
        MyPanel panel = new MyPanel(); //Generieren Sie MyPanel
        frame.getContentPane().add(panel); //Fügen Sie "Mein Panel" in den Rahmen ein
        
        frame.setVisible(true);             //Machen Sie das Fenster sichtbar
    }
}

class MyPanel extends JPanel implements Runnable,ActionListener {
    int count = 0;
    int info[] = new int[11];
    
    int simu_judge = 0;       //Variablen zum Bestimmen, ob die Simulation gestartet werden soll
                              //simu_judge=1, um die Simulation zu starten
    
    int scale_judge = 0;      //Variable zum Bestimmen, ob die Skala auf die Achse des Diagramms geschrieben werden soll
                              //scale_judge=1, um die Simulation zu starten
    
    //Kreis(Zeigen Sie die Lösung zu diesem Zeitpunkt)Zentralkoordinaten von
    int x = 100;
    int y = 600;
    
    //Speichert die Anzahl der Schritte, um die optimale Lösung zu finden(step=Bei 4 wird die optimale Lösung gefunden und beendet)
    int step = 0;
    
    //X am Schnittpunkt von drei geraden Linien,Variable zum Speichern von y-Koordinaten
    int x_intersection12 = -1;   //X-Koordinate des Schnittpunkts der ersten eingegebenen Geraden und der zweiten eingegebenen Geraden
    int x_intersection13 = -1;   //X-Koordinate des Schnittpunkts der ersten eingegebenen Geraden und der dritten eingegebenen Geraden
    int x_intersection23 = -1;   //Die x-Koordinate des Schnittpunkts der zweiten und dritten Geraden
    int y_intersection12 = -1;   //Y-Koordinate des Schnittpunkts der ersten eingegebenen Geraden und der zweiten eingegebenen Geraden
    int y_intersection13 = -1;   //Y-Koordinate des Schnittpunkts der ersten eingegebenen Geraden und der dritten eingegebenen Geraden
    int y_intersection23 = -1;   //Y-Koordinate des Schnittpunkts der zweiten eingegebenen Geraden und der dritten eingegebenen Geraden
    
    //Textfeld(Maximierungsfunktion)
    JTextField o_x = new JTextField(10);
    JTextField o_y = new JTextField(10);
    JTextField o_n = new JTextField(10);
    
    //Textfeld(Randbedingung 1, gerade einzugebende Gerade)
    JTextField s_x1 = new JTextField(10);
    JTextField s_y1 = new JTextField(10);
    JTextField s_n1= new JTextField(10);
    
    //Textfeld(Einschränkung 2 und 2. gerade Linie zur Eingabe)
    JTextField s_x2 = new JTextField(10);
    JTextField s_y2 = new JTextField(10);
    JTextField s_n2 = new JTextField(10);
    
    //Textfeld(Randbedingung 3. und 3. Eingangsgerade)
    JTextField s_x3 = new JTextField(10);
    JTextField s_y3 = new JTextField(10);
    JTextField s_n3 = new JTextField(10);
    
    //Etikette(Anleitung zur Eingabeaufforderung auf dem Bildschirm)
    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("Zielfunktion(Maximierungsfunktion)");
    JLabel label12 = new JLabel("Einschränkungen");
    
    //Knopf 1(Reflektieren Sie den im Programm eingegebenen Wert und zeichnen Sie eine gerade Linie in der Grafik)
    JButton button1 = new JButton("(1) Stellen Sie den Eingabewert und die Ausgabe in das Diagramm ein");
    //Taste 2(Beginnen Sie mit der Simulation der Simplex-Methode)
    JButton button2 = new JButton("② Simulation starten");
    
    public MyPanel() {
        //Registrieren Sie den Ereignis-Listener
        button1.addActionListener(this);
        button2.addActionListener(this);
        
        //Panel-Layout-Einstellungen
        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));
        
        //Vereinheitlichen Sie die Farbe jedes Panels mit Weiß
        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);
        
        //Fügen Sie jede Komponente zu jedem Panel hinzu
        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);
        
        
        //Jedes Panel, ein Panel f_Einfügen auf panel1
        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_Installieren Sie panel1 in Weiß
        add(f_panel1);                          //f_Fügen Sie myPanel panel1 hinzu
        
        setBackground(Color.WHITE);
        Thread refresh = new Thread(this);
        refresh.start();
        
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);             //Füllen Sie die Komponente mit der Hintergrundfarbe
        int seppen[] = new int[6];
        int seppen_max = 0;        //Sektion(x,y beide)Maximalwert von
        int xy_max = 0;               //X in der Grafik,Maximalwert von y
        int x_min = 0;                 //x Mindestwert des Abschnitts
        int y_min = 0;                 //Mindestwert des y-Abschnitts
        int n_x_min = 0;              //x Nummer des Ausdrucks mit dem Mindestwert des Abschnitts
        int n_y_min = 0;              //Die Nummer des Ausdrucks mit dem Mindestwert des y-Abschnitts
        double d_masu = 0;         //Grafikeinheit pro Pixel
        int select3 = 0;           //Speichern Sie in Schritt 3 die Nummern der Geraden, die an den verbleibenden Kreuzungen beteiligt sind, die sich noch nicht bewegt haben
        
        //Suchen Sie die temporären x- und y-Schnittwerte und weisen Sie sie jeder Variablen zu(Weisen Sie einer Variablen bis zu 1 Stelle zu, indem Sie mehr als 10 Mal in den Typ int umwandeln)
        int temporary_x1 = (int)(((double)info[4]/(double)info[2])*10);   //X-Abschnitt der ersten eingegebenen Geraden
        int temporary_y1 = (int)(((double)info[4]/(double)info[3])*10);   //Y-Abschnitt der ersten eingegebenen Geraden
        int temporary_x2 = (int)(((double)info[7]/(double)info[5])*10);   //X-Abschnitt der zweiten eingegebenen geraden Linie
        int temporary_y2 = (int)(((double)info[7]/(double)info[6])*10);   //Y-Abschnitt der zweiten eingegebenen geraden Linie
        int temporary_x3 = (int)(((double)info[10]/(double)info[8])*10);  //X-Abschnitt der dritten eingegebenen geraden Linie
        int temporary_y3 = (int)(((double)info[10]/(double)info[9])*10);  //Y-Abschnitt der dritten Eingangsgeraden
        
        //Der oben erhaltene Abschnitt wird seppenweise sequenziert[]Speichern in
        seppen[0] = temporary_x1;
        seppen[1] = temporary_y1;
        seppen[2] = temporary_x2;
        seppen[3] = temporary_y2;
        seppen[4] = temporary_x3;
        seppen[5] = temporary_y3;
        
        //Finden Sie den Maximalwert des Abschnitts.
        seppen_max = seppen[0];
        for(int i=1; i<6; i++){
            if(seppen[i] > seppen_max){
                seppen_max = seppen[i];
            }
        }
        
        //Ermitteln Sie den Maximalwert der Skala des Diagramms aus dem Maximalwert des Abschnitts.
        while(true){
            //Wenn der Maximalwert der Skala des Diagramms den Maximalwert des Abschnitts überschreitet
            if(xy_max >= seppen_max){
                break;                //Brechen Sie an diesem Punkt aus der Schleife und xy aus_Stellen Sie max auf den Maximalwert der Skala ein
            }
            xy_max = xy_max + 150;    //xy_Erhöhen Sie max um 150
                                      //(Da der Abschnitt oben mit 10 multipliziert wird, erhöht sich der Maximalwert der Skala tatsächlich um 15)
        }
        
        //Finden Sie die Grafikeinheit pro Pixel
        d_masu = ((double)300)/((double)xy_max)*10;     //300 ist die Anzahl der Pixel in vertikaler Richtung des Graphen
                                                        //Teilen Sie 300 durch den Maximalwert der Skala und multiplizieren Sie mit 10, um den Wert in Diagrammeinheiten zu erhalten.
        
        //Finden Sie die Koordinaten jedes Abschnitts in der Grafik
        int decisive_x1 = (int)(((double)info[4]/(double)info[2])*d_masu);   //X-Abschnitt der ersten eingegebenen Geraden
        int decisive_y1 = (int)(((double)info[4]/(double)info[3])*d_masu);   //Y-Abschnitt der ersten eingegebenen Geraden
        int decisive_x2 = (int)(((double)info[7]/(double)info[5])*d_masu);   //X-Abschnitt der zweiten eingegebenen geraden Linie
        int decisive_y2 = (int)(((double)info[7]/(double)info[6])*d_masu);   //Y-Abschnitt der zweiten eingegebenen geraden Linie
        int decisive_x3 = (int)(((double)info[10]/(double)info[8])*d_masu);  //X-Abschnitt der dritten eingegebenen geraden Linie
        int decisive_y3 = (int)(((double)info[10]/(double)info[9])*d_masu);  //Y-Abschnitt der dritten Eingangsgeraden
        
        //Vorsichtsmaßnahmen beim Betreten
        g.drawString("* Geben Sie in alle Eingabefelder eine positive Ganzzahl ein.",120,640);
        
        
        g.drawLine(100,275,100,600);    //y-Achse
        g.drawLine(100,600,425,600);    //x-Achse
        
        g.drawLine(95,300,105,300);     //y-Achsenskala(Zuerst von oben)
        g.drawLine(95,400,105,400);     //y-Achsenskala(Zweiter von oben)
        g.drawLine(95,500,105,500);     //y-Achsenskala(Dritter von oben)
        
        g.drawLine(200,595,200,605);    //x-Achsenskala(Zuerst von links)
        g.drawLine(300,595,300,605);    //x-Achsenskala(Zweiter von links)
        g.drawLine(400,595,400,605);    //x-Achsenskala(Dritter von links)
        
        //Pfeil der y-Achse
        g.drawLine(100,275,95,280);
        g.drawLine(100,275,105,280);
        //x-Achsenpfeil
        g.drawLine(425,600,420,595);
        g.drawLine(425,600,420,605);
        
        //Zeichnen Sie ein Diagramm der drei eingegebenen Geraden
        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);
        
        //Berechnen Sie den Wert jeder Skala
        int n_xy1 = xy_max/30;
        int n_xy2 = (xy_max/30)*2;
        int n_xy3 = xy_max/10;
        
        //Konvertieren Sie den numerischen Wert jeder Skala in eine Zeichenfolge(Zählen der Anzahl der Stellen in jeder Skala)
        String s_xy1 = String.valueOf(n_xy1);
        String s_xy2 = String.valueOf(n_xy2);
        String s_xy3 = String.valueOf(n_xy3);
        
        //Holen Sie sich die Anzahl der Ziffern jeder Skala und ersetzen Sie(Um zu verhindern, dass sich die Position des numerischen Werts auf der Skala abhängig von der Anzahl der Stellen ändert)
        int xy1_length = String.valueOf(n_xy1).length();
        int xy2_length = String.valueOf(n_xy2).length();
        int xy3_length = String.valueOf(n_xy3).length();
        
        //Wenn bottoman1 eingegeben wird(Schreiben Sie den Wert jeder Skala in das Diagramm)
        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);
        }
        
        //Finden Sie die Mindestwerte für x- und y-Abschnitte. Auch die Nummer der Geraden mit dem Minimalwert(Welche Nummer wurde eingegeben)Ich suche
        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;
        }
        
        //Jede gerade Linie(Gerade aufgrund von Einschränkungen)Oberer Grenzwert von(Konstante Laufzeit)Auf einen Wert in Diagrammeinheiten und ersetzen
        int upper1 = (int)(((double)info[4])*d_masu);
        int upper2 = (int)(((double)info[7])*d_masu);
        int upper3 = (int)(((double)info[10])*d_masu);
        
        
        //Finden Sie die x-Koordinate des Schnittpunkts jeder Geraden
        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);
        
        //Finden Sie die y-Koordinate des Schnittpunkts jeder Geraden
        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);
        
        //Wenn es keinen Schnittpunkt gibt, die Koordinaten(-1,-1)Einstellen.(-1,-1)Ist außerhalb des ausführbaren Bereichs
        //Wenn die Geraden 1 und 2 parallel sind
        if(x_intersection12>2000000000 || y_intersection12>2000000000){
            x_intersection12 = -1;
            y_intersection12 = -1;
        }
        //Wenn die Geraden 1 und 3 parallel sind
        if(x_intersection13>2000000000 || y_intersection13>2000000000){
            x_intersection13 = -1;
            y_intersection13 = -1;
        }
        //Wenn die geraden Linien von 2 und 3 parallel sind
        if(x_intersection23>2000000000 || y_intersection23>2000000000){
            x_intersection23 = -1;
            y_intersection23 = -1;
        }
        
        //Wenn der Schnittpunkt von 1 und 2 außerhalb des Bereichs des lebensfähigen Bereichs liegt
        if(info[8]*x_intersection12+info[9]*y_intersection12 > upper3){
            x_intersection12 = -1;
            y_intersection12 = -1;
        }
        //Wenn der Schnittpunkt von 1 und 3 außerhalb des Bereichs des lebensfähigen Bereichs liegt
        if(info[5]*x_intersection13+info[6]*y_intersection13 > upper2){
            x_intersection13 = -1;
            y_intersection13 = -1;
        }
        //Wenn der Schnittpunkt von 2 und 3 außerhalb des Bereichs des lebensfähigen Bereichs liegt
        if(info[2]*x_intersection23+info[3]*y_intersection23 > upper1){
            x_intersection23 = -1;
            y_intersection23 = -1;
        }
        
        
        int answer_x = info[0]*x_min;    //x Abschnitt(Mindestwert)Lösung in
        int answer_y = info[1]*y_min;    //x Abschnitt(Mindestwert)Lösung in
        
        //Lösung am Schnittpunkt jeder Geraden(Der Anfangswert ist-1)
        int answer12 = -1;
        int answer13 = -1;
        int answer23 = -1;
        
        //Wenn die Lösung am Schnittpunkt jeder Geraden innerhalb des realisierbaren Bereichs liegt, weisen Sie diese Lösung jeder Variablen zu
        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;
        }
        
        //Die maximale Lösung aus den oben erhaltenen Lösungen(Optimale Lösung)Suchen und antworten_Ersatz für 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;
        }
        
        //Wenn Sie auf die Schaltfläche zum Starten der Simulation klicken
        if(simu_judge == 1){
            
            g.setColor(Color.red);          //Stellen Sie die Farbe des Kreises so ein, dass er auf Rot zeichnet
            
            g.fillOval(x-4, y-4, 8, 8);     //Zeichne einen Kreis((x-4,y-4)Ist der Mittelpunkt des Kreises)
            //Schritt 1(Verschieben eines Abschnitts vom Ursprung)
            if(step == 1){
                //Wenn der Koeffizient des y-Abschnitts der Zielfunktion größer ist
                if(info[0] <= info[1]){
                    y = y-1;              //Bewegen Sie sich vom Ursprung entlang der y-Achse
                    //Wenn der Punkt den Mindestwert des y-Abschnitts erreicht
                    if(y == 600-y_min){
                        //Wenn dieser Punkt die optimale Lösung ergibt
                        if(answer_max == answer_y){
                            step = 4;          //Fahren Sie mit Schritt 4 fort
                        }
                        //Wenn dieser Punkt nicht die optimale Lösung ergibt
                        else{
                            step = 2;          //Fahren Sie mit Schritt 2 fort
                        }
                    }
                }
                //Wenn der Koeffizient des y-Abschnitts der Zielfunktion kleiner ist
                else if(info[0] > info[1]){
                    x = x+1;              //Bewegen Sie sich vom Ursprung entlang der x-Achse
                    //Wenn der Punkt den Mindestwert des x-Abschnitts erreicht
                    if(x == x_min+100){
                        //Wenn dieser Punkt die optimale Lösung ergibt
                        if(answer_max == answer_x){
                            step = 4;         //Fahren Sie mit Schritt 4 fort
                        }
                        //Wenn dieser Punkt nicht die optimale Lösung ergibt
                        else{
                            step = 2;         //Fahren Sie mit Schritt 2 fort
                        }
                    }
                }
            }
            //Schritt 2(Übergang vom Abschnitt zur Kreuzung)
            else if(step == 2){
                //Wenn der Koeffizient des y-Abschnitts der Zielfunktion größer ist
                if(info[0] <= info[1]){
                    //Gerade 1,Wenn der Schnittpunkt von 2 erreicht ist(Beschränkt auf den Bereich des ausführbaren Bereichs)
                    if(x_intersection12>0 && x>x_intersection12+100){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x-(x - (x_intersection12+100));
                        y = y-(y - (600-y_intersection12));
                        //Wenn dieser Punkt die optimale Lösung ergibt
                        if(answer12 > answer13 && answer12 > answer23){
                            step = 4;          //Fahren Sie mit Schritt 4 fort
                        }
                        //Wenn dieser Punkt nicht die optimale Lösung ergibt
                        else{
                            step = 3;       //Fahren Sie mit Schritt 3 fort
                            select3 = 1;    //Denken Sie an die gerade Linie 1 als Hinweis, um die verbleibenden Schnittpunkte zu finden
                        }
                    }
                    //Gerade 1,Bei Erreichen der Kreuzung von 3(Beschränkt auf den Bereich des ausführbaren Bereichs)
                    else if(x_intersection13>0 && x>x_intersection13+100){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x-(x - (x_intersection13+100));
                        y = y-(y - (600-y_intersection13));
                        //Wenn dieser Punkt die optimale Lösung ergibt
                        if(answer13 > answer12 && answer13 > answer23){
                            step=4;          //Fahren Sie mit Schritt 4 fort
                        }
                        //Wenn dieser Punkt nicht die optimale Lösung ergibt
                        else{
                            step = 3;       //Fahren Sie mit Schritt 3 fort
                            select3 = 2;    //Denken Sie an die gerade Linie 2 als Hinweis, um die verbleibenden Schnittpunkte zu finden
                        }
                    }
                    //Gerade 2,Bei Erreichen der Kreuzung von 3(Beschränkt auf den Bereich des ausführbaren Bereichs)
                    else if(x_intersection23>0 && x>x_intersection23+100){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x-(x - (x_intersection23+100));
                        y = y-(y - (600-y_intersection23));
                        //Wenn dieser Punkt die optimale Lösung ergibt
                        if(answer23 > answer12 && answer23 > answer13){
                            step=4;          //Fahren Sie mit Schritt 4 fort
                        }
                        //Wenn dieser Punkt nicht die optimale Lösung ergibt
                        else{
                            step = 3;       //Fahren Sie mit Schritt 3 fort
                            select3 = 3;    //Denken Sie an die gerade Linie 3 als Hinweis, um die verbleibenden Schnittpunkte zu finden
                        }
                    }
                    //Wenn die optimale Lösung x Abschnitt ist und der Punkt erreicht ist
                    else if(answer_max == answer_x && y>600){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x-(x - (x_min+100));
                        y = y-(y - 600);
                        step = 4;          //Fahren Sie mit Schritt 4 fort
                    }
                    
                    //Diese drei Zweige geben die Koordinatenverschiebung an, die jeder geraden Linie entspricht(Sich auf dieser geraden Linie bewegen)
                    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];
                    }
                }
                //Wenn der Koeffizient des y-Abschnitts der Zielfunktion kleiner ist
                else if(info[0] > info[1]){
                    //Gerade 1,Wenn der Schnittpunkt von 2 erreicht ist(Beschränkt auf den Bereich des ausführbaren Bereichs)
                    if(y_intersection12>0 && y<600-y_intersection12){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x + ((x_intersection12+100)-x);
                        y = y + ((600-y_intersection12)-y);
                        //Wenn dieser Punkt die optimale Lösung ergibt
                        if(answer12 > answer13 && answer12 > answer23){
                            step=4;          //Fahren Sie mit Schritt 4 fort
                        }
                        //Wenn dieser Punkt nicht die optimale Lösung ergibt
                        else{
                            step=3;         //Fahren Sie mit Schritt 3 fort
                            select3 = 1;    //Denken Sie an die gerade Linie 1 als Hinweis, um die verbleibenden Schnittpunkte zu finden
                        }
                    }
                    //Gerade 1,Bei Erreichen der Kreuzung von 3(Beschränkt auf den Bereich des ausführbaren Bereichs)
                    else if(y_intersection13>0 && y<600-y_intersection13){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x + ((x_intersection13+100)-x);
                        y = y + ((600-y_intersection13)-y);
                        //Wenn dieser Punkt die optimale Lösung ergibt
                        if(answer13 > answer12 && answer13 > answer23){
                            step=4;          //Fahren Sie mit Schritt 4 fort
                        }
                        //Wenn dieser Punkt nicht die optimale Lösung ergibt
                        else{
                            step=3;         //Fahren Sie mit Schritt 3 fort
                            select3 = 2;    //Denken Sie an die gerade Linie 2 als Hinweis, um die verbleibenden Schnittpunkte zu finden
                        }
                    }
                    //Gerade 2,Bei Erreichen der Kreuzung von 3(Beschränkt auf den Bereich des ausführbaren Bereichs)
                    else if(y_intersection23>0 && y<600-y_intersection23){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x + ((x_intersection23+100)-x);
                        y = y + ((600-y_intersection23)-y);
                        //Wenn dieser Punkt die optimale Lösung ergibt
                        if(answer23 > answer12 && answer23 > answer13){
                            step=4;          //Fahren Sie mit Schritt 4 fort
                        }
                        //Wenn dieser Punkt nicht die optimale Lösung ergibt
                        else{
                            step=3;         //Fahren Sie mit Schritt 3 fort
                            select3 = 3;    //Denken Sie an die gerade Linie 3 als Hinweis, um die verbleibenden Schnittpunkte zu finden
                        }
                    }
                    //Wenn die optimale Lösung der y-Abschnitt ist und der Punkt erreicht ist
                    else if(answer_max == answer_y && x<100){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x + (100-x);
                        y = y + ((600-y_min)-y);
                        step = 4;          //Fahren Sie mit Schritt 4 fort
                    }
                    
                    //Diese drei Zweige geben die Koordinatenverschiebung an, die jeder geraden Linie entspricht(Sich auf dieser geraden Linie bewegen)
                    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];
                    }
                }
            }
            //Schritt 3(Übergang von Kreuzung zu Kreuzung)
            else if(step == 3){
                //Wenn der Koeffizient des y-Abschnitts der Zielfunktion größer ist
                if(info[0] <= info[1]){
                    //Gerade Linie 1, die die verbleibende Kreuzung ist,Wenn der Schnittpunkt von 3 erreicht ist und dieser Punkt die Ausführungslösung ist
                    if(select3 == 1 && x_intersection13>0 && x>x_intersection13+100){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x-(x - (x_intersection13+100));
                        y = y-(y - (600-y_intersection13));
                        step=4;          //Fahren Sie mit Schritt 4 fort
                    }
                    //Gerade Linie 2, die die verbleibende Kreuzung ist,Wenn der Schnittpunkt von 3 erreicht ist und dieser Punkt die Ausführungslösung ist
                    else if(select3 == 1 && x_intersection23>0 && x>x_intersection23+100){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x-(x - (x_intersection23+100));
                        y = y-(y - (600-y_intersection23));
                        step=4;          //Fahren Sie mit Schritt 4 fort
                    }
                    //Gerade Linie 1, die die verbleibende Kreuzung ist,Wenn der Schnittpunkt von 2 erreicht ist und dieser Punkt die Ausführungslösung ist
                    else if(select3 == 2 && x_intersection12>0 && x>x_intersection12+100){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x-(x - (x_intersection12+100));
                        y = y-(y - (600-y_intersection12));
                        step=4;          //Fahren Sie mit Schritt 4 fort
                    }
                    //Gerade Linie 2, die die verbleibende Kreuzung ist,Wenn der Schnittpunkt von 3 erreicht ist und dieser Punkt die Ausführungslösung ist
                    else if(select3 == 2 && x_intersection23>0 && x>x_intersection23+100){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x-(x - (x_intersection23+100));
                        y = y-(y - (600-y_intersection23));
                        step=4;          //Fahren Sie mit Schritt 4 fort
                    }
                    //Gerade Linie 1, die die verbleibende Kreuzung ist,Wenn der Schnittpunkt von 2 erreicht ist und dieser Punkt die Ausführungslösung ist
                    else if(select3 == 3 && x_intersection12>0 && x>x_intersection12+100){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x-(x - (x_intersection12+100));
                        y = y-(y - (600-y_intersection12));
                        step=4;          //Fahren Sie mit Schritt 4 fort
                    }
                    //Gerade Linie 1, die die verbleibende Kreuzung ist,Wenn der Schnittpunkt von 3 erreicht ist und dieser Punkt die Ausführungslösung ist
                    else if(select3 == 3 && x_intersection13>0 && x>x_intersection13+100){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x-(x - (x_intersection13+100));
                        y = y-(y - (600-y_intersection13));
                        step=4;          //Fahren Sie mit Schritt 4 fort
                    }
                    
                    //Diese drei Zweige geben die Koordinatenverschiebung an, die jeder geraden Linie entspricht(Sich auf dieser geraden Linie bewegen)
                    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];
                        }
                    }
                }
                //Wenn der Koeffizient des y-Abschnitts der Zielfunktion kleiner ist
                else if(info[0] > info[1]){
                    if(select3 == 1 && y_intersection13>0 && y<600-y_intersection13){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x + ((x_intersection13+100)-x);
                        y = y + ((600-y_intersection13)-y);
                        step=4;          //Fahren Sie mit Schritt 4 fort
                    }
                    else if(select3 == 1 && y_intersection23>0 && y<600-y_intersection23){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x + ((x_intersection23+100)-x);
                        y = y + ((600-y_intersection23)-y);
                        step=4;          //Fahren Sie mit Schritt 4 fort
                    }
                    else if(select3 == 2 && y_intersection12>0 && y<600-y_intersection12){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x + ((x_intersection12+100)-x);
                        y = y + ((600-y_intersection12)-y);
                        step=4;          //Fahren Sie mit Schritt 4 fort
                    }
                    else if(select3 == 2 && y_intersection23>0 && y<600-y_intersection23){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x + ((x_intersection23+100)-x);
                        y = y + ((600-y_intersection23)-y);
                        step=4;          //Fahren Sie mit Schritt 4 fort
                    }
                    else if(select3 == 3 && y_intersection12>0 && y<600-y_intersection12){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x + ((x_intersection12+100)-x);
                        y = y + ((600-y_intersection12)-y);
                        step=4;          //Fahren Sie mit Schritt 4 fort
                    }
                    else if(select3 == 3 && y_intersection13>0 && y<600-y_intersection13){
                        //Wenn es erreicht ist, korrigieren Sie es so, dass der Punkt genau die Mittelkoordinate des Kreises ist.
                        x = x + ((x_intersection13+100)-x);
                        y = y + ((600-y_intersection13)-y);
                        step=4;          //Fahren Sie mit Schritt 4 fort
                    }
                    
                    //Diese drei Zweige geben die Koordinatenverschiebung an, die jeder geraden Linie entspricht(Sich auf dieser geraden Linie bewegen)
                    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];
                        }
                    }
                }
            }
            //Schritt 4(Punkt(Kreis)Stoppt die Bewegung und die optimale Lösung wird gefunden. Zeigen Sie die optimale Lösung an)
            else if(step == 4){
                //Stellen Sie die Farbe des optimalen Lösungswerts, der angezeigt werden soll, auf Schwarz ein
                g.setColor(Color.black);
                
                //Stellen Sie die Schriftgröße ein, um die Anzeige zu erleichtern
                Font fo = new Font("Serif",Font.PLAIN,20);
                g.setFont(fo);
                
                //Konvertieren Sie die optimale Lösung in Diagrammeinheiten in die Problemeinheit
                double best_answer = ((double)answer_max/d_masu);
                //Konvertieren Sie den Wert der optimalen Lösung in eine Zeichenfolge
                String ba = String.valueOf(best_answer);
                
                //Zeigen Sie die optimale Lösung an
                g.drawString("Die optimale Lösung ist ungefähr",450,325);
                g.drawString(String.format("%.2f", best_answer), 475, 350);
            }
            
        }
        
        
        
        
    }
    
    //Steuern Sie das Thread-Ausführungsintervall, um den Kreis zu verschieben
    public void run() {
        while(true) {
            repaint();
            try {
                Thread.sleep(300);       //Stoppen Sie den Thread für 100 ms
            }catch(Exception e) {
                System.out.println(e);
            }
        }
    }
    
    public void actionPerformed(ActionEvent ae){
        //Wenn auf button1 geklickt wird
        if(ae.getSource() == button1){
            //Speichern Sie den aus dem Textfeld eingegebenen Wert in den Array-Informationen
            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=Setzen Sie den Wert auf 1 und schreiben Sie 3 gerade Linien mit Einschränkungen in das Diagramm
        }
        //Wenn auf button2 geklickt wird
        else if(ae.getSource() == button2){
            //Stellen Sie die Koordinaten des Kreises auf den Ursprung des Diagramms ein
            x = 100;
            y = 600;
            
            step = 1;          //Setzen Sie den Simulationsschritt auf 1
            simu_judge = 1;    //simu_Setzen Sie den Richter auf 1 und starten Sie die Simulation
        }
    }
}

6. Bild

image.png

Recommended Posts

Simulieren Sie die Simplex-Methode mit der GUI
Über die Methode
Geben Sie ein Suffix für die Methode an
Geben Sie ein Suffix für Methode 2 heraus
Ausgabe über die Methode, Teil 2
Über die Längenmethode
Über die Kartenmethode
Über die Ahnenmethode
Informationen zur to_s-Methode.
Ich bin sofort auf die Standardeingabemethode mit AtCoder gestoßen.
Beachten Sie die StringUtils # includesAny-Methode
Was ist die Zupfmethode?
Ändern Sie den Port mit SpringBoot
Ausgabe über die Methode Teil 1
Wie man ganze Zahlen mit Rubin überprüft
Verstehen Sie die Hilfsmethode form_with
Verschiedene Methodentests mit MockRestServiceServer
Verspotten Sie den Konstruktor mit PowerMock
Überlegungen zur Zeitmethode
Bedingte Verzweigung mit Hilfsmethode
Mit dem Fehler Cordova-> Looper.prepare ()
[ruby] Eine Methode mit einem Argument aufrufen
Was ist die Initialisierungsmethode?
Herstellen einer Verbindung zu einer Datenbank mit Java (Teil 1) Möglicherweise die grundlegende Methode