شبیه‌سازی شبکه‌های بی سیم و کامپیوتری
شبیه سازی تخصصی شبکه‌های بی سیم و کامپیوتری مقاطع کارشناسی تا دکترا
  • شبیه سازی تخصصی شبکه‌های بی سیم و کامپیوتری مقاطع کارشناسی تا دکترا

مشخصات بلاگ
شبیه‌سازی شبکه‌های بی سیم و کامپیوتری

امکان سفارش، شبیه سازی مقاله و پایان نامه وجود دارد،
مطالب، با ذکر منبع قابل انتشار در سایت ها و وبلاگ ها و.. می باشد.
جهت دریافت مشاوره رایگان تماس بگیرید:

شماره تماس: 09147082079-0098
آیدی تلگرامی:https://t.me/MuosSA_NbO
جی میل :mo30no@gmail.com

تمامی کدهای این وبلاگ در حال حاضر به زبان متلب می باشد

«آنچه می‌دانیم ناچیز و آنچه نمی‌دانیم عظیم و وسیع است»
$$پیر سیمون لاپلاس$$

۵ مطلب در دی ۱۳۹۸ ثبت شده است

سه شنبه, ۱۷ دی ۱۳۹۸، ۱۲:۲۰ ب.ظ

نحوه نوشتن یک تابع فیتنس(making a fitness function )

برداشت کلی این است که نوشتن یک تابع فیتنس عموما با الگوریتم‌های فراابتکاری معنی پیدا می‌کند، با این وجود یک تابع فیتنس چیزی نیست جز انتخاب جواب های بهینه از بین مجموعه‌هایی که به شکل تصادفی، حریصانه... انتخاب می‌شوند. تابع فیتنس می‌تواند از نوع مینیمم، ماکزیمم یا همگرا به سمت مقادیر یا بردارها و... باشد.

به عنوان یک مثال ساده برای تابع فیتنس برای ماکزیمم سازی  را  می‌توان به شکل زیر اورد.

 فقط حواستون باشه، برای نوشتن تابع فیتنس برای مینیمم سازی باید مقدار اولیه بردار پاسخ را برابر بی نهایت یا inf قرار بدید و برای ماکزیمم سازی این مقدار را برابر با 0 یا حداقل مقدار قرار بدید.

 

clc
clear;
close all;


[X,Y,Z] = peaks(100);
[val,ind]=min(Z(:));
v.val=val;
v.ind=ind;
cn=0;
hs=figure('name' ,  ['period: '  num2str(cn) ' of '  num2str((length(X(:))) )   ' curen  value:  '  num2str(v.val(end)),  ' real max value:  '  num2str( max(Z(:)))] );
 subplot(1,2,1);surf(X,Y,Z);hold on
 subplot(1,2,1);plot3(X(ind),Y(ind),Z(ind),'r*');hold on

while(true)
     ind= randi(length(X(:)),1);
     if  v.val(end)<Z(ind)
      v.val(end+1)=Z(ind);

          v.ind(end+1)= ind ;
 subplot(1,2,1);plot3(X(v.ind),Y(v.ind),Z(v.ind),'r*');hold on ; 
  subplot(1,2,2);plot3(X(v.ind),Y(v.ind),Z(v.ind),'r-*');hold on
  

     else
    disp('');
     end
      cn=cn+1;
 

     
 
     pause(0.002)

    if cn>=length(X(:)) || v.val(end)==max(Z(:))
           break;
    end
     hs.Name=['period: '  num2str(cn) ' of '  num2str((length(X(:))) )   ' curen  value:  '  num2str(v.val(end)),  ' real max value:  '  num2str( max(Z(:)))];
end

 

خروجی کد بالا به شکل زیر خواهد بود:

 

 

 

۰ نظر موافقین ۰ مخالفین ۰ ۱۷ دی ۹۸ ، ۱۲:۲۰
موسی حسن زاده

اغلب نواحی که برای شبیه سازی شبکه‌‌های بی‌سیم مورد استفاده قرار می‌گیرند، نواحی متقارن و عموما مربعی شکل می‌باشند ، حال آنکه به شکل طبیعی امکان توزیع متقارن نودها وجود نداره، در این پست سعی کردیم که کد توزیع نودها در فضاهای غیرمتقارن را منتشر کنیم، امیدواریم که براتون مفید واقع شده باشه.

در توزیع نودها از روش انتشار نقاط منحنی استفاده شده است.

کد متلب برای توضیحات بالا

%%%%%%%%%%%%%%%%%%%%%%%%%%-----------software details-----------%%%%%%%%%%%%%%%%%%%%%%
%devloped in Iran(ardebil)                                       
%Copyright (C) 2020(1398) by moussa hasanzadeh as the head devloper %%
%All rights reserved.                                            
%programed in mathlab 2016                                 
%gmail:mo30no@gmail.com
%phone 09147082079

%% clear commands
delete(allchild(0));% delete all figures and graphical objects
clear;% Remove items from workspace, freeing up system memory
clc;% clear the Console

%% path commands
file=matlab.desktop.editor.getActive;% get current script address
try % if dont occur any error this block will run
      fileDetail=dir(file.Filename);% get current script details
      folderName=fileDetail.folder;% get current script folder name
catch% else if an  error occurs then
      index=strfind( file.Filename,'\');% find index of back space(\) in path text
      folderName=file.Filename(1:index(end)-1);% select all path text from 1 to last Occurrence of \ as script folder name
end
paths=genpath(folderName);% make current path and all sub paths
addpath(paths);% add all paths in known paths of matlab
cd(folderName);% go to path that current script runned from that


%% net building  commands
net=[];% create an empty var as net object
net.para.width=1000;% width param of net
net.para.length=1000;% width param of net
net.para.height=5;% width param of net
net.para.side=6;% side of Polygon
net.para.nodNum=1000 ;% number of nodes of net work
net.para.simPer=1000;% number of simulation period
net.para.sInd=0;%period counter



 
ph=pi/net.para.side;% used for shifting of area to be Attractive!
t=linspace(0,1,net.para.side+1);% Generate linearly spaced vector( used for making polygon)
x1=sin(2*pi*t+ph); x1=(((x1-min(x1))/(max(x1)-min(x1)))-0.5)* net.para.length;% x coordinate of area(after normalising)
y1=-cos(2*pi*t+ph);y1=(((y1-min(y1))/(max(y1)-min(y1)))-0.5)*net.para.width;% y coordinate of area(after normalising)


  [x1,y1]=divider(x1,y1,10,1);% adding points between each pair of vertices

rs1=randsample(normalVect(rand(1,length(x1)),1,.5),length(x1));
figure;
x1=x1.*rs1;
y1=y1.*rs1;
[x1,y1]=divider(x1,y1,500);% adding points between each pair of vertices
x1(end+1)=x1(1);
y1(end+1)=y1(1);

plot(x1,y1,'r');hold on
rs=sqrt(randsample(normalVect(rand(1,length(x1)),.0,1),length(x1)));

plot(x1.*rs,y1.*rs,'.')






% give a vector or matrix for normalizing between tow number or 0 and 1
% vect=normalVect([1,-2,4,1,11,4,5])
% vect=normalVect([1,-2,4,1,11,4,5],-2,1)
% vect=normalVect([1,-2,4;11,4,5])

function vect=normalVect(varargin)
if nargin==0
    msgbox('give a 1 argoment atleast');
    vect=[];
elseif ~isnumeric(varargin{1})
    msgbox('abnormal argoment');
    vect=[];
else
   vect=varargin{1}; 
if nargin==1
    vect=(vect-min(vect(:)))./(max(vect(:))-min(vect(:)));
elseif nargin==3 ||  nargin>3
    if varargin{2}~=varargin{3}
        vect=(vect-min(vect(:)))./(max(vect(:))-min(vect(:)));
        vMin=min([varargin{2},varargin{3}]);
        vMax=max([varargin{2},varargin{3}]);
        vDif=vMax-vMin;
        vect=(vect*vDif)+vMin;
        if nargin>3
            msgbox('we used 3 argoment only');
        end
    else
        vect=(vect-min(vect(:)))./(max(vect(:))-min(vect(:)));
        msgbox('abnormal limits: normaled 0: 1');
    end
end

end
end





%version 1.1
%isFair=1 adding points is based on distance isFair=2 adding of points based on edges
function   [X,Y]=divider(X,Y,n,isFair)



try
    if isFair==1
    else
        isFair=0 ;
    end
catch
    
isFair=0;
end
switch isFair
    case 0
T1=0;
T2=0;

for i=1:length(X)-1
    temp1=0;
    temp1=linspace(X(i),X(i+1),n+2)  ;
    
    T1=[T1,temp1(1:end-1)];
end
T1=[T1,temp1(end)];
X=T1(2:end);


for i=1:length(Y)-1
    temp2=0;
    temp2=linspace(Y(i),Y(i+1),n+2)  ;
    
    T2=[T2,temp2(1:end-1)];
end
T2=[T2,temp2(end)];
Y=T2(2:end);
    case 1

dists= sqrt( (X(2:end)-X(1:end-1)).^2 + (Y(2:end)-Y(1:end-1)).^2) ;


n1=round((dists./min(dists))*n);
T1=0;
T2=0;

for i=1:length(X)-1
  
    temp1=0;
    temp1=linspace(X(i),X(i+1),n1(i)+2)  ;
    
    T1=[T1,temp1(1:end-1)];
end
T1=[T1,temp1(end)];
X=T1(2:end);


for i=1:length(Y)-1
    temp2=0;
    temp2=linspace(Y(i),Y(i+1),n1(i)+2)  ;
    
    T2=[T2,temp2(1:end-1)];
end
T2=[T2,temp2(end)];
Y=T2(2:end);
end


end

نمونه خروجی برای کد بالا(Output sample for the above code):

 

 

۰ نظر موافقین ۰ مخالفین ۰ ۰۷ دی ۹۸ ، ۱۷:۰۳
موسی حسن زاده

برای اینکه مشخص شود که نقطه‌ای در زاویه دید یک نقطه مرجع دیگر با زاویه مشخص شده با دو خط قرار دارد یا نه، کافی که مختصات نقطه هدف و انتهای دو خط را مشخص  کرده و پس از انتقال مبداء به نقطه مرجع  و تبدیل آن‌ها به مختصات قطبی در 360 درجه، مقادیر قطبی انتهای دو خط با مقادیر نقطه هدف مقایسه شود.

 

 کد متلب کل عملیات فوق در زیر:(the related matlab code for this operation)

function fg=IsPointInsideAngle(basePoint,leftPoint,rightPoint,quPoint )

Px=basePoint.x;
Py=basePoint.y;


Ax=leftPoint.x;
Ay=leftPoint.y;

 Cx=rightPoint.x;
Cy=rightPoint.y;


 Dx=quPoint.x;
Dy=quPoint.y;
 

% transformed Ax and Cx
tAx= Ax-Px;
tAy= Ay-Py;

tCx= Cx-Px;
tCy= Cy-Py;

tDx= Dx-Px;
tDy= Dy-Py;


[tAtet,tArho]=cart2pol(tAx,tAy);tAtet=Angle2pol_To_1pol(tAtet,1);
[tCtet,tCrho]=cart2pol(tCx,tCy);  tCtet=Angle2pol_To_1pol(tCtet,1);
[tDtet,tDrho]=cart2pol(tDx,tDy); tDtet=Angle2pol_To_1pol(tDtet,1);

fg=isItBetweenAng(tAtet,tDtet,tCtet);

 
figure;plot([Px, Ax],[Py, Ay],'c');hold on;plot([Px,  Cx],[Py,  Cy],'c');hold on;plot( Dx, Dy,'rO'); 
 switch fg
 
       case 1
             title( 'it is in angle point'  )
       case 0
             title('it is  not in angle point')
 end

end



function  fg=isItBetweenAng(num1,quNum,num2)



fg=0;
[val,~]=sort([num1,num2],'ascend');

if (num1<=pi  && num2<=pi  ) || (num1 >=pi  && num2>=pi  )
      if  quNum>=val(1) && quNum<=val(2)
            fg=1;
      end
else
      
if val(2)-val(1)>pi
  if  (quNum<=val(1) && quNum>=0 ) ||   (quNum>=val(2) && quNum<=val(2) )
        fg=1;
  end
else
      if  (quNum>=val(1) && quNum<=pi ) ||   (quNum>=pi && quNum<=val(2) )
            fg=1;
      end
      
end
end
end


دقت کنین دو تابع بالا در یک اسکریپت هم نام تابع اول باید قرار گیرد وگرنه می تونید دو تابع را در دو اسکریپت مجزا هم نام توابع مذکور قرار دهید..

برای فراخوانی این تابع می‌توانید از کد زیر استفاده کنید:( calling script of th above function)

 

basePoint.x=4;
basePoint.y=8;
          
leftPoint.x=16;
leftPoint.y=18;
          
rightPoint.x=20;
rightPoint.y=6;
          
quPoint.x=12;
quPoint.y=8;          
fg2=IsPointInsideAngle(basePoint,leftPoint,rightPoint,quPoint );

 

خروجی به شکل 1و 0 خواهد بود.

 the output will be as 1 , 0  or true and false

 

 

 

۰ نظر موافقین ۰ مخالفین ۰ ۰۵ دی ۹۸ ، ۰۱:۱۰
موسی حسن زاده

طبق تصویر زیر برای تعیین اینکه نقطه در داخل مثلث قرار داره یا خارج از آن باید  زاویه سه مثلثی که رئوس مثلث با نقطه مورد نظر می‌سازند را محاسبه کنین، حالا براحتی  می‌تونین با جمع کردن زوایا، طبق شکل زیر موقعیت نقطه را مشخص کنین،  اگر α+β+γ=360 باشد، نقطه در داخل مثلث و اگر α+β+γ<360 در آنصورت نقطه در خارج از مثلث قرار دارد. از این ترفند ساده ریاضی برای تشخیص وجود نقاط در داخل چند ضلعی هم می‌توانید استفاده کنید...

کاربرد این مسئله ساده ریاضی بیشتر در چشم‌های الکترونیکی در ربات‌ها می‌باشد....

 

 

کد متلب برای تصویر بالا بزودی منتشر خواهد شد...

The MATLAB code for the above image will be released soon...

 

۱ نظر موافقین ۰ مخالفین ۰ ۰۴ دی ۹۸ ، ۰۱:۱۴
موسی حسن زاده