Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.22;
Скачать: CL | DM;

Вниз

помогите пожалуйста разобраться: последовательный симплекс метод   Найти похожие ветки 

 
Mongoose   (2005-12-13 23:34) [0]

unit model;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons, ExtCtrls;

type
 TfmExample = class(TForm)
   Panel1: TPanel;
   bbRun: TBitBtn;
   bbClose: TBitBtn;
   edInput1: TEdit;
   lbOutput1: TLabel;
   mmOutput: TMemo;
   edInput2: TEdit;
   edInput3: TEdit;
   lbOutput2: TLabel;
   lbOutput3: TLabel;
   lbOutput4: TLabel;
   procedure bbRunClick(Sender: TObject);

 private
   { Private declarations }
  {
  x1, y1, delta, x2, x3, y2, y3, x4, y4 :Real;               //переменные координат и шаг
  }
 public
   { Public declarations }
 end;

var
 fmExample: TfmExample;

implementation

{$R *.dfm}

procedure TfmExample.bbRunClick(Sender: TObject);

const
 k = 2;  // Размерность пространства
 L0 = 50;   // Начальное значене
 L1 = 25;   // Коэффициент при X1
 L2 = 40;   // Коэффициент при X2

type
 TSimplex = array[1..(k+1)] of Real;

var
 max, min: Real;
 i: integer;
 S1, S2, S3, S4: String;
 f, x, y: TSimplex;

 procedure Nachkoord(var f,x,y: TSimplex);
 {Эта процедура вычисляет начальные значения координат правильного симплекса,
 исключая самую первую, ее задает с клавиатуры пользователь}
 var
   i: Integer;                             //Идентификатор цикла for
   delta: Real;                            //шаг(длина стороны)

 begin
   //задаем шаг оптимизации
   delta := StrToFloat(Trim(edInput3.Text));
      //заносим координаты в массивы (одномерные)
   for i := 1 to (k+1) do
     begin
       if i <= 1 then
         begin
           //Задаем начальные значения точек
           x[i] := StrToFloat(Trim(edInput1.Text));
           y[i] := StrToFloat(Trim(edInput2.Text));
         end
       else if i <= 2 then   //считаем значения 2-й точки симплекса
         begin
           x[i] := x[1] + delta;
           y[i] := y[1];
         end
       else if i <= 3 then   // считам значения 3-й точки симплекса
         begin
           x[i] := x[1] + delta/2;
           y[i] := y[1] + 0.73*y[1];
         end;
         //считаем целевые функции
       f[i] := L0 + L1 * x[i] + L2 * x[i] * x[i] +L1 * y[i] + L2 * y[i]*y[i];
       //выводим значения начальных точек симплекса и целевой ф-ии в этих точках
       S1 := "Х"+IntToStr(i)+": "+FloatToStr(x[i])+"  У"+IntToStr(i)+":"+FloatToStr(y[i]);
       S2 := "Целевая функция:  "+FloatToStr(f[i]);
       mmOutput.Lines.Add(S1);
       mmOutput.Lines.Add(S2);
     end;
 end; //Nachkoord

 Procedure MaxPoint(var max: Real);
   {Считаем максимальное значение целевой функции}
   var
     i: integer;
   begin
     max := f[1];
     for i := 1 to k+1 do
       begin
         if f[i] > max then max := f[i];

       end;
     S3 := "Максимальное значение целевой функции:  "+FloatToStr(max);
     mmOutput.Lines.Add(S3);
   end; //MaxPoint

 Procedure MinPoint(var min: Real);
   {Считаем минимальное значение целевой функции}
   var
     i: integer;
   begin
     min := f[1];
     for i := 1 to k+1 do
       begin
         if f[i] < min then min := f[i];

       end;
     S4 := "Минимальное значение целевой функции:  "+FloatToStr(min);
     mmOutput.Lines.Add(S4);
   end; //MinPoint

 Procedure Zerkalo(max: Real);
   {Эта процедура создает новую, отображенную, точку}
   const
     s = 3;

   begin

     if f[1] = max then
           begin
             x[s] := k / 2 * (x[2] + x[3] - x[1]);
             y[s] := k / 2 * (y[2] + y[3] - y[1]);
             f[s] := L0 + L1 * x[s] + L2 * x[s] * x[s] +L1 * y[s] + L2 * y[s] * y[s];
             x[2] := x[2]; y[2] := y[2]; x[3] := x[3]; y[3] := y[3]; x[1] := x[s]; y[1] := y[s]; f[1] := f[s];
           end
     else if f[2] = max then
         begin
           x[s] := k / 2 * (x[1] + x[3] - x[2]);
           y[s] := k / 2 * (y[1] + y[3] - y[2]);
           f[s] := L0 + L1 * x[s] + L2 * x[s] * x[s] +L1 * y[s] + L2 * y[s] * y[s];
           x[3] := x[3]; y[3] := y[3]; x[1] := x[1]; y[1] := y[1]; x[2] := x[s]; y[2] := y[s]; f[2] := f[s];
         end
     else if f[3] = max then
       begin
         x[s] := k / 2 * (x[1] + x[2] - x[3]);
         y[s] := k / 2 * (y[1] + y[2] - y[3]);
         f[s] := L0 + L1 * x[s] + L2 * x[s] * x[s] +L1 * y[s] + L2 * y[s] * y[s];
         x[1] := x[1]; y[1] := y[1]; x[2] := x[2]; y[2] := y[2]; x[3] := x[s]; y[3] := y[s]; f[3] := f[s];
       end;
    // f[s] := L0 + L1 * x[s] + L2 * x[s] * x[s] +L1 * y[s] + L2 * y[s] * y[s];
     mmOutput.Lines.Add("Х4:    "+FloatToStr(x[s])+"  У4:   "+FloatToStr(y[s]));
     mmOutput.Lines.Add("Целевая функция:  "+FloatToStr(f[s]));
   end;

                         {ТЕЛО ПРОГРАММЫ}
//-----------------------------------------------------------------------------//
//-----------------------------------------------------------------------------//
//-----------------------------------------------------------------------------//

begin
  Nachkoord (f,x,y);
  for i:=1 to 10 do
  begin
  MaxPoint(max);
  MinPoint(min);
  Zerkalo(max);

  end;
end;


Итак, вопросы:
1.почему процедура Zerkalo - не работает после 4-го или 5-го шага
2. Как подругому написать процедуру Zerkalo, что бы было более читабельно?
3. Если есть программные решения для N-мерного пространства, можно ее предоставить?
Просто я столкнулся с тем что не знаю как задать начальные точки правильного симплекса даже в 4-х мерном пространстве... а потом как отображать наихудшую точку (т.е. ту точку в которой значение целевой функции максимально).


 
ANB ©   (2005-12-14 01:18) [1]

Ну, для начала, переименуй идентификаторы с транслита на нормальные английские слова.
А как ты узнал, что она не работает ? отладчиком ходил ?


 
Mongoose   (2005-12-14 01:50) [2]

Я запусил Run, и проверил. Там получается картинка такая - выполняется (считается) все идеально, т.е. находится максимум целевой функции - потом координаты точки в которой ф-я максимальна отображается по правилу. это происходит не более чем 5 шагов, потом просто переписывается значение и всё... Кстати, хорошая идея просто дебаггером пройтись)


 
Сайбель Алексей ©   (2005-12-14 02:03) [3]


> Кстати, хорошая идея просто дебаггером пройтись

Я бы сказал, обязательная


 
Mongoose   (2005-12-14 02:09) [4]

Прошелся дебаггером, ошибок не выявил, но по факту - не пашет((
Может, можно кому-то прислать ее по почте - благо 184 кб занимает, и Вы, если сможете поможете, буду признателен, просто без пробега, эту ситуацию может сложно понять?


 
TUser ©   (2005-12-14 09:15) [5]

Пришли мне. Высылый только исходники, без dcu и exe - я их все равно удалю.


 
Mongoose   (2005-12-14 18:34) [6]

Спасибо, уважаемые Мастера, я нашел в чем была проблема. Но теперь еще один вопрос:
Как выбрать предыдущее перед максимальным значение функции?



Страницы: 1 вся ветка

Текущий архив: 2006.01.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.058 c
14-1135524553
Fl@sh
2005-12-25 18:29
2006.01.22
Печать pdf


2-1135798689
JEK2
2005-12-28 22:38
2006.01.22
Передать данные в главную форму из неглавной


14-1135921953
syte_ser78
2005-12-30 08:52
2006.01.22
проблема с железом


2-1136472197
noname:))
2006-01-05 17:43
2006.01.22
Потоки и методы работы с ними.


3-1132752488
Дмитрий_Б
2005-11-23 16:28
2006.01.22
Substr в Oracle