Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 20th, 2012  |  syntax: Java  |  size: 7.84 KB  |  hits: 16  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. package simplex;
  2.  
  3. import javax.swing.JOptionPane;
  4. import javax.swing.JTable;
  5.  
  6. public class SimplexSolve {
  7.  
  8. static boolean solved = false;
  9. static boolean lim = false;
  10. static int tempCInd = 0;
  11. static int minRInd = 0;
  12. static int minCInd = 1;
  13. static float[] solution;
  14.  
  15.  //решение задачи в автоматическом режиме
  16.  static float[][] Solve(float[][] matrix){
  17.  
  18.          M1: {
  19.  solved = true;
  20.  // проверяем решение на оптимальность
  21.  for (int i = 0; i <= ReadFile.colCount; i++){
  22.  if (matrix[i][0] < 0)
  23.  solved = false;
  24.  }
  25.  
  26.  /              /пока решение не оптимально
  27.  while (!solved){
  28.  // находим ведущий столбец
  29.  float minR = matrix[0][0];
  30.  int minRInd = 0;
  31.  for (int i = 0; i <= ReadFile.colCount; i++){
  32.  if (matrix[i][0] < minR){
  33.  minR = matrix[i][0];
  34.  minRInd = i;
  35.  }
  36.  }
  37.  
  38.  //проверяем, ограничена ли целевая функция на множестве доп. решений
  39.  lim = false;
  40.  for (int i = 0; i <= ReadFile.rowCount; i++){
  41.  if (matrix[minRInd][i] > 0)
  42.  lim = true;
  43.  }
  44.  //если функция не ограничена, выводим сообщение об ошибке, прерываем
  45.  //решение
  46.  if (!lim){
  47.  solved = true;
  48.  JOptionPane.showMessageDialog(null, "функция не ограничена на множестве допустимых решений");
  49.  break M1;
  50.  }
  51.  
  52.  //находим ведущую строку
  53.  float minC = matrix[ReadFile.colCount][1]/matrix[minRInd][1];
  54.  int minCInd = 1;
  55.  for (int i = 1; i < tempCInd; i++){
  56.  if (matrix[ReadFile.colCount][i]/matrix[minRInd][i] < minC){
  57.  minC = matrix[ReadFile.colCount][i]/matrix[minRInd][i];
  58.  minCInd = i;
  59.  }
  60.  }
  61.  for (int i = tempCInd + 1; i <= ReadFile.rowCount; i++){
  62.  if (matrix[ReadFile.colCount][i]/matrix[minRInd][i] < minC){
  63.  minC = matrix[ReadFile.colCount][i]/matrix[minRInd][i];
  64.  minCInd = i;
  65.  }
  66.  }
  67.  
  68.  //выводим из базиса базисную переменную [0][minCInd], вводим в базис
  69.  //переменную [minRInd][0]
  70.  ReadFile.varCol[minCInd-1] = ReadFile.varRow[minRInd] ;
  71.  
  72.  
  73.  //строим новую симплексную таблицу
  74.  //делим ведущую строку на ведущий элемент [minRInd][minCInd]
  75.  float temp = matrix[minRInd][minCInd];
  76.  System.out.print(">> " + temp + "\n");
  77.  System.out.print("\nведущая строка: ");
  78.  for (int i = 0; i <= ReadFile.colCount; i++){
  79.  matrix[i][minCInd] /= temp;
  80.  }
  81.  
  82.  //получаем нули в ведущем столбце
  83.  for (int j = 0; j < minCInd; j++){
  84.  float minTemp = matrix[minRInd][j];
  85.  for (int i = 0; i <= ReadFile.colCount; i++){
  86.  matrix[i][j] += matrix[i][minCInd] * -minTemp;
  87.  }
  88.  }
  89.  
  90.  for (int j = minCInd+1; j <=ReadFile.rowCount; j++){
  91.  float minTemp = matrix[minRInd][j];
  92.  for (int i = 0; i <= ReadFile.colCount; i++){
  93.  matrix[i][j] += matrix[i][minCInd] * -minTemp;
  94.  }
  95.  }
  96.          //обновляем вектор решения
  97.  for (int i = 0; i < ReadFile.bvarCount; i++){
  98.  for (int j = 0 ; j < ReadFile.varCount; j++){
  99.  int k = j + 1;
  100.  String tempS = "x" + k;
  101.  if (tempS.equals(ReadFile.varCol[i]))
  102.  solution[j] = matrix[ReadFile.colCount][i+1];
  103.  }
  104.  }
  105.  tempCInd = minCInd;
  106.  //рекурсивно вызываем процедуру, пока решение не будет оптимальным
  107.  Solve(matrix);
  108.  }
  109.  }
  110.  return matrix;
  111.  }
  112. //создаем вектор решения
  113. static void initSolution(int varCount){
  114.  solution = new float[varCount];
  115.  for (int i = 0; i < varCount; i++){
  116.  solution[i] = 0;
  117.  }
  118. }
  119.  
  120.  
  121. //выбор ведущего столбца в режиме обучения
  122. static boolean userChooseCol(float[][] matrix, JTable tableName){
  123.  
  124.  boolean err = false;
  125.  
  126.  M1: {
  127.  
  128.  //находим ведущий столбец
  129.  float minR = matrix[0][0];
  130.  minRInd = 0;
  131.  for (int i = 0; i <= ReadFile.colCount; i++){
  132.  if (matrix[i][0] < minR){
  133.  minR = matrix[i][0];
  134.  minRInd = i;
  135.  }
  136.  }
  137.  
  138.  //проверяем выбор пользователя
  139.  while (minRInd != SimplexView.getSelectedCol() - 1){
  140.  JOptionPane.showMessageDialog(null, "ведущий столбец выбран
  141. неверно");
  142.  err = true;
  143.  break M1;
  144.  }
  145.  
  146.  int temp = minRInd;
  147.  float[] proportion = new float[ReadFile.rowCount];
  148.  
  149.  //вычисляем вспомогательный столбец отношения
  150.  for (int i = 1; i <= ReadFile.rowCount; i++){
  151.  if ( i == tempCInd ){
  152.  proportion[i-1] = java.lang.Float.NaN;
  153.  }
  154.  else{
  155.  proportion[i-1] = matrix[ReadFile.colCount][i] /
  156.  matrix[temp][i];
  157.  }
  158.  }
  159.  TableView.fillProportion(tableName, proportion, tempCInd);
  160.  }
  161.  
  162.  return err;
  163.  }
  164.  
  165. //выбор ведущей строки в режиме обучения
  166. static boolean userChooseRow(float[][] matrix, JTable tableName){
  167.  lim = false;
  168.  boolean err = false;
  169.  
  170.  M1:{
  171.  //проверяем, ограничена ли целевая функция на множестве доп. решений
  172.  for (int i = 0; i <= ReadFile.rowCount; i++){
  173.  if (matrix[minRInd][i] > 0)
  174.  lim = true;
  175.  }
  176.  
  177.  if (!lim){
  178.  JOptionPane.showMessageDialog(null, "функция не ограничена на
  179. множестве допустимых решений");
  180.  break M1;
  181.  }
  182.  
  183.  //находим ведущую строку
  184.  float minC = matrix[ReadFile.colCount][1]/matrix[minRInd][1];
  185.  minCInd = 1;
  186.  for (int i = 1; i < tempCInd; i++){
  187.  if (matrix[ReadFile.colCount][i]/matrix[minRInd][i] < minC){
  188.  minC = matrix[ReadFile.colCount][i]/matrix[minRInd][i];
  189.  minCInd = i;
  190.  }
  191.  }
  192.  for (int i = tempCInd + 1; i <= ReadFile.rowCount; i++){
  193.  if (matrix[ReadFile.colCount][i]/matrix[minRInd][i] < minC){
  194.  minC = matrix[ReadFile.colCount][i]/matrix[minRInd][i];
  195.  minCInd = i;
  196.  }
  197.  }
  198.  
  199.  //проверяем выбор пользователя
  200.  System.out.print("user: " + SimplexView.getSelectedRow() + "; min: "
  201.  +minCInd);
  202.  while (minCInd != SimplexView.getSelectedRow()){
  203.  err = true;
  204.  JOptionPane.showMessageDialog(null, "ведущая строка выбрана
  205. неверно");
  206.  break M1;
  207.  }
  208.  }
  209.  return err;
  210.  }
  211.  
  212.  //перестраивает симплексную таблицу
  213.  static void userBuildNewTable(float[][] matrix, JTable tableName){
  214.  //выводим из базиса базисную переменную [0][minCInd], вводим в базис
  215.  //переменную [minRInd][0]
  216.  
  217.  ReadFile.varCol[minCInd-1] = ReadFile.varRow[minRInd] ;
  218.  
  219.  
  220.  //строим новую симплексную таблицу
  221.  //делим ведущую строку на ведущий элемент [minRInd][minCInd]
  222.  float temp = matrix[minRInd][minCInd];
  223.  
  224.  for (int i = 0; i <= ReadFile.colCount; i++){
  225.  matrix[i][minCInd] /= temp;
  226.  }
  227.  
  228.  //получаем нули в ведущем столбце
  229.  for (int j = 0; j < minCInd; j++){
  230.  float minTemp = matrix[minRInd][j];
  231.  for (int i = 0; i <= ReadFile.colCount; i++){
  232.  matrix[i][j] += matrix[i][minCInd] * -minTemp;
  233.  }
  234.  }
  235.  
  236.  for (int j = minCInd+1; j <=ReadFile.rowCount; j++){
  237.  float minTemp = matrix[minRInd][j];
  238.  for (int i = 0; i <= ReadFile.colCount; i++){
  239.  matrix[i][j] += matrix[i][minCInd] * -minTemp;
  240.  }
  241.  }
  242.  
  243.  for (int i = 0; i < ReadFile.bvarCount; i++){
  244.  for (int j = 0 ; j < ReadFile.varCount; j++){
  245.  int k = j + 1;
  246.  String tempS = "x" + k;
  247.  if (tempS.equals(ReadFile.varCol[i]))
  248.  solution[j] = matrix[ReadFile.colCount][i+1];
  249.  }
  250.  }
  251.  
  252.  tempCInd = minCInd;
  253. }
  254.  
  255. //проверяет, оптимально ли текущее решение
  256. static boolean checkSolved(float matrix[][]){
  257.  
  258.  solved = true;
  259.  for (int i = 0; i <= ReadFile.colCount; i++){
  260.  if (matrix[i][0] < 0)
  261.  solved = false;
  262.  }
  263.  if (solved){
  264.  JOptionPane.showMessageDialog(null, " задача решена ");
  265.  tempCInd = 0;
  266.  }
  267.  
  268.  return solved;
  269.  }
  270. }
  271.  
  272. Размещено на Allbest.ru