- •1.1 Системний підхід при дослідженні операцій
- •1.2 Етапи проведення дослідження операцій Основні етапи дослідження операцій:
- •Постановка задачі
- •2.1. Загальна схема і класифікація кінцевих методів рішення задач лінійного програмування
- •2.2. Опис використаного варіанту симплекс-метода
- •3.1. Обґрунтування вибору засобів розробки прикладного програмного забезпечення
- •3.2. Визначення варіантів використання
- •1.1 Побудова математичної моделі.
- •1) Пряма задача
- •2) Двоїста задача
- •Знаходження оптимального рішення прямої і двоїстої задач.
- •Висновок
- •Список використаної літератури
- •Додаток 1
- •Додаток 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;
}
}
