# مباحث متفرقه برنامه نویسی > برنامه نویسی Matlab >  سوال : تغییر متغییر در matlab

## Arsham.Kamali

سلام دوستان

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

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

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

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


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

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

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

----------


## manij_mhm

شما 25 رو توی برنامه سرچ کنید می تونید متغیر مورد نظرتونو پیدا کنید. اگه نه یا اون از قسمت از کد رو در اینجا قرار بدید و یا برنامه رو اینجا بزارید که بتونیم کمکتون کنیم.

موفق باشید.

----------


## Arsham.Kamali

دوست من نمیشه همه عدد های 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

دمت گرم دادش ، همه عدد های 25 و 26(که فک کنم مرحله بعدی حساب میشه) رو تغییر دادم و به حالت های 5 و 10 و 20 تایی تبدیل کردم !!!!

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

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

----------


## manij_mhm

خواهش می کنم. برای دریافت ورودی از کاربر از دستور input استفاده کنید

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

----------


## Arsham.Kamali

شرمنده من بازم سوال می پرسم ولی اگه یخورده بیشتر توضیح بدی ممنون میشم !!!

من خودم این طوری برداشت کردم ، اگه غلطه ببخشید چون تا حالا 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

input یه تابع برای دریافت ورودی از کاربره! خط اول  
x= input('plz input number ...' )

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

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

input=randi(100,2,26); 

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

موفق باشید.

----------


## Arsham.Kamali

این اررور رو میده :

    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

اینم از کدی که تغییر دادم:

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

خوب ببیینید در بالا هم گفتم شما چون در اینجا از تابع 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

همون طور که فرمودید من اسم متغییر 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_generation(1,:)),'*');
 
البته اینجا اسمش x هست که اسم دسگه هم گذاشتم ولی باز اررور میده !

----------


## manij_mhm

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

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

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

----------


## manij_mhm

> 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,:)),'*');
> ...


کدهای بالا کد اولیه شماست، درسته؟
شما اول بیاید متغیر 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

طبق فرمایش شما من همه این مراحل رو انجام داده بودم !!!

 الان دوباره از روی فایل اصلی- بک آپ مراحل رو رفتم ولی باز یه اررور دیگه میده :
??? Index exceeds matrix dimensions.

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

----------


## manij_mhm

برنامه زیر رو اجرا کنید



> %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
> ...


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

----------


## Arsham.Kamali

مرسی از همکاری و کمکت !!!!

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

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

----------


## manij_mhm

خواهش می کنم. این کد روی سیستم من بدرستی جواب میده. احتمالا به دلیل تفاوت ورژن های متلب. اگه توجه کرده باشید به جای تابع randi از یه سری کد دیگه استفاده کردم. یه همچین تغییراتی روی ورژن های مختلف متلب برای اجرا باید داده بشه.
موفق باشید.

----------

