Форум: "Основная";
Текущий архив: 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