نرم افزار  MATLAB یک نرم افزار کامپیوتری برای کسانی است که با مسائل پیچیده و بخصوص با مسائل جبر خطی سر و کار دارند. نحوه طراحی این نرم افزار بر خلاف اکثر نرم­افزارها به گونه­ای است که افراد متخصص راحت­تر بتوانند با آن ارتباط برقرار کنند. به همین دلیل کسی که برای اولین بار وارد محیط نرم­افزار می­شود، تفاوت این محیط را با نرم­افزارهای دیگر به خوبی لمس می­کند. ظاهر نرم­افزار برای یک تازه وارد چندان خوشایند نخواهد بود ولی کافیست یک­بار طعم حل یک مسئله به ظاهر پیچیده و طولانی را با MATLAB بچشد، در آنصورت قطعا احساس بهتری نسبت به این نرم­افزار خواهد داشت. نکته مهم دیگر در خصوص این نرم­افزار جامع بودن و کاربرد آن در زمینه­های بسیار گوناگون مثل ریاضیات، آمار، طراحی سیستم­های صنعتی و … می­باشد. رای آشنایی بیشتر با این نرم­افزار در زیر دو مثال  از ماتریس فاکتور و ماتری پوشش در متلب آورده شده است.

مثال ۱: ماتریس فاکتور

فاکتور بودن ماتریس در حل مسئله استقرار m  کالا در فضای انبارش گسسته کاربرد دارد. یکی از شرایط شروع حل این مسئله به روش ابتکاری، این است که ماتریس w (وزنها) باید دارای شرایط فاکتور بودن باشد.

m در این مسئله تعداد کالاها است و p هم تعداد باراندازها است.

برای بررسی فاکتور بودن یک ماتریس، از نرم­افزار MATLAB استفاده کرده­ایم، زیرا برای ماتریس­های W بزرگ، حجم محاسبات زیاد خواهد شد و محاسبه مسئله به صورت دستی دشوار می­شود. در زیر برنامه فاکتور بودن ماتریس آورده شده است..

clc

clear

با دستور زیر به کاربر اعلام می­شود که ماتریس w را وارد کند.

w=input(‘input Matrix W: ‘);

دستورات زیر مقادیر ci و wk را محاسبه می­کند.

ci=sum(w);

wk=sum(w’)/sum(sum(w));

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

if (ci’*wk)’==w

disp(‘————————————‘)

disp(‘THE MATRIX IS FACTOR’)

else

disp(‘————–***********————–‘)

disp(‘THE MATRIX IS NOT FACTOR’)

end

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

input Matrix W: [2,1,2,3;4,2,4,6]

————————————

THE MATRIX IS FACTOR

input Matrix W: [2,3,4,2;5,3,4,]

————–***********————–

THE MATRIX IS NOT FACTOR

مثال ۲: مسئله پوشش کلی

در این مسئله، هدف ما این است که با کمترین تعداد تسهیلات، مکان­های مورد نظری را پوشش دهیم. به عنوان مثال اگر بخواهیم با کمترین تعداد اورژانس در یک شهر، تمامی مناطق شهری را پوشش دهیم، از این مسئله استفاده می­کنیم.

برای حل این مدل، تورگاس، سواین، ریوله و ویگرمن روش زیر را پیشنهاد کرده­اند.اگر یک وسیله در سایت j  مستقر شود آنگاه xj=1 در غیر اینصورت xj=0 خواهد بود و اگر یک مشتری i به وسلیه سایت j  مستقر شود آنگاه aij=1 در غیر اینصورت aij=0 خواهد شد.

گام ۱: ابتدا مسئله در حالتی که( xj۰     j=1,…,n )، حل شود و Z*=Z

گام ۲: اگر تمامی xj ها متغیر صفر و یک بودند، آنگاه مسئله حل شده است و Z*چاپ شود، در غیر اینصورت محدودیت  به مسئله اضافه شود و به گام ۱ بروید.

همانطور که در گامهای این الگوریتم آمده است، نیاز به حل یک مسئله برنامه­ریزی خطی داریم. برای این کار از دستور linprog(C,A,B) که C ضرایب تابع هدف مینیمم­سازی است و A و B به ترتیب ضرایب متغیرها و اعداد سمت راست محدودیت Ax B هستند. پس از حل مسئله مقادیر تابع هدف و xها بدست می­آید. با توجه به این دستور، برنامه زیر برای یک مسئله پوشش کلی نوشته شده است که در ادامه توضیحات آن آمده است.

ابتدا ماتریس a را تعریف می­کنیم.

a =[1,0,1,0;1,1,1,0;0,0,0,1;0,0,1,0;1,1,0,1];

تعداد مکان­های موجود را توسط دستور زیر محاسبه می­کنیم. در واقع تعداد ستونهای ماتریس a ، همان تعداد مکانهای موجود است. و تعداد مشتری­ها را که برابر تعداد ردیفهای ماتریس a می­باشد، نیز بدست می­آوریم.

site=size(a,2);

coustomer=size(a,1);

ضرایب تابع هدف را تشکیل می­دهیم، تعداد این ضرایب به تعداد مکان­های موجود است.

for j=1:site

    c(1,j)=1;

end

بردار B را نیز بر اساس دستورات زیر تشکیل می­دهیم، در این نرم­افزار اگر باشد، ضرایب xjها در ماتریس A می­آید و اعداد سمت راست هم در بردار B.

for i=1:coustomer

    b(i)=1;

end

for j=1:site

    b(site+j)=0;

end

چون در این مسئله حتما است. به همین دلیل آخرین عدد بردار B را برابر یک قرار می­دهیم.

b(site+coustomer+1)=0;

برای تشکیل ماتریس A از دستورات زیر استفاده می­کنیم.

v=eye(site);

for i=1:site

    a(site+i,:)=v(i,:);

end

a(site+coustomer+1,:)=1;

مقدار fval  را که مقدار تابع هدف است، برابر -۱ قرار می­دهیم، تا در تکرار اول حلقه while،  شود.

fval=-1;

مقدار n را برابر یک قرار می­دهیم تا به حلقه while وارد شویم. n شمارنده­ای برای این است که دریابیم آیا مقدار متغیرهای جواب صفر و یک هستند یا نه.

n=1;

این حلقه را تا هنگامی که مقدار n بزرگتر و یا مساوی صفر است انجام می­دهیم، و این بدان معنی است که هنوز همه مقدار متغیرهای مسئله صفر و یک نشده­اند.

while n>=0

عبارت floor در دستور زیر نقش براکت () را بازی می­کند. با این کار محدودیت برش را در مسئله اعمال  می­کنیم و همانطور که بیان شد، این محدودیت در اولین تکرار به صورت خواهد بود.

b(site+coustomer+1)=floor(fval)+1;

همان گونه که در توضیحات قبل آمده است، با دستور linprog برنامه ریزی خطی این مسئله را حل می­کنیم و دلیل ضرایب منفی در متغیر a و b، رسیدن به تعریف نرم­افزاری است که در توضیحات مربوط به دستور linprog آمده است. مقدار تابع هدف در متغیر fval قرار می­گیرد و مقادیر xjها هم در بردار x نگهداری می­شود.

[x,fval]=linprog(c,-a,-b’);

حال مقدار n را برابر صفر قرار می­دهیم تا بتوانیم شمارش درستی از تعداد متغیرهای صفر و یک داشته باشیم.

n=0;

برای همه مقادیر بردار x ، حلقه زیر را انجام می­دهیم.

for i=1:site

به دلیل دقت بالای نرم­افزار MATLAB، به عنوان مثال عدد۱٫۵۷*۱۰-۱۶  را که بسیار نزدیک به  یک است، نمی­توان تشخیص داد که برابر یک است یا خیر، به همین دلیل، با دقت ۰٫۰۰۰۰۱ ما این مقدار را همان یک در نظر می­گیریم. با توجه به این توضیحات، اگر مقادیر x ها با دقت بیان شده، برابر یک بود، ما به شمارنده n یک واحد اضافه می­کنیم و این یعنی، یکی از متغیرهای ما یک است.

if x(i)<1.00001 && x(i)>-1.00001

    n=n+1;

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

elseif  x(i)<0.00001 && x(i)>-0.00001

    n=n+1;

end

end

اگر n ، برابر تعداد مکان­های موجود شد، یعنی تمامی مقادیر بردار x صفر و یک هستند و الگوریتم خاتمه پیدا می­کند در غیر این صورت تکرار بعدی حلقه while  انجام خواهد شد.

if n==site

    break

end

end

fval

x

پس از حل مسئله پوشش کلی که در الگوریتم بیان شده است، جواب زیر چاپ شده است.

fval =

    ۲٫۰۰۰۰

x =

         ۰

         ۰

    ۱٫۰۰۰۰

    ۱٫۰۰۰۰

    جواب چاپ شده بدین معنا است که تسهیلات ما برای ارائه یک پوشش کلی در مکانهای ۳ و ۴ قرار گیرند. پس ما به ۲ تسهیل نیازمندیم.

در ادامه برنامه دو مثال بیان شده آورده شده است.

برنامه تشخیص ماتریس فاکتور:

clc

clear

w=input(‘input Matrix W: ‘);

ci=sum(w);

wk=sum(w’)/sum(sum(w));

if (ci’*wk)’==w

disp(‘————————————‘)

disp(‘THE MATRIX IS FACTOR’)

else

disp(‘————–***********————–‘)

disp(‘THE MATRIX IS NOT FACTOR’)

end

برنامه مسئله پوشش کلی:

clc

clear

a=[1,1,0,0,0,0,0,0;0,1,0,0,0,0,0,0;0,1,1,0,0,0,0,0;1,1,0,1,0,0,0,0;0,1,1,1];

n=1;

site=size(a,2);

coustomer=size(a,1);

for j=1:site

c(1,j)=1;

end

for i=1:coustomer

b(i)=1;

end

for j=1:site

b(site+j)=0;

end

b(site+coustomer+1)=1;

v=eye(site);

for i=1:site

a(site+i,:)=v(i,:);

end

a(site+coustomer+1,:)=1;

fval=-1;

while n>=0

b(site+coustomer+1)=floor(fval)+1;

[x,fval]=linprog(c,-a,-b’);

n=0;

for i=1:site

if x(i)<1.00001 && x(i)>-1.00001

n=n+1;

elseif  x(i)<0.00001 && x(i)>-0.00001

n=n+1;

end

end

if n==site

break

end

end

fval

x