Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.04 c
2-1135984359
ilifant
2005-12-31 02:12
2006.01.22
integer()


14-1135403418
begin...end
2005-12-24 08:50
2006.01.22
С Днём рождения! 24 декабря


2-1136423835
Вороной
2006-01-05 04:17
2006.01.22
Как перевести на Дельфи этот алгоритм?


11-1117688514
azsd
2005-06-02 09:01
2006.01.22
KOL+FPC 2.0 return 39 errors in converted kol.pas


11-1118060667
Ilnur
2005-06-06 16:24
2006.01.22
abort в KOL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский