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

Вниз

Транспортная задача   Найти похожие ветки 

 
тихий вовочка ©   (2004-02-25 22:24) [0]

Помогите, пожалуйста, я уже постил, но мне никто не ответил по делу. Надо решить транспортную задачу имея таблицу стоимости, запасы и заявки. На бумаге ее решил за полчаса, а с реализацией не продвигаюсь. Я так глуп, что дальше составления опорного плана методом северо-западного угла не продвигаюсь. Алгоритм расчета псевдостоимостей и улучшения таблицы мне не составить. А в инете растиражирована только одна программа, код которой мне не понять.
Вы же сдавали линейное программирование!


 
reticon ©   (2004-02-25 22:33) [1]

а самому поискать?

http://mgkip.narod.ru/files/KM_TR_ZAD.ZIP


 
тихий вовочка ©   (2004-02-25 23:29) [2]

Так это и есть та прога, которую растиражировали в инете. Работать она работает, да я ничего понять не могу. И в инете уже 4 дня ищу. Мне вовсе не нужен готовый код, мне алгоритма достаточно.


 
reticon ©   (2004-02-25 23:41) [3]

тем более, алгоритмов в сети еще больше, чем сырцов...

в конце концов, в литературе по высшей математике, например, на бумажном носителе...

У меня есть книги, но опять же, надо сканировать итп...

Короче, не можешь найти в сети - сходи в библиотеку :-)


 
тихий вовочка ©   (2004-02-26 17:09) [4]

Решил писать транспортную задачу сам. Програ правильное решение находит(сверял в других прогах и со своими расчетами на бумажке), но она не ловит то, что решение правилное. Я так туп, что сам ничего найти не могу. Помогите, пожалуйста.
Вот код:
program transport;
uses crt;
type TMatrix  = array[1..3,1..4] of integer;
    TRow     = array[1..3] of integer;
    TCol     = array[1..4] of integer;
    TPoint   = record row,col : integer; end;
    TCells   = array [1..12] of TPoint;
procedure DebugInput(var CM : TMatrix; var A : TRow; var B : TCol);
const c : TMatrix = ( (25,10,2,30),(5,15,20,30),(100,65,2,2 ));
    al : TRow    = (10,15,20);
    bt : TCol    = (5,12,13,15);
begin
CM:=c;
a:=al;
b:=bt;
end;
procedure ZeroMatrix(var matrix : TMatrix);
var i,j : integer;
begin
for i:=1 to 3 do
for j:=1 to 4 do matrix[i][j]:=0;
end;
procedure DrawCTable(data : TMatrix; baza : TRow; predpr : TCol; Symbol : string);
var i,j,k : integer;
begin
ClrScr;
 write("Ъ");
 for i:=1 to 15 do write("Д");
 write("В");
 for i:= 17 to 70 do write("Д");
 writeln("ї");
 write("і");
 for i:=1 to 15 do write(" ");
 write("і");
 for i:= 17 to 30 do write(" ");
 write("Predprijatija");
   for i:= 44 to 70 do write(" ");
 writeln("і");
 write("Г");
 for i:=1 to 15 do write("Д");
 write("Е");
   for i:=1 to 3 do
     begin
for j:=1 to 13 do write("Д");
write("В");
     end;
 for j:=1 to 12 do write("Д");
 writeln("ґ");
 write  ("і Bases         і");
 write  ("     B1 =",predpr[1]:4,"і");
 write  ("     B2 =",predpr[2]:4,"і");
 write  ("     B3 =",predpr[3]:4,"і");
 writeln("    B4 =",predpr[4]:4,"і");
 write("Г");
 for i:=1 to 15 do write("Д");
 write("Е");
   for i:=1 to 3 do
     begin
for j:=1 to 13 do write("Д");
write("Е");
     end;
 for j:=1 to 12 do write("Д");
 writeln("ґ");
 for i:=1 to 3 do
   begin
    write("і  A",i,"=",baza[i]:2,"        і");
    write  ("    ",Symbol,i,"1 =",data[i,1]:4,"і");
    write  ("    ",Symbol,i,"2 =",data[i,2]:4,"і");
    write  ("    ",Symbol,i,"3 =",data[i,3]:4,"і");
    writeln("   ",Symbol,i,"4 =",data[i,4]:4,"і");
    if(i=3) then break;
    write("Г");
    for j:=1 to 15 do write("Д");
     write("Е");
    for j:=1 to 3 do
     begin
for k:=1 to 13 do write("Д");
write("Е");
     end;
     for j:=1 to 12 do write("Д");
     writeln("ґ");
   end;
 write("А");
    for j:=1 to 15 do write("Д");
     write("Б");
    for j:=1 to 3 do
     begin
for k:=1 to 13 do write("Д");
write("Б");
     end;
     for j:=1 to 12 do write("Д");
     writeln("Щ");

end;
procedure DataInput(var price : TMatrix; var baza : TRow; var predpr : TCol);
var i, j : integer;
begin
 for i:=1 to 3 do
 begin
 for j:=1 to 4 do
   begin
     write("C",i,j,": ");
     read(price[i,j]);
   end;
 writeln;
 end;
 for i:=1 to 3 do
   begin
     write(" Input A",i,": ");
     read(baza[i]);
   end;
 for j:=1 to 4 do
   begin
     write("Input B",j,": ");
     readln(predpr[j]);
   end;
end;
procedure  NorthWestAngle(var XMatrix : TMatrix; A : TRow; B : TCol);
var i,j : integer;
begin
i:=1; j:=1;
while(B[j]>0) do
 begin
   if(B[j]>=A[i]) then
     begin
B[j]:=B[j]-A[i];
XMatrix[i,j]:=A[i];
A[i]:=0;
inc(i);
     end
   else
     begin
A[i]:=A[i]-B[j];
XMatrix[i,j]:=B[j];
B[j]:=0;
inc(j);
     end;
 end;
end;


 
тихий вовочка ©   (2004-02-26 17:09) [5]

procedure PseudoPrice(X : TMatrix; C : TMatrix; var a : TRow;var b : TCol; var Pseudo : TMatrix);
var
i,j,step : integer;
def_b    : array[1..4] of boolean;
def_a    : array[1..3] of boolean;
begin
for i:=1 to 4 do
begin
if i<4 then def_a[i]:=false;
def_b[i]:=false;
end;
i:=3; j:=4;
while(X[i,j]=0)
 do
 begin
 dec(j);
 end;
b[j]:=0;
def_b[j]:=true;
a[i]     := C[i,j]-b[j];
def_a[i] := true;
step:=j;
for j:=step downto 1 do
if X[i,j]<>0 then
begin
b[j]:=C[i,j]-a[i];
def_b[j]:=true;
end;
while(i>1) do begin
dec(i);
for j:=1 to 4 do
if ((X[i,j]<>0)and(def_b[j])) then
begin
a[i]:=C[i,j]-b[j];
def_a[i]:=true;
break;
end;
if def_a[i] then
for j:=1 to 4 do if(X[i,j]<>0) then
begin
b[j]:=C[i,j]-a[i];
def_b[j]:=true;
end;
end;
writeln;
for i:=1 to 3 do
for j:=1 to 4 do
begin
Pseudo[i,j]:=a[i]+b[j];
end;
end;
procedure ShowMatrix(XMatrix : TMatrix; comment : string);
var row : integer;
begin
for row:=1 to 3 do
Writeln("  і",XMatrix[row,1]:3,XMatrix[row,2]:3,XMatrix[row,3]:3,XMatrix[row,4]:3,"і");
end;
function TotalSum(XMatrix : TMatrix; CMatrix : TMatrix) : integer;
var i,j : integer;
   Sum : integer;
begin
Sum:=0;
for i:=1 to 3 do
for j:=1 to 4 do Sum:=Sum+CMatrix[i,j]*XMatrix[i,j];
TotalSum:=Sum;
end;
function IsOptimal(C : TMatrix; PseudoPrice : TMatrix) : boolean;
var i,j : integer;
result : boolean;
begin
result:=true;
for i:=1 to 3 do
for j:=1 to 4 do
 if PseudoPrice[i,j]>C[i,j] then result:=false;
IsOptimal:=result;
end;
procedure GetNonOptimalCells(C:TMatrix;PseudoPrice:TMatrix;var NOptCells:TCells;var count:integer);
var i,j : integer;
begin
count:=0;
for i:=1 to 3 do
for j:=1 to 3 do
 if  PseudoPrice[i,j]>C[i,j] then
 begin
 inc(count);
 NOptCells[count].row:=i;
 NOptCells[count].col:=j;
 end;
end;
procedure GetCycleCell(XM : TMatrix; Price : TMatrix; var r : integer; var c : integer);
var i,j : integer;
max : integer;
begin
max:=-200;
for i:=1 to 3 do
for j:=1 to 4 do if ((XM[i,j]=0)and(Price[i,j]>max))
    then
      begin
      r:=i;
      c:=j;
      max:=Price[i,j];
      end;
end;
procedure Optimize(var XM : TMatrix; r : integer; c : integer);
var
i,j   : integer;
min   : integer;
ctype : integer;
mn    : integer;
begin
if(r-1>0)AND(c-1>0) then
    if(XM[r-1,c-1]<>0)AND(XM[r-1,c]<>0)AND(XM[r,c-1]<>0) then
       begin i:=r-1; j:=c-1; ctype:=1; end;

if(r+1<4)AND(c-1>0) then
    if(XM[r,c-1]<>0)AND(XM[r+1,c-1]<>0)AND(XM[r+1,c]<>0) then
       begin i:=r; j:=c-1;ctype:=2; end;
if(r-1>0)AND(c+1<5) then
    if(XM[r-1,c]<>0)AND(XM[r-1,c+1]<>0)AND(XM[r,c+1]<>0) then
       begin i:=r-1; j:=c;ctype:=3; end;
if(r+1<4)AND(c+1<5) then
    if(XM[r,c+1]<>0)AND(XM[r+1,c]<>0)AND(XM[r+1,c+1]<>0) then
       begin i:=r; j:=c;ctype:=4; end;
case ctype of
1,4 : begin
     if XM[i+1,j]>XM[i,j+1] then min:=XM[i,j+1] else min:=XM[i+1,j];
     mn:=1;
   end;
2,3 : begin
     if XM[i,j]>XM[i+1,j+1] then min:=XM[i+1,j+1] else min:=XM[i,j];
     mn:=-1;
   end;
end;
     XM[i,j]:=XM[i,j]+min*mn;
     XM[i,j+1]:=XM[i,j+1]-min*mn;
     XM[i+1,j]:=XM[i+1,j]-min*mn;
     XM[i+1,j+1]:=XM[i+1,j+1]+min*mn;
end;
var C       :  TMatrix;
   X       :  TMatrix;
   PsPrice :  TMatrix;
   Zapas   :  TRow;
   Zajavka :  TCol;
   Alpha   :  TRow;
   Beta    :  TCol;
   row,col :  integer;
   res     :  boolean;
   count   :  integer;
   ncells  :  TCells;
BEGIN
ZeroMatrix(C);
ZeroMatrix(X);
ZeroMatrix(PsPrice);
ClrScr;
Writeln("Transportnaja zadacha");

{DataInput(C,Zapas,Zajavka);}  (* Manual values input *)
DebugInput(C,Zapas,Zajavka);   (*Programme will input values automatically*)
DrawCTable(C,Zapas,Zajavka,"C");
Writeln("Press any key...");
readln;
Writeln;
Writeln("Opornaja tablica");
NorthWestAngle(X,Zapas,Zajavka);
ShowMatrix(X,"X=");
writeln("Stoimost");
Writeln("T(X)=",TotalSum(X,C));
PseudoPrice(X,C,Alpha,Beta,PsPrice);
res:=IsOptimal(C,PsPrice);
if not res then writeln("Plan ne optimalen! Press any key to continue...");
while not res do
begin

GetNonOptimalCells(C,PsPrice,ncells,count);
if count=1 then
 begin
   row:=ncells[1].row;
   col:=ncells[1].col;
 end
else
 begin
   GetCycleCell(X,PsPrice,row,col);
 end;
Optimize(X,row,col);
Writeln("Sledujustchaja tablica");
ShowMatrix(X,"X=");
Writeln("Stoimost");
Writeln("T(X)=",TotalSum(X,C));
PseudoPrice(X,C,Alpha,Beta,PsPrice);
res:=IsOptimal(C,PsPrice);
if not res then writeln("Plan ne optimalen! Press any key to continue...");
readln;
{res:=true; {        DEBUG!!!!!!!!       }
end;
writeln("Plan  optimalen!");
Readln;
END.


 
icWasya ©   (2004-02-26 18:49) [6]

в процедуре Optimize
идут четыре if .. если ни один не выполнится, то чему равен ctype, i, j??.


 
тихий вовочка ©   (2004-02-26 22:23) [7]

Так устроена задача, что один обязательно выполнится. Но ошибка не в этом. У меня не срабатывает подсчет псевдостоимостей. Дебаггером смотрел, все идет как надо, но когда достигается правильное решение при формировании таблицы псевдостоимостей расчет идет вкривь и вкось(хотя матрица груза X в порядке, а матрица стоимостей неизменна с самого начала)


 
Burmistroff   (2004-02-27 00:13) [8]

Нашел у себя какой-то симплесный метод http://mc.webm.ru/5/simplexx.rar


 
тихий вовочка ©   (2004-02-27 07:12) [9]

Спасибо. Но я уже САМ! САМ сделал. и ошибку нашел свою.



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.035 c
3-1077126980
Karlson
2004-02-18 20:56
2004.03.28
Построчный select


7-1072354620
Карелин Артем
2003-12-25 15:17
2004.03.28
Как на 1 COM - порту заставить работать 2 девайса?


7-1073845084
MagaSoft
2004-01-11 21:18
2004.03.28
Работа с прокси!


8-1068309751
g-l-u-k
2003-11-08 19:42
2004.03.28
TActiveMovie


3-1078054159
ser_ega
2004-02-29 14:29
2004.03.28
DbGrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский