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

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

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Результаты опроса: Симплекс-метод(Delphi)
Delphi 6 85.71%
Delphi 5 71.43%
Опрос с выбором нескольких вариантов ответа. Голосовавшие: 7. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2016, 08:10   #1
CHLOROFIL
 
Регистрация: 11.05.2016
Сообщений: 3
По умолчанию Закомментировать код (симплекс-метод)

Скачал, но половину из этого кода не понимаю.
Код:
procedure TMainForm.N6Click(Sender: TObject);
var
  SimplexTable,SimplexTableNew:array of array of extended;
  GoalFun:array of extended;
  ArtFun:array of extended;
  ExtrEstimation:extended;
  k,i,j,MoreCount,LessCount,EquallyCount,extrItem,WLine,IterCount: integer;
  Art,bil:boolean;
label fin,up; //Название ссылок
begin
Art:=true; 
bil:=false; 
IterCount:=0;
SimplexTable:=nil;
MoreCount:=0; LessCount:=0; EquallyCount:=0;
//Сортировка ограничений: 1) >=; 2) =; 3) <=.
//Порождение начального базиса.
//итерационное построение симплекс-таблиц
{1}//---------------------------------------------------------------------------
//сортировка «больше»
with MainForm.ActiveMDIChild as TChildForm do 
  begin
  //строки в таблицах дочернего окна нумеруются с 1
//нулевая строка резервная  
  for i:=1 to SignsChild.RowCount-1 do
    begin
    if (SignsChild.Cells[0,i]='>') or (SignsChild.Cells[0,i]='>=') then
      begin
      inc(MoreCount);
      SetLength(SimplexTable,LimChild.ColCount+2,MoreCount);
      //коэффиценты
      for j:=0 to LimChild.ColCount-1 do
      SimplexTable[j+2,MoreCount-1]:=StrToFloat(LimChild.cells[j,i]);
      // пока 0 (потом базис…)
      SimplexTable[0,MoreCount-1]:=0;
      //Значение (в i-ый)
      SimplexTable[1,MoreCount-1]:=StrToFloat(BChild.cells[0,i]);
      end;
    end;
{2}//---------------------------------------------------------------------------


//Порождение начального базиса
//Добавить коэффицент  -1 (>=)
for j:=0 to MoreCount-1 do
  begin  Setlength(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);
  for i:=length(SimplexTable)-MoreCount+1 to length(SimplexTable)-1 do
  SimplexTable[i,j]:=0;
  SimplexTable[length(SimplexTable)-1,j]:=-1;
  end;
//Добавить коэффицент  1 (<=)
for j:=MoreCount+EquallyCount to MoreCount+EquallyCount+LessCount-1 do
  begin  Setlength(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);
  for i:=length(SimplexTable)-LessCount+2 to length(SimplexTable)-1 do
  SimplexTable[i,j]:=0;
  SimplexTable[length(SimplexTable)-1,j]:=1;
  end;
//Добавить искуственный коэффицент   (>= и =)
for j:=0 to MoreCount+EquallyCount-1 do
  begin    Setlength(SimplexTable,length(SimplexTable)+1,MoreCount+EquallyCount+LessCount);
    for i:=length(SimplexTable)-MoreCount+1 to length(SimplexTable)-1 do
    SimplexTable[i,j]:=0;
    SimplexTable[length(SimplexTable)-1,j]:=1;
  end;
//целевая функция GoalFun
GoalFun:=nil;
with MainForm.ActiveMDIChild as TChildForm do
  begin
  SetLength(GoalFun,GoalChild.ColCount+1);
  for i:=1 to GoalChild.ColCount do
    begin
    if parametersForm.Min.Checked then GoalFun[i]:=StrToFloat(goalChild.Cells[i-1,1])
    else GoalFun[i]:=-1*StrToFloat(goalChild.Cells[i-1,1]);
    end;
  end;
//Искуственная функция ArtFun
ArtFun:=nil;
SetLength(ArtFun,length(SimplexTable)-1-MoreCount);
//i=1 – Значение исключаемой функции
for i:=1 to length(SimplexTable)-3 do
for j:=0 to MoreCount-1 do ArtFun[i-1]:=ArtFun[i-1]-SimplexTable[i,j];

//------------------------------------------------------------------------------
//Минимизация искусственной функции
//Базис
if MoreCount>0 then
  begin
  for j:=0 to MoreCount-1 do
  SimplexTable[0,j]:=length(simplexTable)-MoreCount+j-1;
  for i:=MoreCount to length(simplexTable[0])-1 do
  SimplexTable[0,i]:=length(simplexTable)-(LessCount+EquallyCount+MoreCount)+(i-MoreCount)-1;
  end
else
for i:=0 to LessCount+EquallyCount-1 do
  SimplexTable[0,i]:=length(simplexTable)-(LessCount+EquallyCount+MoreCount)+i-1;
//2 нижние строки оценок
SetLength(SimplexTable,length(SimplexTable),length(SimplexTable[0])+2);
for i:=0 to length(GoalFun)-1 do SimplexTable[i+1,length(SimplexTable[0])-2]:=goalFun[i];
for i:=0 to length(ArtFun)-1 do SimplexTable[i+1,length(SimplexTable[0])-1]:=ArtFun[i];
SimplexTableNew:=nil;
SetLength(SimplexTableNew,length(SimplexTable),length(SimplexTable[0]));

//итерации…
k:=0;
if art then
for i:=2 to length(simplexTable)-1 do
  begin
    if simplexTable[i,length(SimplexTable[0])-1]<0 then
      begin
      for j:=0 to length(SimplexTable[0])-3 do
      if simplexTable[i,j]<=0 then inc(k);
      if k=length(SimplexTable[0])-2 then
        begin
        with MainForm.ActiveMDIChild as TChildForm do
          begin
          task.Items.Add('');
          task.Items.Add(‘Невозможно найти начальный базис’);
          exit;
          end;
       k:=0;
       end;
      end;
   end;
k:=0;
if not art then
for i:=2 to length(simplexTable)-1 do
  begin
    if simplexTable[i,length(SimplexTable[0])-1]<0 then
      begin
      for j:=0 to length(SimplexTable[0])-2 do
      if simplexTable[i,j]<=0 then inc(k);
      if k=length(SimplexTable[0])-1 then
        begin
        with MainForm.ActiveMDIChild as TChildForm do
          begin
          task.Items.Add('');
          task.Items.Add(‘Целевая функция не ограничена’);
          exit;
          end;
        end;
      end;
   end;

//Поиск первой минимальных из отрицательных оценки искуственной функции
ExtrEstimation:=100000;
extrItem:=0;
for i:=2 to length(simplexTable)-1 do
if (SimplexTable[i,length(SimplexTable[0])-1]<ExtrEstimation) and (SimplexTable[i,length(SimplexTable[0])-1]<0) then
 begin
 extrItem:=i-1;{Новый базис}
 ExtrEstimation:=SimplexTable[i,length(SimplexTable[0])-1];
 end;
if ExtrEstimation=100000 then goto fin;

//Новый базис
for i:=0 to length(SimplexTable[0])-1 do SimplexTableNew[0,i]:=SimplexTable[0,i];
SimplexTableNew[0,WLine]:=extrItem;
//Перерасчет рабочей строки
for i:=1 to length(SimplexTable)-1 do SimplexTableNew[i,WLine]:=SimplexTable[I,wlINE]/SimplexTable[extrItem+1,wlINE];
Листинг 8-Поиск первой минимального из положительных
//Перерасчет коэффицентов
for i:=1 to length(SimplexTable)-1 do
for j:=0 to length(SimplexTable[0])-1 do
if j<>WLine then
SimplexTableNew[i,j]:=SimplexTable[i,j]-SimplexTable[i,Wline]*SimplexTable[extrItem+1,j]/SimplexTable[extrItem+1,WLine];
//Копирование таблиц
for i:=0 to length(SimplexTable)-1 do for j:=0 to length(SimplexTable[0])-1 do SimplexTable[i,j]:=SimplexTableNew[i,j];
//Вывод решения
if ParametersForm.CheckBox1.Checked then begin
bil:=false;
if not art then
 with MainForm.ActiveMDIChild as TChildForm do
  begin
  task.Items.Add('');
  task.Items.Add('Итерация '+InttoStr(IterCount));
  for i:=0 to GoalChild.ColCount-1 do
  begin
    for j:=0 to length(SimplexTable[0])-1 do
    if i+1=SimplexTable[0,j] then
    begin
    task.Items.Add('  '+GoalChild.Cells[i,0]+'='+FloatToStr(SimplexTable[1,j]));
    bil:=true;
    end;
  if not bil then task.Items.Add('  '+GoalChild.Cells[i,0]+'=0');
  bil:=false;
  end;
end;
end; 
until false;
fin:
if art then
  begin
  art:=false;
  SetLength(SimplexTable,Length(SimplexTable)-MoreCount,Length(SimplexTable[0])-1);
  goto up;
  end;

//результат
with MainForm.ActiveMDIChild as TChildForm do
  begin
  task.Items.Add('');
  task.Items.Add('Результат');
  for i:=0 to GoalChild.ColCount-1 do
  begin
    for j:=0 to length(SimplexTable[0])-1 do
    if i+1=SimplexTable[0,j] then
    begin
    task.Items.Add('  '+GoalChild.Cells[i,0]+'='+FloatToStr(SimplexTable[1,j]));
    bil:=true;
  end;
  if not bil then task.Items.Add('  '+GoalChild.Cells[i,0]+'=0');
  bil:=false;
  end;
  task.Items.Add('');
  if parametersForm.Min.Checked then
  task.Items.Add(‘Минимальное значение функции '+FloatToStr(-1*(SimplexTable[1,length(SimplexTable[0])-1])))
  else
  task.Items.Add(' Максимальное значение функции '+FloatToStr(SimplexTable[1,length(SimplexTable[0])-1]));
  end;
end;

Последний раз редактировалось Вадим Мошев; 05.06.2016 в 13:49.
CHLOROFIL вне форума Ответить с цитированием
Старый 05.06.2016, 15:26   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

да этож хэллоу-ворлд в миниатюре! чо тут непонятного-то?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 05.06.2016, 17:21   #3
CHLOROFIL
 
Регистрация: 11.05.2016
Сообщений: 3
По умолчанию

Мне надо более точное комментирование.
CHLOROFIL вне форума Ответить с цитированием
Старый 05.06.2016, 17:48   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Мне надо более точное комментирование.
Обратись к автору кода.
Имхо, больше никто не будет тратить своё время на разгребание этой писанины.
Как по мне - проще с нуля прогу написать, чем в чужой разбираться.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 05.06.2016, 20:28   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от CHLOROFIL Посмотреть сообщение
Мне надо более точное комментирование.
Такое?
Изображения
Тип файла: jpg 666296_vot-tyi-i-probil-golovoj-stenu-chto-budesh-delat-v-sosednej-kamere.jpg (45.9 Кб, 67 просмотров)
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите закомментировать код на паскале Reversi Помощь студентам 4 17.05.2016 11:13
Закомментировать код Саша1990 Помощь студентам 1 09.04.2015 00:19
Закомментировать код Саша1990 Помощь студентам 4 08.04.2015 23:34
симплекс метод bakir Помощь студентам 3 11.04.2011 16:35