Effacer les filtres
Effacer les filtres

Hi everyone! I need to get a script for transportation problem (balanced).

1 vue (au cours des 30 derniers jours)
POLLY
POLLY le 6 Nov 2016
I need to write a program
function [x,cost]=transport(s,d,c);
% [x,cost]=transport(s,d,c)
% Input:
% s = supplies (m*1)
% d = demands (n*1)
% c = costs (m*n)
% Output
% x = optimal solution (m*n)
% cost = minimal transport cost
....
I already have this part:
function [x,b]=northwest(s,d)
% [x,b]=northwest(s,d)
% x: shipments using nw-rule (m*n)
% b: 1 for each basic variables 0 for nonbasic (m*n)
% s: supplies (m*1)
% d: demands (n*1)
if (sum(s)~=sum(d)),
disp('ERROR: The total supply is not equal to the total demand.');
return;
end
m=length(s);
n=length(d);
i=1;
j=1;
x=zeros(m,n);
b=zeros(m,n);
while ((i<=m) & (j<=n))
if s(i)<d(j)
x(i,j)=s(i);
b(i,j)=1;
d(j)=d(j)-s(i);
i=i+1;
else
x(i,j)=d(j);
b(i,j)=1;
s(i)=s(i)-d(j);
j=j+1;
end
end
function [u,v]=multipliers(x,c,b)
% [u,v]=multipliers(x,c,b)
% x: current solution (m*n)
% b: 1 for each basic variables 0 for nonbasic (m*n)
% c: costs (m*n)
% u: lagrange multipliers for rows (m*1)
% v: lagrange multipliers for columns (n*1)
[m,n]=size(x);
if sum(sum(b))< m+n-1
disp('Error in multipliers')
break
else
u=Inf*ones(m,1);
v=Inf*ones(n,1);
u(1)=0; % choose an arbitrary multiplier = 0
nr=1;
while nr<m+n % until all multipliers are assigned
for row=1:m
for col=1:n
if b(row,col)>0
if (u(row)~=Inf) & (v(col)==Inf)
v(col)=c(row,col)-u(row);
nr=nr+1;
elseif (u(row)==Inf) & (v(col)~=Inf)
u(row)=c(row,col)-v(col);
nr=nr+1;
end
end
end
end
end
end
function [y,bout]=cycle(x,row,col,b)
% [y,bout]=cycle(x,row,col)
% x: current solution (m*n)
% b: entering basic variables (m*n)
% row,col: index for element entering basis
% y: solution after cycle of change (m*n)
% bout: new basic variables after cycle of change (m*n)
bout=b;
y=x;
[m,n]=size(x);
loop=[row col]; % describes the cycle of change
x(row,col)=Inf; % do not include (row,col) in the search
b(row,col)=Inf;
rowsearch=1; % start searching in the same row
while (loop(1,1)~=row | loop(1,2)~=col | length(loop)==2),
if rowsearch, % search in row
j=1;
while rowsearch
if (b(loop(1,1),j)~=0) & (j~=loop(1,2))
loop=[loop(1,1) j ;loop]; % add indices of found element to loop
rowsearch=0; % start searching in columns
elseif j==n, % no interesting element in this row
b(loop(1,1),loop(1,2))=0;
loop=loop(2:length(loop),:); % backtrack
rowsearch=0;
else
j=j+1;
end
end
else % column search
i=1;
while ~rowsearch
if (b(i,loop(1,2))~=0) & (i~=loop(1,1))
loop=[i loop(1,2) ; loop];
rowsearch=1;
elseif i==m
b(loop(1,1),loop(1,2))=0;
loop=loop(2:length(loop),:);
rowsearch=1;
else
i=i+1;
end
end
end
end
% compute maximal loop shipment
l=length(loop);
theta=Inf;
minindex=Inf;
for i=2:2:l
if x(loop(i,1),loop(i,2))<theta,
theta=x(loop(i,1),loop(i,2));
minindex=i;
end;
end
% compute new transport matrix
y(row,col)=theta;
for i=2:l-1
y(loop(i,1),loop(i,2))=y(loop(i,1),loop(i,2))+(-1)^(i-1)*theta;
end
bout(row,col)=1;
bout(loop(minindex,1),loop(minindex,2))=0;
Thank you!
  1 commentaire
Walter Roberson
Walter Roberson le 6 Nov 2016
It is not clear how your problem relates to the functions you have already created?

Connectez-vous pour commenter.

Réponses (0)

Catégories

En savoir plus sur Programming dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by