Диплом (1222543), страница 11
Текст из файла (страница 11)
44 Викторова А.Н. Технико-экономическое обоснование дипломных проектов научно-исследовательского профиля: метод. указания / А.Н. Викторова. – Самара: Изд-во Самар. гос. аэрокосм. ун-та, 2012. – 36 с.
45 Куренкова В.П. Технико-экономическое обоснование создания автоматизированных систем и программных продуктов: метод. указания / В.П. Куренкова. – Самара: Изд-во СГАУ, 2006. – 48 с.
ПРИЛОЖЕНИЕ А
(рекомендуемое)
Текст программы модели поиска оптимального расположения
обогатительной фабрики в математическом пакете MATLAB R2013b
% Задание необходимых для расчета переменных
P=0; % рентабельность ОФ
%коэффициент потерь полезного компонента
Kp=[]; %хранит в себе список коэффициентов потерь полезного компонента
C=[]; %хранит в себе список значений содержания полезного компонента
Dnpk=0; %хранит в себе список значений количества добытого полезного ископаемого
Dna=0; % суммарное количество добытого минерального сырья
Gp=[]; %хранит в себе список значений стоимости грамма полезного компонента
Csum=0; %суммарная стоимость добытого минерального сырья
Ztrm=0; % суммарные затраты на добычу полезных компонентов
Ztrmi=[]; %хранит в себе список значений затрат на добычу компонента
sumL=0; %хранит в себе список значений пробега всех машин на месторождениях
BaseP=0; %хранит в себе список точек, граничащих с недоступными участками
L=[]; %список значений расстояний от месторождения до ОФ
z=1;
count=0; % число контрольных точек в ходе расчета маршрута
DistM=[]; %хранит в себе значения длин проложенного маршрута на каждой контрольной точке
%расчет числа месторождений по исходной матрице
for i=1:Lx(2,1)
for j=1:Lx(2,1)
if (SMesh(i,j)==4)
Source(1,z)=i;
Source(2,z)=j;
z=z+1;
end
end
end
Nsource=z-1;
bnum=0; %счетчик
%поиск точек, граничащих с углами недоступных участков для расчета маршрута
for i=1:Lx(2,1)
for j=1:Lx(2,1)
zer=0;
zer2=0;
for q=-1:1:1
for w=-1:1:1
if(i+q>0) && (j+w>0) &&(i+q<Lx(2,1)) &&(j+w<Lx(2,1))
if(SMesh(i+q,j+w)==0)
zer=zer+1;
cord1=i+q;
cord2=j+w;
end
end
end
end
if (zer==1)
for q=-1:1:1
for w=-1:1:1
if(cord1+q>0) && (cord2+w>0) &&(cord1+q<Lx(2,1)) &&(cord2+w<Lx(2,1))
if(SMesh(cord1+q,cord2+w)==0)
zer2=zer2+1;
end
end
end
end
if(zer2<=4)
bnum=bnum+1;
BaseP(1,bnum)=i;
BaseP(2,bnum)=j;
BaseP(3,bnum)=0;
end
end
end
end
%расчет стоимости по приведенным формулам
for i=1:Nsource
Dat=['Data',num2str(i)];
for j=1:size(Data1,1)
dat1=eval([Dat '(j,1)']);
%преобразование данных массива
dat2=eval([Dat '(j,2)']);
dat3=eval([Dat '(j,3)']);
dat4=eval([Dat '(j,4)']);
Dn=Qgm(i)*(1-dat2)*dat1*Kisp;
%расчет количества добытого полезного компонента
Ztrm=Ztrm+dat4*Dn;
%расчет суммы затрат на добычу минерального сырья
Dnpk=Dn*dat3;
%расчет стоимости добытого минерального сырья
Dna=Dna+Dn;
Csum=Csum+Dnpk; %суммарная стоимость добытого минерального сырья
end
end
%реализация основного алгоритма поиска оптимального расположения
%обогатительной фабрики
dx=Lx(1,1)/Lx(2,1);
Krit=-1000;Krit2=500;XX=0;YY=0; %критерий выборки
h = waitbar(0,'Идет расчет, ожидайте...');
%процент выполнения задачи
for X=1:Lx(2,1)
for Y=1:Lx(2,1)
% disp((X*Nx+Y)/(Nx*Ny)*100);
if(SMesh(X,Y)~=0)&& (SMesh(X,Y)~=4)
waitbar((X*(Lx(2,1)-1)+Y)/(Lx(2,1)*Lx(2,1)));
L=[];
for i=1:Lx(2,1)
for j=1:Lx(2,1)
Mesh(i,j)=SMesh(i,j);
%запись исходной матрицы в рабочую матрицу
end
end
for i=1:length(BaseP)
BaseP(3,i)=0;
end
for q=1:size(Source, 2)
for i=1:Lx(2,1)
for j=1:Lx(2,1)
Mesh(i,j)=SMesh(i,j);
%запись исходной матрицы в рабочую матрицу
end
end
for i=1:length(BaseP)
BaseP(3,i)=0;
end
Mesh(X,Y)=3; % ОФ помечается как 3
Mesh2=[];
Point=[Source(1,q),Source(2,q)];
%координаты текущего положения
Point2=[Point(1,1),Point(1,2)];
% координаты предыдущего положения
CPX=Source(1,q);
%для хранения последней контрольной точки
CPY=Source(2,q);
LngN=0; %счетчик расчета
LngN2=0;
CC=0;
distmid=0; %промежуточное значение дистанции
min_l=999;
zer=0; %счетчик
Cond=0; %условие выполнения цикла
dist=0; %длина маршрута от месторождения до ОФ
cnd=1; %триггер условий
sq=sqrt(dx); %константа корень из двух
count=0;
DistM=[];
CtrP=0;
%алгоритм поиска маршрута от месторождения до обогатительной
%фабрики
if (Point(1,1)==X)&&(Point(1,2)==Y)
Cond=1;
end
while Cond~=1
CC=CC+1;
NoP=0;
min_l=999;
for i=-1:1:1
for j=-1:1:1
LngN=LngN+1;
Lngi=sqrt(((Point(1,1)+i)-X)^2+((Point(1,2)+j)-Y)^2);
Lngi2=sqrt(((Point(1,1)+i)-Point2(1,1))^2+((Point(1,2)+j)-Point2(1,2))^2);
Lng(1,LngN)=Lngi;
Lng(4,LngN)=Lngi2;
if(Point(1,1)+i<=Lx(2,1))&&(Point(1,2)+j<=Lx(2,1))&&(Point(1,1)+i>0)&&(Point(1,2)+j>0)
Lng(2,LngN)=Point(1,1)+i;
Lng(3,LngN)=Point(1,2)+j;
end
end
end
Point2=[Point(1,1),Point(1,2)];
LngN=0;
DistX=Point(1,1);
%для вычисления расстояния между узлами
DistY=Point(1,2);
Px=Point(1,1);Py=Point(1,2);
%для проверки успешности проложения маршрута
if(cnd==1)
%выполнение простого продвижения к цели
for k=1:length(Lng)
if (Mesh(Lng(2,k),Lng(3,k))~=0)
if (Mesh(Lng(2,k),Lng(3,k))~=2)
if(CC==1)
if (min_l>Lng(1,k))
Point=[Lng(2,k),Lng(3,k)];
min_l=Lng(1,k);
end
else
if(Lng(4,k)>=2)
if (min_l>Lng(1,k))
Point=[Lng(2,k),Lng(3,k)];
min_l=Lng(1,k);
end
end
end
end
end
end
Mesh(Point(1,1),Point(1,2))=2;
if(Point(1,1)~=DistX) && (Point(1,2)~=DistY)
dist=dist+dx*sq;
else
dist=dist+dx;
end
end
if(Point(1,1)==Px)&&(Point(1,2)==Py)
%провал простого продвижения к маршруту
cnd=0;
end
if (cnd==0) % поиск наилучшей граничной точки
distI=999;
for i=1:length(BaseP)
if(SMesh(BaseP(1,i),BaseP(2,i))~=4)
if(BaseP(3,i)~=1)
if (BaseP(3,i)~=2)
if (BaseP(3,i)~=3)
distI2=sqrt((X-BaseP(1,i))^2+(Y-BaseP(2,i))^2);
if(distI>distI2)
distI=distI2;
Xi=BaseP(1,i);
Yi=BaseP(2,i);
end
end
end
end
end
end
for i=1:length(BaseP)
if(BaseP(1,i)==Xi) && (BaseP(2,i)==Yi)
BaseP(3,i)=1;
end
end
cnd=2;
for i=1:Lx(2,1)
for j=1:Lx(2,1)
Mesh(i,j)=SMesh(i,j);
%запись исходной матрицы в рабочую матрицу
end
end
for i=1:size(Mesh2,1)
for j=1:size(Mesh2,2)
if(Mesh2(i,j)==2)
Mesh(i,j)=Mesh2(i,j);
end
end
end
dist=distmid;
Point=[CPX,CPY];
for i=1:length(BaseP)
if(BaseP(3,i)==0)
NoP=1;
%проверка использованности всех приграничных точек
end
end
if(NoP==0)
% откат к предыдущей контрольной точке
count=count-1;
dist=DistM(count);
Dat=['KMesh',num2str(count)];
Mesh=eval([Dat]);
Mesh2=eval([Dat]);
for i=1:length(BaseP)
if(BaseP(3,i)==1)
BaseP(3,i)=0;
end
end
for i=1:length(BaseP)
if(BaseP(1,i)==CPX) &&(BaseP(2,i)==CPY)
BaseP(3,i)=3;
end
end
CPX=CtrP(1,count);
CPY=CtrP(2,count);
Point=[CPX,CPY];
end
end
if (cnd==2)
%продвижение к наилучшей граничной точке
min_l=999;
while cnd==2
for i=-1:1:1
for j=-1:1:1
LngN=LngN+1;
Lngi=sqrt(((Point(1,1)+i)-Xi)^2+((Point(1,2)+j)-Yi)^2);
Lngi2=sqrt(((Point(1,1)+i)-Point2(1,1))^2+((Point(1,2)+j)-Point2(1,2))^2);
Lng(1,LngN)=Lngi;
Lng(4,LngN)=Lngi2;
if(Point(1,1)+i<=Lx(2,1))&&(Point(1,2)+j<=Lx(2,1))&&(Point(1,1)+i>0)&&(Point(1,2)+j>0)
Lng(2,LngN)=Point(1,1)+i;
Lng(3,LngN)=Point(1,2)+j;
end
end
end
Point2=[Point(1,1),Point(1,2)];
LngN=0;
DistX=Point(1,1);
%для вычисления расстояния между узлами
DistY=Point(1,2);
Px=Point(1,1);Py=Point(1,2);
%для проверки успешности проложения маршрута
for k=1:length(Lng)
if (Mesh(Lng(2,k),Lng(3,k))~=0)
if (Mesh(Lng(2,k),Lng(3,k))~=2)
if (min_l>Lng(1,k))
Point=[Lng(2,k),Lng(3,k)];
min_l=Lng(1,k);
end
end
end
end
Mesh(Point(1,1),Point(1,2))=2;
if(Point(1,1)~=DistX) && (Point(1,2)~=DistY)
dist=dist+dx*sq;
else
dist=dist+dx;
end
if (Point(1,1)==Xi)&&(Point(1,2)==Yi)
for i=1:length(BaseP)
if(BaseP(1,i)==Xi) &&(BaseP(2,i)==Yi)
BaseP(3,i)=2;
end
end
cnd=1;
CC=0;
distmid=dist;
min_l=sqrt(((Point(1,1))-X)^2+((Point(1,2))-Y)^2);
CPX=Point(1,1);
CPY=Point(1,2);
DistM=[DistM,dist];
count=count+1;
CtrP(1,count)=CPX;
CtrP(2,count)=CPY;
Dat=['KMesh',num2str(count)];
eval([Dat '=Mesh;']);
for i=1:Lx(2,1)
for j=1:Lx(2,1)
if(Mesh(i,j)==2)
Mesh2(i,j)=2;
end
end
end
for i=1:length(BaseP)
if(BaseP(3,i)==1)
BaseP(3,i)=0;
end
end
cnd=0;
Point=[Source(1,q),Source(2,q)];
Mesh=SMesh;
dist=0;
min_l=999;
while cnd==0
for i=-1:1:1
for j=-1:1:1
LngN=LngN+1;
Lngi=sqrt(((Point(1,1)+i)-Xi)^2+((Point(1,2)+j)-Yi)^2);
Lngi2=sqrt(((Point(1,1)+i)-Point2(1,1))^2+((Point(1,2)+j)-Point2(1,2))^2);
Lng(1,LngN)=Lngi;
Lng(4,LngN)=Lngi2;
if(Point(1,1)+i<=Lx(2,1))&&(Point(1,2)+j<=Lx(2,1))&&(Point(1,1)+i>0)&&(Point(1,2)+j>0)
Lng(2,LngN)=Point(1,1)+i;
Lng(3,LngN)=Point(1,2)+j;
end
end
end
Point2=[Point(1,1),Point(1,2)];
LngN=0;
DistX=Point(1,1);
%для вычисления расстояния между узлами
DistY=Point(1,2);
Px=Point(1,1);Py=Point(1,2);
%для проверки успешности проложения маршрута
for k=1:length(Lng)
if (Mesh(Lng(2,k),Lng(3,k))~=0)
if (Mesh(Lng(2,k),Lng(3,k))~=2)
if (min_l>Lng(1,k))
Point=[Lng(2,k),Lng(3,k)];
min_l=Lng(1,k);
end
end
end
end
Mesh(Point(1,1),Point(1,2))=2;
if(Point(1,1)~=DistX) && (Point(1,2)~=DistY)
dist=dist+dx*sq;
else
dist=dist+dx;
end
if (Point(1,1)==Xi)&&(Point(1,2)==Yi)
cnd=1;
count=1;
Dat=['KMesh',num2str(count)];
eval([Dat '=Mesh;']);
distmid=dist;
DistM=dist;
CtrP=0;
CtrP(1,count)=CPX;
CtrP(2,count)=CPY;
Mesh2=Mesh;
end
if(Point(1,1)==Px)&&(Point(1,2)==Py)
cnd=1;
Dat=['KMesh',num2str(count)];
Mesh=eval([Dat]);
dist=distmid;
Point=[CPX,CPY];
end
end
end
if(Point(1,1)==Px)&&(Point(1,2)==Py)
%провал простого продвижения к маршруту
cnd=0;
end
end
end
if (Point(1,1)==X)&&(Point(1,2)==Y)
Cond=1;
end
end
L=[L, dist]; %расстояние от месторождения до ОФ
end
sumL=0;
%расчет рентабельности обогатительной фабрики в выбранном участке местности
for i1=1:Nsource
Tp(i1)=Va/Qexs+L(i1)/Vgr+L(i1)/Vpor+3/60; %продолжительность рейса
Qcmav(i1)=Qs*ceil(Tcm/Tp(i1)); %сменная производительность автосамосвала
Ncm(i1)=ceil(Qgm(i1)/(Qexs*Kisx*Tcm)); %количество смен на весь срок отработки
Navt(i1)=ceil(Qgm(i1)/(Ncm(i1)*Qcmav(i1)*Kras/gamma));
% количество автосамосвалов
Nreis(i1)=ceil(Tcm/Tp(i1));
% количество рейсов в смену
suml(i1)=L(i1)*Nreis(i1)*Navt(i1)*Ncm(i1);
% пробег всех машин на i-ом месторождении за год
sumL=sumL+suml(i1);
end
Ztrfd=sum(Qgm)*Ztrd*0.001*sumL;
%расчет затрат на доставку минерального сырья на ОФ
P=(Csum-Ztrfd-Ztrm-Nim)*0.8/(Ztrfd+Ztrm)*100;
Profit(X,Y)=P;
if P>Krit
Krit=P;
XX=X;YY=Y;
end
if (Krit2>P)
Krit2=P;
end;
end
end















