Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2012, 20:57   #1
romich.91
Пользователь
 
Регистрация: 11.05.2009
Сообщений: 14
По умолчанию Поиск по симплексу.паскаль

на паскале написана программа для реализации алгоритма поиска по симплексу, но проблема за ключается в том, что ответ программа высчитывает неверный. Посмотрите, пожалуйста, может кто подскажет что упустил в коде. Код:

Program z;

Uses Crt;

Var d1, d2, alfa, e : real;
X, Y : Array[0..2] Of real;
Xc, S, n : Array[0..2] Of real;
i, j, q, min, max, M : integer;
Xold, Yold : real;
flag1, flag2 : boolean;

{W - целевая функция}
Function W(V1, S1 : real) : real;
Begin
W := 34600 + 542 * V1 + 20 * S1 - 2.4 * Sqr(V1) - 1.05 * V1 * S1;
End;

Begin
Clrscr;
alfa := 0.5; {масштабный множитель}
M := 4; {максимальное кол-во повторов вершины}
e := 0.00001;
flag2 := true;
X[0] := 1; {Начальные значения точки Хо}
Y[0] := 1;

While flag2 Do {цикл, где уменьшается размер симплекса}
Begin
n[0] := 0; n[1] := 0;; n[2] := 0;
flag1 := true; {нет циклического движения}
d1 := alfa * ((Sqrt(3) + 1)/(2 * Sqrt(2)));
d2 := alfa * ((Sqrt(3) - 1)/(2 * Sqrt(2)));
q := 0; {итерации}


{находим две оставшиеся точки Х1 и Х2}
X[1] := X[0] + d2;
Y[1] := Y[0] + d1;
X[2] := X[0] + d1;
Y[2] := Y[0] + d2;
While flag1 Do
Begin
{В каждой точке находим W}
For i := 0 To 2 Do S[i] := W(X[i], Y[i]);
min := 0;
max := 0;
{Находим точку, где минимальная и максимальная W}
For i := 1 To 2 Do
Begin
IF S[min] > S[i] Then min := i;
IF S[max] < S[i] Then max := i;
End;

Xold := X[min];
Yold := Y[min];

Case min of
0: Begin
X[0] := X[1] + X[2] - X[0];
Y[0] := Y[1] + Y[2] - Y[0];
n[0] := 0;
n[1] := n[1] + 1; n[2] := n[2] + 1;
End;
1: Begin
X[1] := X[0] + X[2] - X[1];
Y[2] := Y[0] + Y[2] - Y[1];
n[1] := 0;
n[0] := n[0] + 1; n[2] := n[2] + 1;
End;
2: Begin
X[2] := X[1] + X[0] - X[2];
Y[2] := Y[1] + Y[0] - Y[2];
n[2] := 0;
n[1] := n[1] + 1; n[0] := n[0] + 1;
End;
End;
{проверка на повторяющуюся вершину}
IF (n[0] = M) Or (n[1] = M) Or (n[2] = M) Then
flag1 := false Else flag1 := true;
q := q + 1;
IF (Sqrt(Sqr(X[2] - X[1]) + Sqr(Y[2] - Y[1])) < e) Then
Begin
flag1 := false;
flag2 := false;
End;
{flag1 = false при циклическом движении}
End;
X[0] := Xold;
Y[0] := Yold;
alfa := alfa - 0.0025; {уменьшаем размер симплекса}
{условие выхода из цикла}
IF alfa > 0 Then flag2 := true Else flag2 := false;
{flag2 = true при alfa > 0}
End;

Writeln('S = ', X[max]);
Writeln('V = ', Y[max]);
Write('W = ', W(X[max], Y[max]));
Readln;
End.

ответы программы:
S = 117.631
V = 49.526
W = 60020.493
какие должны быть(примерно):
S = 0
V = 110
W = 65000
romich.91 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск в файле.Паскаль Лешка Помощь студентам 6 12.01.2011 18:16
паскаль поиск shark2010 Помощь студентам 5 22.04.2010 23:21
Бинарный поиск (Паскаль) Zhanna5006 Помощь студентам 3 07.01.2010 09:52
бинарный поиск(паскаль) MetR Помощь студентам 6 14.12.2009 15:46
поиск слова(паскаль) MetR Помощь студентам 6 04.12.2009 22:26