Гость
326 сообщений
#16 лет назад
Нужна реализация симплекс-метода с проверкой на целочисленность методом ветвей и границ.
Может кто встречался с этим?
Или ссылки какие есть
Дмитрий П.
11 сообщений
#16 лет назад
Реализация на чем?
Ссылки есть:
Дмитрий Васильковский
756 сообщений
#16 лет назад
Цитата ("dimka-writer"):
Реализация на чем?
Ссылки есть: ]www.google.com

Это меня больше всего бесит... долго ищешь в поисковике нечто, нашел форум, а там единственный совет-погугли!
Кирилл Филиппов
60 сообщений
#16 лет назад
Потому что сами не знают, что делать
Inga J.
49 сообщений
#16 лет назад
В помощь учебники по динамическому программированию, информатике и т.д.
Например,
Валентин К.
133 сообщения
#16 лет назад
Николай Шостко
8 сообщений
#16 лет назад
Я пару лет назад делал такое на делфи. На входе массив - внутри несколько формул. На выходе массив. 2 часа ленивой работы.
Проекты не сохранились иначе приложил бы код.
Денис Н.
167 сообщений
#16 лет назад
% Simplex method
% function =Simplex(Z,C,T,Analys,Penalty,Demo)
% parameters:
% Z - cost function
% C - limits matrix
% syntax: C(1) C(2)...C(N) LimitType Value
% LimitType: 0 - '<=', 1 - '=', 2 - '>='
% T - value: 0 - Maximum, 1 - Minimum
% Analys - value: 0 - No, 1 - Yes
% Penalty - penalty for M-method
% Demo - value: 1 - print comments
% returns:
% 0 - Error
% Result - vector of values x
% limforlim - optimal intervals for right parts in limits
% limforz - optimal intervals for coefficients in Z function

M=0;
Penalty=1000;
T=1;
Analys=1;
Demo=1;
Z=;
C=;
if T~=0 & T~=1
Result=0;
return;
end;
=size(C);
if length(Z)~=n-2
Result=0;
return;
end;
warning off MATLAB:divideByZero;
Mode=0;
for i=1:m
if C(i,n-1)>0
Mode=1;
break;
end;
end;
for i=1:m
if C(i,n-1)==2
Msr=zeros(1,m)';
Msr(i)=-1;
C=;
Z=;
n=n+1;
end;
end;
if T==0
Penalty=-Penalty;
end;
for i=1:m
if C(i,n-1)>=1
Z=;
else
Z=;
end;
end;
C=;
n=n-1;
Z=;
M=;
Basis=;
for i=1:m
Basis=;
end;
BasisN=;
if Mode==1
Mt=;
for i=n:m+n-1
if M(1,i)~=0
Mt=;
end;
end;
if length(Mt)==0
Result=0;
return;
end;
Pen=M(1,Mt(1));
if Demo==1
disp('*************************************************Using M-method modification:*************************************************';
disp(sprintf('\n********************************************************Penalty = %5d*******************************************************\n',abs(Pen)));
end;
Mt=Mt-n+1;
for i=1:length(Mt)
M(1,=M(1,-M(Mt(i)+1,*Pen;
end;
end;
Simptab=M;
if Demo==1
disp('******************************************************First simplex table:****************************************************';
disp(M);
%PrintBasis(BasisN);
Str=;
for i=1:length(BasisN)
Str=;
end;

end;
Iteration=0;
while 1
Iteration=Iteration+1;
Min=0;
Max=0;
if T==0
for i=1:m+n-1
if Basis(i)==0
if M(1,i)<Min
Min=M(1,i);
LeadX=i;
end;
end;
end;
else
if T==1
for i=1:m+n-1
if Basis(i)==0
if M(1,i)>Max
Max=M(1,i);
LeadX=i;
end;
end;
end;
end;
end;
if (Min<0 & T==0)|(Max>0 & T==1)
Test=M(2:m+1,m+n)./M(2:m+1,LeadX);
Emin=Inf;
for i=1:m
if Test(i)>=0
if Test(i)<Emin
Emin=Test(i);
RemX=i;
end;
end;
end;
M(RemX+1,=M(RemX+1,/M(RemX+1,LeadX);
for i=1:m+1
if i~=RemX+1
M(i,=M(i,-M(i,LeadX)*M(RemX+1,;
end;
end;
Basis(BasisN(RemX))=0;
BasisN(RemX)=LeadX;
Basis(LeadX)=1;
if Demo==1
disp('------------------------------------------------------------------------------------------------------------------------------';
disp('------------------------------------------------------------------------------------------------------------------------------';
disp(sprintf('Iteration %d:',Iteration));
disp('------------------------------------------------------------------------------------------------------------------------------';
disp(M);
% PrintBasis(BasisN);
Str=;
for i=1:length(BasisN)
Str=;
end;

end;
else
S=zeros(1,m+n);
for i=1:length(BasisN)
S(BasisN(i))=M(i+1,m+n);
end;
S(m+n)=M(1,m+n);
if Demo==1
disp('------------------------------------------------------------------------------------------------------------------------------';
disp('------------------------------------------------------------------------------------------------------------------------------';
disp('Result:';
ans=;
for i=1:n-1
ans=;
end;
ans=;
disp(ans);
end;
NoBasis=;
for i=1:length(Basis)
if Basis(i)==0
NoBasis=;
end;
end;
Result=S(1:n-1);
if Analys==1
if Demo==1
disp('Analys:';
end;
vect=;
for i=1:m
vect=;
end;
vect=vect*M(2:m+1,n:m+n-1);
if Demo==1
disp('Dual cost:';
ans=;
for i=1:m
ans=;
end;
ans=;
disp(ans);
end;
inverse=M(2:m+1,n:m+n-1);
limforlim=;
for i=1:m
lim=-M(2:m+1,m+n)./abs(inverse(:,i));
max=-Inf;
min=Inf;
for j=1:m
if inverse(j,i)>0 & lim(j)>max
max=lim(j);
else
if inverse(j,i)<0 & -lim(j)<min
min=-lim(j);
end;
end;
end;
limforlim=];
end;
if Demo==1
disp('Intervals for right parts of limits:';
ans=;
for i=1:m
ans=;
end;
ans=;
disp(ans);
end;
limforz=zeros(2,n-1);
for i=1:length(NoBasis)
if NoBasis(i)<n
si=vect.*Simptab(2:m+1,NoBasis(i))';
si=sum(si)-Simptab(1,NoBasis(i));
if T==0
limforz(:,NoBasis(i))=;
else
limforz(:,NoBasis(i))=;
end;
end;
end;
for i=1:m
if BasisN(i)<n
max=-Inf;
min=Inf;
for j=1:length(NoBasis)
pp=sum(inverse(i,.*Simptab(2:m+1,NoBasis(j))';
cp=Simptab(2:m+1,NoBasis(j))'.*vect;
cp=(Z(1,NoBasis(j))-sum(cp))/pp;
if T==0
if pp<0
if cp<min
min=cp;
end;
else
if pp>0
if cp>max
max=cp;
end;
end;
end;
else
if pp<0
if cp>max
max=cp;
end;
else
if pp>0
if cp<min
min=cp;
end;
end;
end;
end;
end;
limforz(:,BasisN(i))=+Z(1,BasisN(i));
end;
end;
if Demo==1
disp('Intervals for coefficients in Z function:';
ans=;
for i=1:n-1
ans=;
if mod(i,8)==0 & i~=n-1
ans=;
end;
end;
ans=;
disp(ans);
disp('------------------------------------------------------------------------------------------------------------------------------';
disp('------------------------------------------------------------------------------------------------------------------------------';
end;
end;
warning on MATLAB:divideByZero;
return;
end;
end;
Денис Н.
167 сообщений
#16 лет назад
Это реализация на MatLab. Делал Лаб. работы
Андрей П.
4 сообщения
#16 лет назад
У меня где-то валяется программа на С++. Но я не знаю, какой там метод использовал для проверки целочисленного решения - давно это было. Зато помнится там все расчёты выполнялись в рациональных дробях. Делалась для решения учебных задач, для реальных данных нужен хороший напильник для доработки - ну или заменить тип данных на обычный вещественный.
Если интересно - могу поискать...
Гость
326 сообщений
#16 лет назад
Не надо, если что напишу.
Спасибо всем. Нужна реализация на Delphi + симплекс там двухэтапный
Елена С.
76 сообщений
#16 лет назад
Есть на Паскале именно метод ветвей и границ+Симплекс, делала себе на курсовую когда была студенткой. Если надо пишите в личку или на почту