Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ММ КР.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
948 Кб
Скачать
☆

Додаток 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;

}

}