PDA

View Full Version : مشکل عجیب تغییر نتایج در هنگام استفاده از سوئیچ- کیس



ma)-(di
سه شنبه 29 مهر 1393, 14:20 عصر
سلام ، امیدوارم حال همگی دوستان (بازدیدکنندگان این مطلب) خوب باشه.
من یه سوالی داشتم ، چاره جز ارسال تاپیک جدید ندیدم، چرا که هرچی گشتم موضوع مرتبط پیدا نکردم تا یا به جوابم برسم یا سوالم رو در یه تاپیک از پیش موجود مطرح کنم.
و اما سوال من:
من الگوریتم دسته ماهی های مصنوعی (AFSA) رو در متلب پیاده کردم ، الگوریتم اجرا میشه ، همه چی حتی نتایج خروجی اوکی هست.
الگوریتم روی یک سری توابع برازش یا fitness function کار میکنه. پس مجموعه ای از توابع برازش رو در اختیار داریم که برنامه فقط در هر بار اجراء تنها میتونه یکی از اونها رو بهینه بکنه.
حالا مشکل کجاست...
من همه توابع رو در قالب یک تابع به اسم fitness جمع آوری کردم ، اما مثلن در هر لحظه n-1 تابع رو کامنت کرده و در هر بار اجراء برنامه، فقط یک تابع و اون هم تابعی که به صورت کامنت نیست، بهینه میشه.
حالا اومدم گفتم با دستور سوئیچ کیس، کاری کنم که کاربر انتخاب کنه چه تابعی رو میخواد که بهینه بشه.
با استفاده از دستور سوئیچ کیس این کار رو کردم ، باز هم همه چی اوکی هست، ولی متأسفانه نتایجی که برنامه بهم میده، کلّن با اون چیزی که باید باشه مطابقت نداره!
فرضن اگر بهترین پاسخ نهایی الگوریتم اصلی در حالت minimization برابر با 0.4567 هستش ، در حالت استفاده از سوئیچ کیس ، بهترین پاسخ نهایی برابر با 1.7654 هستش!
میخوام بدونم چرا استفاده از دستور سوئیچ کیس، تأثیر منفی روی نتیجه های من گذاشت؟!
درحالیکه اصلن با محاسبات برنامه ی من کاری نداره ؟ نه مشکلی در کدنویسی یا سینتکس یا منطق استفاده از سوئیچ-کیس هست و نه واقعن هیچ مشکل دیگه ای، البته به زعم من.

سپاسگزار خواهم بود اگر مشکل من رو حل کنید یا راهنمایی کنید که بتونم این مشکل رو حل کنم.
تشکر فراوان

rahnema1
سه شنبه 29 مهر 1393, 18:01 عصر
سلام
شما می تونید به جای کامنت کردن از این روش استفاده کنید یک سلول درست کنید از نام تابعها و سپس هر دفعه هر کدوم را اجرا کنید
مثلا اینجا سه تا تابع اگر داشته باشیم

function [X, Y] = func1 (a, b)
X = a + b;
Y = a * b;
end
function [X, Y] = func2 (a, b)
X = a - b;
Y = a / b;
end
function [X, Y] = func3 (a, b)
X = a ^ b;
Y = a + b;
end
myfunc = {@func1, @func2, @func3};

for i =1:numel(myfunc)
[x y] = myfunc{i}(3, 5)
end


یا اینجور با feval هم میشه

for i =1:numel(myfunc)
[x y] = feval(myfunc{i}, 3, 5)
end

این مطالب در راهنمای متلب هم گفته شده
http://www.mathworks.com/help/matlab/matlab_prog/string-evaluation.html

ma)-(di
سه شنبه 29 مهر 1393, 21:41 عصر
مرسی که محبت کردید و پاسخ گفتید.
اجازه میخوام تا تست کنم و نتیجه رو خدمت شما ابلاغ کنم.
سپاس فراوان.