This program is a program for finding the optimum solution of the maximization function in linear programming. In linear programming (in the case of maximization), there are maximization functions and constraints. The maximization function is a linear function and is a function for the purpose of maximization. Constraints are linear inequalities and linear equations, which define the range of solutions for the maximization function. However, in this program, both the maximization function and the constraint condition are set to 2 variables (X, Y) respectively (for details of the maximization function and the constraint condition in this program, refer to the operation method in Chapter 3). There is a simplex method as an algorithm for finding the optimum solution. The simplex method repeats moving a point in the feasible region as a starting point to the direction in which the maximization function becomes larger. When the point stops moving, the maximization function becomes the optimal solution. In this program, the user inputs and defines the maximization function and constraints. Then, based on the input maximization function and constraints, the movement of points by the simplex method is simulated, and the optimum solution is obtained and displayed. However, this program only simulates the movement of points in the simplex method with a GUI, and does not actually find the optimum solution using the simplex method. For the optimal solution, the coordinates of each vertex in the feasible region are assigned to the maximization function, and the solution with the largest value is displayed as the optimal solution.
The structure of the program is as follows.
The contents of each process will be explained. Please read it while comparing it with the code (Chapter 5).
In the main method of this class, the panel displayed by the function of MyPanel7 class is pasted into the window. It also describes the basic window processing, such as window size, processing settings when the close button is pressed, and making the window visible so that the user can operate it.
In the constructor, the text field for inputting the maximization function and the constraint condition is declared and arranged. In addition, in order to make it easier for the user to understand where and what to enter, labels are also declared and placed to encourage input. Then, the input value is reflected in the program, and two buttons, a button for drawing a straight line on the graph (button1) and a button for starting the simulation (button2), are also declared and arranged. In this way, the constructor mainly describes the input part in the screen. The actionPerformed method describes the process when the button is clicked. When button1 is clicked, the value is taken from the text field and stored in the array info. When button2 is clicked, the simplex method simulation is started. In the run method, the thread is stopped for 100ms. By stopping for 100ms, the user can check the movement of the points during the simulation. Then, in the paintComponent method, simulation (movement of points) and calculation of the optimum solution are performed. Please read the comment text of the source code to find out what kind of description is being performed. Here, a rough process will be described. First, draw three straight lines on the graph from the three input constraints. Then, the x-intercept, y-intercept, and intersection are obtained from the three straight lines. From those points, points that are not included in the feasible region are set to coordinates (-1, -1) and excluded. The points not excluded here are the vertices of the feasible region and are candidates for the optimum solution. In this way, the one that gives the maximum solution is searched from the candidates for the optimum solution obtained. The one that gives the maximum solution is the optimum solution. Now that the optimal solution has been found, we will perform a simulation. First, pay attention to the coefficient of the maximization function, and increase the variable with the larger coefficient. That is, starting from the origin, the point is moved to the intercept of the variable with the larger coefficient. At this time, if the intercept gives the optimum solution, stop there. Then, after moving to the intercept, move to the intersection of two straight lines close to the intercept. If this intersection gives the optimal solution, stop there. Then, it is further moved to the next intersection. If this intersection gives the optimal solution, stop there. In this way, conditional branching is performed and the movement of the points is determined depending on which point in the feasible region the optimum solution point is located. Then, when it stops at the point where the optimum solution is obtained, the optimum solution is displayed in the upper right corner of the graph, and the process is completed.
When the objective function is S₁X + S₂Y, the user can input and determine S₁ and S₂, which are the coefficients of X and Y, from the input field. However, the values entered in S₁ and S₂ are limited to positive integers. In addition, the constraints for determining the feasible region are limited to three equations for convenience. When the three equations are αiX + βiY ≤ γi (1 ≤ i ≤ 3), the user can input and determine αi, βi, and γi from the input field (for convenience, all three equations have inequality signs). ≤). However, these values are also limited to positive integers. After inputting the maximization function and constraints, click the button "(1) Set the input value and output to the graph". By clicking this button, the entered value will be assigned to each variable in the program. Then, the constraints are written out on the graph. Next, click the button "② Simulation start". By clicking this button, the movement of points by the simplex method starts with the origin as the starting point. Then, (X, Y) where the point stops gives the optimum solution of the maximization function. The optimum solution at this time is displayed in the upper right of the graph, and the program ends. This is how to operate this program. You can do it as many times as you like by entering the numbers again and clicking the two buttons in sequence.
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(); //Frame generation
frame.setTitle("Simplex method simulation"); //Window title
frame.setSize(675, 680); //Window size
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Processing when the × button is pressed
MyPanel panel = new MyPanel(); //Generate MyPanel
frame.getContentPane().add(panel); //Paste My Panel on the frame
frame.setVisible(true); //Make the window visible
}
}
class MyPanel extends JPanel implements Runnable,ActionListener {
int count = 0;
int info[] = new int[11];
int simu_judge = 0; //Variables for deciding whether to start the simulation
//simu_judge=1 to start the simulation
int scale_judge = 0; //Variable to determine whether to write the scale to the axis of the graph
//scale_judge=1 to start the simulation
//Circle(Show the solution at that time)Center coordinates of
int x = 100;
int y = 600;
//Stores the number of steps to find the optimal solution(step=At 4, the optimum solution is found and finished)
int step = 0;
//X at the intersection of three straight lines,Variable to store the y coordinate
int x_intersection12 = -1; //The x coordinate of the intersection of the first straight line and the second straight line
int x_intersection13 = -1; //The x coordinate of the intersection of the first straight line and the third straight line
int x_intersection23 = -1; //The x-coordinate of the intersection of the second and third straight lines
int y_intersection12 = -1; //Y coordinate of the intersection of the first entered straight line and the second entered straight line
int y_intersection13 = -1; //The y coordinate of the intersection of the first straight line and the third straight line
int y_intersection23 = -1; //The y coordinate of the intersection of the second straight line and the third straight line
//Text field(Maximization function)
JTextField o_x = new JTextField(10);
JTextField o_y = new JTextField(10);
JTextField o_n = new JTextField(10);
//Text field(Constraint 1 and 1st straight line to be input)
JTextField s_x1 = new JTextField(10);
JTextField s_y1 = new JTextField(10);
JTextField s_n1= new JTextField(10);
//Text field(Constraint 2 and 2nd straight line to be input)
JTextField s_x2 = new JTextField(10);
JTextField s_y2 = new JTextField(10);
JTextField s_n2 = new JTextField(10);
//Text field(Constraint 3 and 3rd straight line to be input)
JTextField s_x3 = new JTextField(10);
JTextField s_y3 = new JTextField(10);
JTextField s_n3 = new JTextField(10);
//label(Guidance to prompt input on the screen)
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("Objective function(Maximization function)");
JLabel label12 = new JLabel("Constraints");
//Button 1(Reflect the entered value in the program and draw a straight line on the graph)
JButton button1 = new JButton("(1) Set the input value and output it to the graph");
//Button 2(Start simulating the simplex method)
JButton button2 = new JButton("② Simulation start");
public MyPanel() {
//Register event listener
button1.addActionListener(this);
button2.addActionListener(this);
//Panel layout settings
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));
//Unify the color of each panel to white
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);
//Add each component to each panel
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);
//Each panel, one panel f_Paste on 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_Install panel1 in white
add(f_panel1); //f_Add panel1 to MyPanel
setBackground(Color.WHITE);
Thread refresh = new Thread(this);
refresh.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g); //Fill the component with a background color
int seppen[] = new int[6];
int seppen_max = 0; //Intercept(x,y both)Maximum value of
int xy_max = 0; //X in the graph,Maximum value of y
int x_min = 0; //x minimum intercept
int y_min = 0; //Minimum y-intercept
int n_x_min = 0; //x Number of the expression with the minimum intercept
int n_y_min = 0; //The number of the expression with the minimum y-intercept
double d_masu = 0; //Graph unit per pixel
int select3 = 0; //In step 3, store the numbers of the straight lines involved in the remaining intersections that have not yet moved.
//Find the temporary x-intercept and y-intercept values and assign them to each variable.(Assign up to one decimal place to a variable by casting to int type over 10 times)
int temporary_x1 = (int)(((double)info[4]/(double)info[2])*10); //X-intercept of the first entered straight line
int temporary_y1 = (int)(((double)info[4]/(double)info[3])*10); //Y-intercept of the first entered straight line
int temporary_x2 = (int)(((double)info[7]/(double)info[5])*10); //The x-intercept of the second entered straight line
int temporary_y2 = (int)(((double)info[7]/(double)info[6])*10); //Y-intercept of the second entered straight line
int temporary_x3 = (int)(((double)info[10]/(double)info[8])*10); //The x-intercept of the third entered straight line
int temporary_y3 = (int)(((double)info[10]/(double)info[9])*10); //Y-intercept of the third input straight line
//The intercept obtained above is sequenced seppen[]Store 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;
//Find the maximum value of the intercept.
seppen_max = seppen[0];
for(int i=1; i<6; i++){
if(seppen[i] > seppen_max){
seppen_max = seppen[i];
}
}
//Find the maximum value of the graph scale from the maximum value of the intercept.
while(true){
//When the maximum value of the scale of the graph exceeds the maximum value of the intercept
if(xy_max >= seppen_max){
break; //Break out of the loop and xy at that point_Set max to the maximum value of the scale
}
xy_max = xy_max + 150; //xy_Increase max by 150
//(Since the intercept is multiplied by 10 at the top, the maximum value of the scale actually increases by 15)
}
//Find the graph unit per pixel
d_masu = ((double)300)/((double)xy_max)*10; //300 is the number of pixels in the vertical direction of the graph
//Divide 300 by the maximum value of the scale and multiply by 10 to obtain the value in graph units.
//Find the coordinates of each intercept in the graph
int decisive_x1 = (int)(((double)info[4]/(double)info[2])*d_masu); //X-intercept of the first entered straight line
int decisive_y1 = (int)(((double)info[4]/(double)info[3])*d_masu); //Y-intercept of the first entered straight line
int decisive_x2 = (int)(((double)info[7]/(double)info[5])*d_masu); //The x-intercept of the second entered straight line
int decisive_y2 = (int)(((double)info[7]/(double)info[6])*d_masu); //Y-intercept of the second entered straight line
int decisive_x3 = (int)(((double)info[10]/(double)info[8])*d_masu); //The x-intercept of the third entered straight line
int decisive_y3 = (int)(((double)info[10]/(double)info[9])*d_masu); //Y-intercept of the third input straight line
//Precautions when inputting
g.drawString("* Be sure to enter a positive integer in all input fields.",120,640);
g.drawLine(100,275,100,600); //y axis
g.drawLine(100,600,425,600); //x axis
g.drawLine(95,300,105,300); //y-axis scale(First from the top)
g.drawLine(95,400,105,400); //y-axis scale(Second from the top)
g.drawLine(95,500,105,500); //y-axis scale(Third from the top)
g.drawLine(200,595,200,605); //x-axis scale(First from the left)
g.drawLine(300,595,300,605); //x-axis scale(Second from the left)
g.drawLine(400,595,400,605); //x-axis scale(Third from the left)
//y-axis arrow
g.drawLine(100,275,95,280);
g.drawLine(100,275,105,280);
//x-axis arrow
g.drawLine(425,600,420,595);
g.drawLine(425,600,420,605);
//Draw a graph of the three input straight lines
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);
//Calculate the value of each scale
int n_xy1 = xy_max/30;
int n_xy2 = (xy_max/30)*2;
int n_xy3 = xy_max/10;
//Convert the numerical value of each scale to a character string(To count the number of digits in each scale)
String s_xy1 = String.valueOf(n_xy1);
String s_xy2 = String.valueOf(n_xy2);
String s_xy3 = String.valueOf(n_xy3);
//Get the number of digits of each scale and substitute(To prevent the position of the numerical value on the scale from changing depending on the number of digits)
int xy1_length = String.valueOf(n_xy1).length();
int xy2_length = String.valueOf(n_xy2).length();
int xy3_length = String.valueOf(n_xy3).length();
//When bottan1 is entered(Write the value of each scale to the graph)
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);
}
//Find the minimum value of x-intercept and y-intercept. Also, the number of the straight line with the minimum value(What number was entered)Seeking
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;
}
//Each straight line(Straight line due to constraints)Upper limit value of(Constant term)To a value in graph units and substitute
int upper1 = (int)(((double)info[4])*d_masu);
int upper2 = (int)(((double)info[7])*d_masu);
int upper3 = (int)(((double)info[10])*d_masu);
//Find the x-coordinate of the intersection of each straight line
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);
//Find the y coordinate of the intersection of each straight line
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);
//If there is no intersection, the coordinates(-1,-1)Set to.(-1,-1)Is out of the feasible region
//When the straight lines 1 and 2 are parallel
if(x_intersection12>2000000000 || y_intersection12>2000000000){
x_intersection12 = -1;
y_intersection12 = -1;
}
//When the straight lines 1 and 3 are parallel
if(x_intersection13>2000000000 || y_intersection13>2000000000){
x_intersection13 = -1;
y_intersection13 = -1;
}
//When the straight lines of 2 and 3 are parallel
if(x_intersection23>2000000000 || y_intersection23>2000000000){
x_intersection23 = -1;
y_intersection23 = -1;
}
//When the intersection of 1 and 2 is outside the feasible region
if(info[8]*x_intersection12+info[9]*y_intersection12 > upper3){
x_intersection12 = -1;
y_intersection12 = -1;
}
//When the intersection of 1 and 3 is outside the feasible region
if(info[5]*x_intersection13+info[6]*y_intersection13 > upper2){
x_intersection13 = -1;
y_intersection13 = -1;
}
//When the intersection of 2 and 3 is outside the feasible region
if(info[2]*x_intersection23+info[3]*y_intersection23 > upper1){
x_intersection23 = -1;
y_intersection23 = -1;
}
int answer_x = info[0]*x_min; //x intercept(minimum value)Solution in
int answer_y = info[1]*y_min; //x intercept(minimum value)Solution in
//Solution at the intersection of each straight line(The initial value is-1)
int answer12 = -1;
int answer13 = -1;
int answer23 = -1;
//If the solution at the intersection of each straight line is in the feasible region, assign that solution to each 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;
}
//The maximum solution from the solutions obtained above(Optimal solution)Look for and answer_Substitute for 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;
}
//When the button to start the simulation is clicked
if(simu_judge == 1){
g.setColor(Color.red); //Set the color of the circle to draw to red
g.fillOval(x-4, y-4, 8, 8); //Draw a circle((x-4,y-4)Is the center of the circle)
//step 1(Moving the intercept from the origin)
if(step == 1){
//When the coefficient of the y-intercept of the objective function is larger
if(info[0] <= info[1]){
y = y-1; //Move along the y-axis from the origin
//When the point reaches the minimum value of the y-intercept
if(y == 600-y_min){
//If that point gives the optimal solution
if(answer_max == answer_y){
step = 4; //Move on to step 4
}
//If that point does not give the optimal solution
else{
step = 2; //Move to step 2
}
}
}
//When the coefficient of the y-intercept of the objective function is smaller
else if(info[0] > info[1]){
x = x+1; //Move along the x-axis from the origin
//When the point reaches the minimum value of the x-intercept
if(x == x_min+100){
//If that point gives the optimal solution
if(answer_max == answer_x){
step = 4; //Move on to step 4
}
//If that point does not give the optimal solution
else{
step = 2; //Move to step 2
}
}
}
}
//Step 2(Moving from intercept to intersection)
else if(step == 2){
//When the coefficient of the y-intercept of the objective function is larger
if(info[0] <= info[1]){
//Straight line 1,When you reach the intersection of 2(Limited to the range of the feasible region)
if(x_intersection12>0 && x>x_intersection12+100){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x-(x - (x_intersection12+100));
y = y-(y - (600-y_intersection12));
//If that point gives the optimal solution
if(answer12 > answer13 && answer12 > answer23){
step = 4; //Move on to step 4
}
//If that point does not give the optimal solution
else{
step = 3; //Move on to step 3
select3 = 1; //Remember straight line 1 as a clue to find the remaining intersections
}
}
//Straight line 1,When you reach the intersection of 3(Limited to the range of the feasible region)
else if(x_intersection13>0 && x>x_intersection13+100){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x-(x - (x_intersection13+100));
y = y-(y - (600-y_intersection13));
//If that point gives the optimal solution
if(answer13 > answer12 && answer13 > answer23){
step=4; //Move on to step 4
}
//If that point does not give the optimal solution
else{
step = 3; //Move on to step 3
select3 = 2; //Remember straight line 2 as a clue to find the remaining intersections
}
}
//Straight line 2,When you reach the intersection of 3(Limited to the range of the feasible region)
else if(x_intersection23>0 && x>x_intersection23+100){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x-(x - (x_intersection23+100));
y = y-(y - (600-y_intersection23));
//If that point gives the optimal solution
if(answer23 > answer12 && answer23 > answer13){
step=4; //Move on to step 4
}
//If that point does not give the optimal solution
else{
step = 3; //Move on to step 3
select3 = 3; //Remember straight line 3 as a clue to find the remaining intersections
}
}
//When the optimal solution is the x-intercept and the point is reached
else if(answer_max == answer_x && y>600){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x-(x - (x_min+100));
y = y-(y - 600);
step = 4; //Move on to step 4
}
//These three branches give the coordinate displacement corresponding to each straight line.(To move on that straight line)
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];
}
}
//When the coefficient of the y-intercept of the objective function is smaller
else if(info[0] > info[1]){
//Straight line 1,When you reach the intersection of 2(Limited to the range of the feasible region)
if(y_intersection12>0 && y<600-y_intersection12){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x + ((x_intersection12+100)-x);
y = y + ((600-y_intersection12)-y);
//If that point gives the optimal solution
if(answer12 > answer13 && answer12 > answer23){
step=4; //Move on to step 4
}
//If that point does not give the optimal solution
else{
step=3; //Move on to step 3
select3 = 1; //Remember straight line 1 as a clue to find the remaining intersections
}
}
//Straight line 1,When you reach the intersection of 3(Limited to the range of the feasible region)
else if(y_intersection13>0 && y<600-y_intersection13){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x + ((x_intersection13+100)-x);
y = y + ((600-y_intersection13)-y);
//If that point gives the optimal solution
if(answer13 > answer12 && answer13 > answer23){
step=4; //Move on to step 4
}
//If that point does not give the optimal solution
else{
step=3; //Move on to step 3
select3 = 2; //Remember straight line 2 as a clue to find the remaining intersections
}
}
//Straight line 2,When you reach the intersection of 3(Limited to the range of the feasible region)
else if(y_intersection23>0 && y<600-y_intersection23){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x + ((x_intersection23+100)-x);
y = y + ((600-y_intersection23)-y);
//If that point gives the optimal solution
if(answer23 > answer12 && answer23 > answer13){
step=4; //Move on to step 4
}
//If that point does not give the optimal solution
else{
step=3; //Move on to step 3
select3 = 3; //Remember straight line 3 as a clue to find the remaining intersections
}
}
//When the optimal solution is the y-intercept and the point is reached
else if(answer_max == answer_y && x<100){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x + (100-x);
y = y + ((600-y_min)-y);
step = 4; //Move on to step 4
}
//These three branches give the coordinate displacement corresponding to each straight line.(To move on that straight line)
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];
}
}
}
//Step 3(Moving from intersection to intersection)
else if(step == 3){
//When the coefficient of the y-intercept of the objective function is larger
if(info[0] <= info[1]){
//Straight line 1 which is the remaining intersection,When the intersection of 3 is reached and that point is the execution solution
if(select3 == 1 && x_intersection13>0 && x>x_intersection13+100){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x-(x - (x_intersection13+100));
y = y-(y - (600-y_intersection13));
step=4; //Move on to step 4
}
//Straight line 2 which is the remaining intersection,When the intersection of 3 is reached and that point is the execution solution
else if(select3 == 1 && x_intersection23>0 && x>x_intersection23+100){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x-(x - (x_intersection23+100));
y = y-(y - (600-y_intersection23));
step=4; //Move on to step 4
}
//Straight line 1 which is the remaining intersection,When the intersection of 2 is reached and that point is the execution solution
else if(select3 == 2 && x_intersection12>0 && x>x_intersection12+100){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x-(x - (x_intersection12+100));
y = y-(y - (600-y_intersection12));
step=4; //Move on to step 4
}
//Straight line 2 which is the remaining intersection,When the intersection of 3 is reached and that point is the execution solution
else if(select3 == 2 && x_intersection23>0 && x>x_intersection23+100){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x-(x - (x_intersection23+100));
y = y-(y - (600-y_intersection23));
step=4; //Move on to step 4
}
//Straight line 1 which is the remaining intersection,When the intersection of 2 is reached and that point is the execution solution
else if(select3 == 3 && x_intersection12>0 && x>x_intersection12+100){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x-(x - (x_intersection12+100));
y = y-(y - (600-y_intersection12));
step=4; //Move on to step 4
}
//Straight line 1 which is the remaining intersection,When the intersection of 3 is reached and that point is the execution solution
else if(select3 == 3 && x_intersection13>0 && x>x_intersection13+100){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x-(x - (x_intersection13+100));
y = y-(y - (600-y_intersection13));
step=4; //Move on to step 4
}
//These three branches give the coordinate displacement corresponding to each straight line.(To move on that straight line)
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];
}
}
}
//When the coefficient of the y-intercept of the objective function is smaller
else if(info[0] > info[1]){
if(select3 == 1 && y_intersection13>0 && y<600-y_intersection13){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x + ((x_intersection13+100)-x);
y = y + ((600-y_intersection13)-y);
step=4; //Move on to step 4
}
else if(select3 == 1 && y_intersection23>0 && y<600-y_intersection23){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x + ((x_intersection23+100)-x);
y = y + ((600-y_intersection23)-y);
step=4; //Move on to step 4
}
else if(select3 == 2 && y_intersection12>0 && y<600-y_intersection12){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x + ((x_intersection12+100)-x);
y = y + ((600-y_intersection12)-y);
step=4; //Move on to step 4
}
else if(select3 == 2 && y_intersection23>0 && y<600-y_intersection23){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x + ((x_intersection23+100)-x);
y = y + ((600-y_intersection23)-y);
step=4; //Move on to step 4
}
else if(select3 == 3 && y_intersection12>0 && y<600-y_intersection12){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x + ((x_intersection12+100)-x);
y = y + ((600-y_intersection12)-y);
step=4; //Move on to step 4
}
else if(select3 == 3 && y_intersection13>0 && y<600-y_intersection13){
//When it reaches, correct it so that the point is exactly the center coordinates of the circle.
x = x + ((x_intersection13+100)-x);
y = y + ((600-y_intersection13)-y);
step=4; //Move on to step 4
}
//These three branches give the coordinate displacement corresponding to each straight line.(To move on that straight line)
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];
}
}
}
}
//Step 4(point(Circle)Stops moving and the optimum solution is found. Display the optimal solution)
else if(step == 4){
//Set the color of the optimum solution value to be displayed to black.
g.setColor(Color.black);
//Set the font size to make it easier to see
Font fo = new Font("Serif",Font.PLAIN,20);
g.setFont(fo);
//Convert the optimal solution in graph units to problem units
double best_answer = ((double)answer_max/d_masu);
//Convert the value of the optimal solution to a string
String ba = String.valueOf(best_answer);
//Display the optimal solution
g.drawString("The optimal solution is approximate",450,325);
g.drawString(String.format("%.2f", best_answer), 475, 350);
}
}
}
//Control the thread execution interval to move the circle
public void run() {
while(true) {
repaint();
try {
Thread.sleep(300); //Stop the thread for 100ms
}catch(Exception e) {
System.out.println(e);
}
}
}
public void actionPerformed(ActionEvent ae){
//When button1 is clicked
if(ae.getSource() == button1){
//Store the value entered from the text field in the array info
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=Set to 1 and write 3 straight lines of constraints on the graph
}
//When button2 is clicked
else if(ae.getSource() == button2){
//Set the coordinates of the circle to the origin of the graph
x = 100;
y = 600;
step = 1; //Set the simulation step to 1
simu_judge = 1; //simu_Set judge to 1 and start the simulation
}
}
}
Recommended Posts