4. . г .
.
:
A | B | C | D | ||
R1 | |||||
R2 | |||||
R3 | |||||
Z = 3x1+8x2+9x3+5x4
4x1+2x2+x3+4x4≤506
2x1++2x3+3x4≤206
2x1+3x2+x3 +.≤546
2)
4y1+2y2+2y3 3
2y1+ + 3y3 8
y1+2y2+y3 9
4y1+3y2+ 5
.
, .
F (X) = 3x1+8x2+9x3+5x4 -.
4x1+2x2+x3+4x4≤506
2x1+2x3+3x4≤206
2x1+3x2+x3≤546
( ).
1- (≤) x5. 2- (≤) x6. 3- (≤) x7.
4x1 + 2x2 + x3 + 4x4 + x5 = 506
2x1 + 2x3 + 3x4 + x6 = 206
2x1 + 3x2 + x3 + x7 = 546
A = a(ij) :
:
x5, x6, x7,
, 0, :
X1 = (0,0,0,0,506,206,546)
x1 | x2 | x3 | x4 | x5 | x6 | x7 | ||
x5 | ||||||||
x6 | ||||||||
x7 | ||||||||
z-c | -10 | -5 | -4 | -8 |
-.
0.
, .
, x1, .
Di : bi / ai1
:
min(506/2, 206/2, 546/2) = 103
, 2- .
x1 | x2 | x3 | x4 | x5 | x6 | x7 | Q | ||
x5 | |||||||||
x6 | |||||||||
x7 | |||||||||
z-c | -10 | -5 | -4 | -8 |
|
|
ϳ :
x1 | x2 | x3 | x4 | x5 | x6 | x7 | ||
x5 | -3 | -2 | -2 | |||||
x1 | 1.5 | 0.5 | ||||||
x7 | -1 | -3 | -1 | |||||
z-c | -8 | -6 | -0.5 | 1.5 |
1.
, .
, x2, .
Di : bi / ai2
. , 1- .
x1 | x2 | x3 | x4 | x5 | x6 | x7 | Q | ||
x5 | -3 | -2 | -2 | ||||||
x1 | 1.5 | 0.5 | - | ||||||
x7 | -1 | -3 | -1 | ||||||
z-c | -8 | -6 | -0.5 | 1.5 |
ϳ :
x1 | x2 | x3 | x4 | x5 | x6 | x7 | ||
x2 | -1.5 | -1 | 0.5 | -1 | ||||
x1 | 1.5 | 0.5 | ||||||
x7 | 3.5 | -1.5 | ||||||
z-c | -18 | -3,5 | -8 |
2.
, .
, x3, .
Di : bi / ai3
. , 3- .
x1 | x2 | x3 | x4 | x5 | x6 | x7 | Q | ||
x2 | -1.5 | -1 | 0.5 | -1 | - | ||||
x1 | 1.5 | 0.5 | 51.5 | ||||||
x7 | 3.5 | -1.5 | 99.5 | ||||||
z-c | -18 | -8,5 | -8 |
ϳ :
x1 | x2 | x3 | x4 | x5 | x6 | x7 | ||
x2 | 52.5 | -0.14 | -0.14 | 0.43 | ||||
x1 | 3.5 | 1.5 | 0.43 | -0.0714 | -0.29 | |||
x3 | 99.5 | -0.43 | 0.57 | 0.29 | ||||
F(X3) | 7.5 | 1.12 | 0.86 | 5.18 |
ʳ : - .
:
X*=(3.5, 52.5, 99.5, 0)
F(X) = 3*3.5 + 8*52.5 + 9*99.5 = 1326
. ³ :
F min = 506*y1+206*y2+546*y3=1326
Z max = F min = 1326
.
A, B, C A=3.5 (.), B=52.5 (.), C=99.5 (.). D(x4=0) .
1326 .
|
|
, . , ( ), , 1-, 2- 3- . ֳ .
:
. , ,
:
4*3.5 +2*52.5 +1*99.5 +4*0=218.5 ( A )
2*3.5 + 2*99.5 + 3*0=206 ( B )
2*3.5 + 3*52.5 +1*99.5 +0*0=264 ( C )
. 0, , =0, .
.
(b1=506+1=507), Z max .. Z max=1327.57.
1 3.5 .. 3.37 . ., 1 52.5 . 52.8, 99.5 . 100.1 ..
(b2=206+1=207), Z max .. Z max=1327.57.
2 52.5 .. 53.57 . ., 1 3.5 . 2.43, 99.5 . 100.7 ..
(b3=546+1=547), Z max .. Z max= 1327.29.
3 99.5 .. 99.79 . ., 1 3.5 . 3.21, 99.5 . 99.79 ..
ϳ , , , 10 . , ()
() 1 ∆b1.
, , - 䒺 :
, 1 350 8,14 , 1 . , 1 :
:
2 3
, 2 350 . 174.56 ., 2 1,57.
2 :
:
() 3 ∆b3.
, , - 䒺 :
, 3 12.06 343.1 , 3 1,29. , 3 :
:
|
|
, , , . .
3 :
-. :
x1 | x2 | x3 | x4 | x5 | x6 | x7 | ||
x2 | 62.1 | -0.14 | -0.14 | 0.43 | ||||
x1 | 4.7 | 1.5 | 0.43 | -0.0714 | -0.29 | |||
x3 | 93.2 | -0.43 | 0.57 | 0.29 | ||||
F(X4) | 7.5 | 1.07 | 0.24 | 4.77 |
:
22.7 1349.7.
, , , .
ϳ . ( ) ( ), . , .
4*1,57+2*1,57+2*1,29=12 ( )
2*1,57+3*1,29=7 ( )
1*1,57+2*1,57+1*1,29=6 ( )
4*1,57+3*1,57=11>10 ( D )
, , , . , , .
.
1=1,57 2=1,57 3=1,29 4=0
, , , D .
ϳ ( ). , ,
, -, , . , 䒺.
. 4 , -
, D 7.5 .., .
. -, ().
:
x1 | x2 | x3 | x4 | x5 | x6 | x7 | ||
x2 | 62.1 | -0.14 | -0.14 | 0.43 | ||||
x1 | 4.7 | 1.5 | 0.43 | -0.0714 | -0.29 | |||
x3 | 93.2 | -0.43 | 0.57 | 0.29 | ||||
F(X4) | 7.5 | 1.07 | 0.24 | 4.77 |
|
|
, . :
,
, 1 54.28 86 .., -83 57.28 ..
:
, . :
, 2 11.4 2,9 .., 6.1 19.4 ..
:
, . :
, 3 3.7 2.8 .., 7.8 12.7 ..
, X -, .
.
. -. Java. , . , , . Java. -, .
1 .. - . . .: , 2004.
2 : / . .. .: , 1999.
3 .. . .: , 1999.
4 . . 7- .. : , 2007.
5 .. . ϳ (. ). 7- .. : , 2006.
6 .. : . . 5- ., . : ., 2004.
7 : . / .., .., .., .. . . .. . : , 2002.
1
ϳ : ) ; ) ; ) ( MIN); ) (=, ≥, ≤)
ϳ , , .
, , , . : , MIN ( , ) (. 2). , . ( ) .
2-
|
|
2
package simplex;
import javax.swing.*;
public class Simplex {
static boolean solved = false;
static boolean lim = false;
static int tempCInd = 0;
static int minRInd = 0;
static int minCInd = 1;
static float[] solution;
//
static float[][] Solve(float[][] matrix){
solved = true;
// Check for optimum
for (int i = 0; i <= ReadFile.colCount; i++){
if (matrix[i][0] < 0)
solved = false;
//While answer is not optimum
while (!solved){
//
float minR = matrix[0][0];
int minRInd = 0;
for (int i = 0; i <= ReadFile.colCount; i++){
if (matrix[i][0] < minR){
minR = matrix[i][0];
minRInd = i;
}
}
//check AF
lim = false;
for (int i = 0; i <= ReadFile.rowCount; i++){
if (matrix[minRInd][i] > 0)
lim = true;
}
//If error
//
if (!lim){
solved = true;
JOptionPane.showMessageDialog(null, " ");
break M1;
}
//Finding direction string
float minC = matrix[ReadFile.colCount][1]/matrix[minRInd][1];
int minCInd = 1;
for (int i = 1; i < tempCInd; i++){
if (matrix[ReadFile.colCount][i]/matrix[minRInd][i] < minC){
minC = matrix[ReadFile.colCount][i]/matrix[minRInd][i];
minCInd = i;
}
}
for (int i = tempCInd + 1; i <= ReadFile.rowCount; i++){
if (matrix[ReadFile.colCount][i]/matrix[minRInd][i] < minC){
minC = matrix[ReadFile.colCount][i]/matrix[minRInd][i];
minCInd = i;
}
}
//Get from basis [0][minCInd], push into basis [minRInd][0]
ReadFile.varCol[minCInd-1] = ReadFile.varRow[minRInd];
//new simplex table
//separate DS on D element
float temp = matrix[minRInd][minCInd];
System.out.print(">> " + temp + "\n");
System.out.print("\n : ");
for (int i = 0; i <= ReadFile.colCount; i++){
matrix[i][minCInd] /= temp;
}
//
for (int j = 0; j < minCInd; j++){
float minTemp = matrix[minRInd][j];
for (int i = 0; i <= ReadFile.colCount; i++){
matrix[i][j] += matrix[i][minCInd] * -minTemp;
}
}
for (int j = minCInd+1; j <=ReadFile.rowCount; j++){
float minTemp = matrix[minRInd][j];
for (int i = 0; i <= ReadFile.colCount; i++){
matrix[i][j] += matrix[i][minCInd] * -minTemp;
}
}
//upgrade answer vector
for (int i = 0; i < ReadFile.bvarCount; i++){
for (int j = 0; j < ReadFile.varCount; j++){
int k = j + 1;
String tempS = "x" + k;
if (tempS.equals(ReadFile.varCol[i]))
solution[j] = matrix[ReadFile.colCount][i+1];
}
}
tempCInd = minCInd;
//recursion until not optimum answer
Solve(matrix);
}
}
return matrix;
}
//create answer vector
static void initSolution(int varCount){
solution = new float[varCount];
for (int i = 0; i < varCount; i++){
solution[i] = 0;
}
}
//select D column
static boolean userChooseCol(float[][] matrix, JTable tableName){
boolean err = false;
M1: {
//find DC
float minR = matrix[0][0];
minRInd = 0;
for (int i = 0; i <= ReadFile.colCount; i++){
if (matrix[i][0] < minR){
minR = matrix[i][0];
minRInd = i;
}
}
//check choise of user
while (minRInd!= SimplexView.getSelectedCol() - 1){
JOptionPane.showMessageDialog(null, "
");
err = true;
break M1;
}
int temp = minRInd;
float[] proportion = new float[ReadFile.rowCount];
//calculate help column
for (int i = 1; i <= ReadFile.rowCount; i++){
if (i == tempCInd){
proportion[i-1] = java.lang.Float.NaN;
}
else{
proportion[i-1] = matrix[ReadFile.colCount][i] /
matrix[temp][i];
}
}
TableView.fillProportion(tableName, proportion, tempCInd);
}
return err;
}
//select DS
static boolean userChooseRow(float[][] matrix, JTable tableName){
lim = false;
boolean err = false;
M1:{
//check AF
for (int i = 0; i <= ReadFile.rowCount; i++){
if (matrix[minRInd][i] > 0)
lim = true;
}
if (!lim){
JOptionPane.showMessageDialog(null, "
");
break M1;
}
//find DS
float minC = matrix[ReadFile.colCount][1]/matrix[minRInd][1];
minCInd = 1;
for (int i = 1; i < tempCInd; i++){
if (matrix[ReadFile.colCount][i]/matrix[minRInd][i] < minC){
minC = matrix[ReadFile.colCount][i]/matrix[minRInd][i];
minCInd = i;
}
}
for (int i = tempCInd + 1; i <= ReadFile.rowCount; i++){
if (matrix[ReadFile.colCount][i]/matrix[minRInd][i] < minC){
minC = matrix[ReadFile.colCount][i]/matrix[minRInd][i];
minCInd = i;
}
}
//check user
System.out.print("user: " + SimplexView.getSelectedRow() + "; min: "
+minCInd);
while (minCInd!= SimplexView.getSelectedRow()){
err = true;
JOptionPane.showMessageDialog(null, "
");
break M1;
}
}
return err;
}
//rebuild simplex table
static void userBuildNewTable(float[][] matrix, JTable tableName){
ReadFile.varCol[minCInd-1] = ReadFile.varRow[minRInd];
float temp = matrix[minRInd][minCInd];
for (int i = 0; i <= ReadFile.colCount; i++){
matrix[i][minCInd] /= temp;
}
//nulls in DC
for (int j = 0; j < minCInd; j++){
float minTemp = matrix[minRInd][j];
for (int i = 0; i <= ReadFile.colCount; i++){
matrix[i][j] += matrix[i][minCInd] * -minTemp;
}
}
for (int j = minCInd+1; j <=ReadFile.rowCount; j++){
float minTemp = matrix[minRInd][j];
for (int i = 0; i <= ReadFile.colCount; i++){
matrix[i][j] += matrix[i][minCInd] * -minTemp;
}
}
for (int i = 0; i < ReadFile.bvarCount; i++){
for (int j = 0; j < ReadFile.varCount; j++){
int k = j + 1;
String tempS = "x" + k;
if (tempS.equals(ReadFile.varCol[i]))
solution[j] = matrix[ReadFile.colCount][i+1];
}
}
tempCInd = minCInd;
}
//check for optimum
static boolean checkSolved(float matrix[][]){
solved = true;
for (int i = 0; i <= ReadFile.colCount; i++){
if (matrix[i][0] < 0)
solved = false;
}
if (solved){
JOptionPane.showMessageDialog(null, " ");
tempCInd = 0;
}
return solved;
}
}