Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

помогите пожалуйста разобраться: последовательный симплекс метод [D7, WinXP]


Mongoose ©   (2005-12-13 23:34:00) 

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-х мерном пространстве... а потом как отображать наихудшую точку (т.е. ту точку в которой значение целевой функции максимально).


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

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


TUser   (2005-12-14 09:15:00) [2]

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


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

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


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


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

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


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

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


ANB   (2005-12-14 01:18:00) [6]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо