PDA

View Full Version : سوال : تغییر متغییر در matlab



Arsham.Kamali
سه شنبه 25 تیر 1392, 11:44 صبح
سلام دوستان

من با زبان متلب آشنایی ندارم - برنامه نویسی رو با c# انجام میدم !!!

مشکلم اینه که :

یه برنامه دارم که مسله فروشنده دوره گرد و با استفاده از الگوریتم ژنتیک حل میکنه !

ولی نمیشه تعداد اون شهر ها رو توش تغییر داد ( چون نمی دونم کدوم متغییر هست ! ) و خودش تعداد 25 شهر رو حساب میکنه !


من می خوام از دوستان کمک بگیرم و بتونم کاری کنم که تعداد شهر ها رو خودم بدم ( از ورودی ) و اون برام حساب کنه !!!!

ممنون میشم راهنماییم کنید !

اگر هم نیاز به سورس برنامه هست ، قرار بدم

manij_mhm
سه شنبه 25 تیر 1392, 18:06 عصر
شما 25 رو توی برنامه سرچ کنید می تونید متغیر مورد نظرتونو پیدا کنید. اگه نه یا اون از قسمت از کد رو در اینجا قرار بدید و یا برنامه رو اینجا بزارید که بتونیم کمکتون کنیم.

موفق باشید.

Arsham.Kamali
چهارشنبه 26 تیر 1392, 12:54 عصر
دوست من نمیشه همه عدد های 25 روز تغییر داد!!! error میده !!!

اینم کد برنامه :

input=randi(100,2,26);
first_generation=zeros(100,25);

% try to make first generation
for z=1:100
first_generation(z,:)=randperm(25);
end
subplot(4,2,1:4)
plot(input(1,first_generation(1,:)),input(2,first_ generation(1,:)),'*');
for k=1:500
if k==1||k==200||k==50||k==500
switch k
case 1
subplot(4,2,5)
case 50
subplot(4,2,6)
case 200
subplot(4,2,7)
case 500
subplot(4,2,8)
end
plot(input(1,first_generation(1,:)),input(2,first_ generation(1,:)),'r');
title(['step = ',int2str(k)]);
end

%calculate distance
distance=zeros(1,100);
for i=1:100
for j=1:25
if(j~=25)
temp_x=(input(1,first_generation(i,j))-input(1,first_generation(i,j+1)))^2;
temp_y=(input(2,first_generation(i,j))-input(2,first_generation(i,j+1)))^2;
else
temp_x=(input(1,first_generation(i,j))-input(1,26))^2;
temp_y=(input(2,first_generation(i,j))-input(2,26))^2;
end
temp_dis=sqrt(temp_x+temp_y);
distance(1,i)=distance(1,i)+temp_dis;
end
end

%sort generation according to it's distance
generation=first_generation;
generation(:,26)=distance';
sort_generation=sortrows(generation,26);
for h=1:25
sort2_generation(:,h)=sort_generation(:,h);
end

%first operation :create shifted matrix: shiftsize is random
shift_num=randi(25);
for p=50:99
sort2_generation(p,:)=circshift(sort2_generation(p ,:),[0 shift_num]);
end

%second operation : mutation
mut(k,:)=randi(25,1,2);
while(mut(k,1)==mut(k,2))
mut(k,:)=randi(25,1,2);
end
sort2_generation(100,mut(k,1))=sort2_generation(10 0,mut(k,1))+sort2_generation(100,mut(k,2));
sort2_generation(100,mut(k,2))=sort2_generation(10 0,mut(k,1))-sort2_generation(100,mut(k,2));
sort2_generation(100,mut(k,1))=sort2_generation(10 0,mut(k,1))-sort2_generation(100,mut(k,2));

%new generation
first_generation=sort2_generation;
end

Arsham.Kamali
چهارشنبه 26 تیر 1392, 13:43 عصر
دمت گرم دادش ، همه عدد های 25 و 26(که فک کنم مرحله بعدی حساب میشه) رو تغییر دادم و به حالت های 5 و 10 و 20 تایی تبدیل کردم !!!!

ولی می خوام اینطوری نباشه می خوام یه متغییر از من بخواد ( از ورودی) و هر عددی رو وارد کردم ، بر اساس همون پیش بره ....

مثلا اگه c# بود جایه عدد 25 یه متغییر مثل x تعریف میکردم و بعد تو محیط ویژوال ازش می خواستم که مقدار x رو از ورودی بخونه ولی تو matlab می دونم چجوری میشه این کارو کرد !!!!!

manij_mhm
چهارشنبه 26 تیر 1392, 14:08 عصر
خواهش می کنم. برای دریافت ورودی از کاربر از دستور input استفاده کنید


x= input('plz input number ...' )

Arsham.Kamali
چهارشنبه 26 تیر 1392, 17:25 عصر
شرمنده من بازم سوال می پرسم ولی اگه یخورده بیشتر توضیح بدی ممنون میشم !!!

من خودم این طوری برداشت کردم ، اگه غلطه ببخشید چون تا حالا matlab کار نکردم!!!!

x= input('plz input number ...' )
input=randi(100,2,26);
first_generation=zeros(100,x);

% try to make first generation
for z=1:100
first_generation(z,:)=randperm(x);
end
subplot(4,2,1:4)
plot(input(1,first_generation(1,:)),input(2,first_ generation(1,:)),'*');
for k=1:500
if k==1||k==200||k==50||k==500
switch k
.
.
.
.
.

manij_mhm
چهارشنبه 26 تیر 1392, 18:51 عصر
input یه تابع برای دریافت ورودی از کاربره! خط اول

x= input('plz input number ...' )

عبارت plz input number رو در کنسول نشون میده و منتظر دریافت ورودی از کاربر می مونه که شما باید 25 یا هر عدد دیگه ای که مایل هستید رو بدید. ورودی کاربر درون متغیر x ذخیره مشه و شما می تونید به جای عدد 25 که در برنامه اولیه یه عدد ثابت بود، متغیر x رو قرار بدید و برنامه با توجه به درخواست کاربر اجرا بشه!

البته شما چون از تابع input استفاده کردید دیگه نباید متغیری به این نام استفاده کنید:


input=randi(100,2,26);

احتمالا به جای 26 هم باید x+1 قرار بدید!
اگه مشکلی در اجرا بود خطا رو هم بزارید.

موفق باشید.

Arsham.Kamali
پنج شنبه 27 تیر 1392, 12:12 عصر
این اررور رو میده :


25

??? Error using ==> input
The first argument to INPUT must be a string.

Error in ==> tsp at 10
plot(input(1,first_generation(1,:)),input(2,first_ generation(1,:)),'*');

Arsham.Kamali
پنج شنبه 27 تیر 1392, 12:13 عصر
اینم از کدی که تغییر دادم:


x= input('plz input number ...' )
first_generation=zeros(100,x);

% try to make first generation
for z=1:100
first_generation(z,:)=randperm(x);
end
subplot(4,2,1:4)
plot(input(1,first_generation(1,:)),input(2,first_ generation(1,:)),'*');
for k=1:500
if k==1||k==200||k==50||k==500
switch k
case 1
subplot(4,2,5)
case 50
subplot(4,2,6)
case 200
subplot(4,2,7)
case 500
subplot(4,2,8)
end
plot(input(1,first_generation(1,:)),input(2,first_ generation(1,:)),'r');
title(['step = ',int2str(k)]);
end

%calculate distance
distance=zeros(1,100);
for i=1:100
for j=1:x
if(j~=x)
temp_x=(input(1,first_generation(i,j))-input(1,first_generation(i,j+1)))^2;
temp_y=(input(2,first_generation(i,j))-input(2,first_generation(i,j+1)))^2;
else
temp_x=(input(1,first_generation(i,j))-input(1,x+1))^2;
temp_y=(input(2,first_generation(i,j))-input(2,x+1))^2;
end
temp_dis=sqrt(temp_x+temp_y);
distance(1,i)=distance(1,i)+temp_dis;
end
end

%sort generation according to it's distance
generation=first_generation;
generation(:,x+1)=distance';
sort_generation=sortrows(generation,x+1);
for h=1:x
sort2_generation(:,h)=sort_generation(:,h);
end

%first operation :create shifted matrix: shiftsize is random
shift_num=randi(x);
for p=50:99
sort2_generation(p,:)=circshift(sort2_generation(p ,:),[0 shift_num]);
end

%second operation : mutation
mut(k,:)=randi(x,1,2);
while(mut(k,1)==mut(k,2))
mut(k,:)=randi(x,1,2);
end
sort2_generation(100,mut(k,1))=sort2_generation(10 0,mut(k,1))+sort2_generation(100,mut(k,2));
sort2_generation(100,mut(k,2))=sort2_generation(10 0,mut(k,1))-sort2_generation(100,mut(k,2));
sort2_generation(100,mut(k,1))=sort2_generation(10 0,mut(k,1))-sort2_generation(100,mut(k,2));

%new generation
first_generation=sort2_generation;
end

manij_mhm
پنج شنبه 27 تیر 1392, 23:54 عصر
خوب ببیینید در بالا هم گفتم شما چون در اینجا از تابع input استفاده می کنید، دیگه نباید متغیری به این نام داشته باشید:


x= input('plz input number ...' )

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


plot(input(1,first_generation(1,:)),input(2,first_ generation(1,:)),'*');

از متغیر input استفاده کردید!
البته در خطوط 22 و 31 و32و 24و 35 هم از این متغیر استفاده کردید.
اسم این متغیر رو عوض کنید مشکلتون حل میشه.
موفق باشید.

Arsham.Kamali
جمعه 28 تیر 1392, 20:08 عصر
همون طور که فرمودید من اسم متغییر input ( تا الان فک میکردم که تابع هست) رو تغییر دادم ولی بازم اررور میده !

plz input number ...25

x =

25

??? Index exceeds matrix dimensions.

Error in ==> tsp at 10
plot(x(1,first_generation(1,:)),x(2,first_generati on(1,:)),'*');

البته اینجا اسمش x هست که اسم دسگه هم گذاشتم ولی باز اررور میده !

manij_mhm
شنبه 29 تیر 1392, 20:13 عصر
x= input('plz input number ...' )
input موجود در عبارت بالا تابعه. که یه عدد رو از ورودی در یافت می کنه و در متغیر x ذخیره می کنه!
میشه بگید هدف از عبارت


plot(x(1,first_generation(1,:)),x(2,first_generati on(1,:)),'*');

چیه؟
x رو در بالا یه متغیر int در یافت کردید. اما در
x(1,first_generation(1,:)) مثل تابع و با ماتریس باهاش رفتار می کنید!

Arsham.Kamali
شنبه 29 تیر 1392, 20:44 عصر
شما فرمودید که چون از input در خط اول به عنوان یک تابع استفاده شده دیگه نمیشه به عنوان متغییر ازش استفاده کرد !!! اینجوری که من متوجه شدم

و در خط 9 و 10 که باز از input استفاده شده باید تغییر نام بدم - و من یه اسم دیگه بجای input گذاشتم ولی ج نداد و بعد از متغییر x استفاده کردم !!!! البته میدونم غلطه ، حالا شما اگه لطف کنید و یکم بیشتر توضیح بدید ممنون میشم !

manij_mhm
شنبه 29 تیر 1392, 23:32 عصر
input=randi(100,2,26);
first_generation=zeros(100,25);

% try to make first generation
for z=1:100
first_generation(z,:)=randperm(25);
end
subplot(4,2,1:4)
plot(input(1,first_generation(1,:)),input(2,first_ generation(1,:)),'*');
for k=1:500
if k==1||k==200||k==50||k==500
switch k
case 1
subplot(4,2,5)
case 50
subplot(4,2,6)
case 200
subplot(4,2,7)
case 500
subplot(4,2,8)
end
plot(input(1,first_generation(1,:)),input(2,first_ generation(1,:)),'r');
title(['step = ',int2str(k)]);
end

%calculate distance
distance=zeros(1,100);
for i=1:100
for j=1:25
if(j~=25)
temp_x=(input(1,first_generation(i,j))-input(1,first_generation(i,j+1)))^2;
temp_y=(input(2,first_generation(i,j))-input(2,first_generation(i,j+1)))^2;
else
temp_x=(input(1,first_generation(i,j))-input(1,26))^2;
temp_y=(input(2,first_generation(i,j))-input(2,26))^2;
end
temp_dis=sqrt(temp_x+temp_y);
distance(1,i)=distance(1,i)+temp_dis;
end
end

%sort generation according to it's distance
generation=first_generation;
generation(:,26)=distance';
sort_generation=sortrows(generation,26);
for h=1:25
sort2_generation(:,h)=sort_generation(:,h);
end

%first operation :create shifted matrix: shiftsize is random
shift_num=randi(25);
for p=50:99
sort2_generation(p,:)=circshift(sort2_generation(p ,:),[0 shift_num]);
end

%second operation : mutation
mut(k,:)=randi(25,1,2);
while(mut(k,1)==mut(k,2))
mut(k,:)=randi(25,1,2);
end
sort2_generation(100,mut(k,1))=sort2_generation(10 0,mut(k,1))+sort2_generation(100,mut(k,2));
sort2_generation(100,mut(k,2))=sort2_generation(10 0,mut(k,1))-sort2_generation(100,mut(k,2));
sort2_generation(100,mut(k,1))=sort2_generation(10 0,mut(k,1))-sort2_generation(100,mut(k,2));

%new generation
first_generation=sort2_generation;
end



کدهای بالا کد اولیه
شماست، درسته؟
شما اول بیاید متغیر input در این برنامه رو با یه متغیر دیگه مثلا input_var تغییر بدید.
بعد از اینکه کلیه متغیرهای input رو تغییر دادید در ابتدای کد، متغیر x با همون کداز ورودی توسط تابع input دریافت کنید، و در برنامه به جای عدد 25 از x استفاده کنید. اگه منطق برنامه شما 26 رو معادل 25+1 در نظر میگیره ( یعنی اگه رودی رو 30بدید باید به جای 26 نوشته بشه 31) به جای 26 ها هم x+1 قرار بدید.
در واقع فکر کنم شما




input=randi(100,2,26);



رو از برنامه حذف کردید که در واقع همون مقداردهی اولیه متغیر input_var شما ست. این خط کد رو به برنامه بعد از تابع input اضافه کنید و اسم اون رو بزارید input_var یا هر نامی که به جای متغیرهای input قرار دادید.

موفق باشید.

Arsham.Kamali
دوشنبه 31 تیر 1392, 21:12 عصر
طبق فرمایش شما من همه این مراحل رو انجام داده بودم !!!

الان دوباره از روی فایل اصلی- بک آپ مراحل رو رفتم ولی باز یه اررور دیگه میده :

??? Index exceeds matrix dimensions.

Error in ==> tsp at 2
x= input('plz input number ...' );

manij_mhm
دوشنبه 31 تیر 1392, 22:23 عصر
برنامه زیر رو اجرا کنید


%input=randi(100,2,input_num+1);
input_num = input('plz add num... :')
input_ar=floor(1 + (100-1+1) .* rand(2,input_num+1))
first_generation=zeros(100,input_num);

% try to make first generation
for z=1:100
first_generation(z,:)=randperm(input_num);
end
subplot(4,2,1:4)
plot(input_ar(1,first_generation(1,:)),input_ar(2, first_generation(1,:)),'*');
for k=1:500
if k==1||k==200||k==50||k==500
switch k
case 1
subplot(4,2,5)
case 50
subplot(4,2,6)
case 200
subplot(4,2,7)
case 500
subplot(4,2,8)
end
plot(input_ar(1,first_generation(1,:)),input_ar(2, first_generation(1,:)),'r');
title(['step = ',int2str(k)]);
end

%calculate distance
distance=zeros(1,100);
for i=1:100
for j=1:input_num
if(j~=input_num)
temp_x=(input_ar(1,first_generation(i,j))-input_ar(1,first_generation(i,j+1)))^2;
temp_y=(input_ar(2,first_generation(i,j))-input_ar(2,first_generation(i,j+1)))^2;
else
temp_x=(input_ar(1,first_generation(i,j))-input_ar(1,input_num+1))^2;
temp_y=(input_ar(2,first_generation(i,j))-input_ar(2,input_num+1))^2;
end
temp_dis=sqrt(temp_x+temp_y);
distance(1,i)=distance(1,i)+temp_dis;
end
end

%sort generation according to it's distance
generation=first_generation;
generation(:,input_num+1)=distance';
sort_generation=sortrows(generation,input_num+1);
for h=1:input_num
sort2_generation(:,h)=sort_generation(:,h);
end

%first operation :create shifted matrix: shiftsize is random
% shift_num=randi(input_num);
shift_num=floor(1 + (input_num-1+1) .* rand(1,1))
for p=50:99
sort2_generation(p,:)=circshift(sort2_generation(p ,:),[0 shift_num]);
end

%second operation : mutation
% mut(k,:)=randi(input_num,1,2);
mut(k,:)=floor(1 + (input_num-1+1) .* rand(1,2))
while(mut(k,1)==mut(k,2))
mut(k,:)=floor(1 + (input_num-1+1) .* rand(1,2))
% mut(k,:)=randi(input_num,1,2);
end
sort2_generation(100,mut(k,1))=sort2_generation(10 0,mut(k,1))+sort2_generation(100,mut(k,2));
sort2_generation(100,mut(k,2))=sort2_generation(10 0,mut(k,1))-sort2_generation(100,mut(k,2));
sort2_generation(100,mut(k,1))=sort2_generation(10 0,mut(k,1))-sort2_generation(100,mut(k,2));

%new generation
first_generation=sort2_generation;
end

برای 90 - 44- 25 - 26 که ورودی های منطقی است به درستی جواب میده.

Arsham.Kamali
سه شنبه 01 مرداد 1392, 18:58 عصر
مرسی از همکاری و کمکت !!!!

دوست من ، فایل شما باز اررور داد ولی اون کدی که تو پست قبل گفتم رو دوباره اجرا کردم ، دیگه اررور نمی ده و درست شد !!!!

خیلی ممنون !!!

manij_mhm
جمعه 04 مرداد 1392, 00:39 صبح
خواهش می کنم. این کد روی سیستم من بدرستی جواب میده. احتمالا به دلیل تفاوت ورژن های متلب. اگه توجه کرده باشید به جای تابع randi از یه سری کد دیگه استفاده کردم. یه همچین تغییراتی روی ورژن های مختلف متلب برای اجرا باید داده بشه.
موفق باشید.