رفتن به مطلب

انتخاب بهترین کروموزوم ها


فاطمه-زهرا

ارسال های توصیه شده

سلام

 

یک سری داده (کروموزوم) باینری داریم، میخوایم فقط کروموزوم هایی رو که بیت اول و آخرشون 1 هست و هیچ دو بیت کنار همی 1 نیست رو انتخاب کنیم.

ضمن تشکر از آقای انصاری، کدی رو که زحمت کشیدید و نوشتید جواب داد ولی متاسفانه من اصلا متوجه نشدم چکار میکنه.

داده دسیمال من اعدادی بین صفر تا هشته. اول این داده های دسیمال رو به باینری تبدیل کردم. بعد تو یه حلقه گذاشتم. به نظرم اشتباه اومد!

اینم کدش:

 

Pop=xlsread('ِSolar-Data.xls');

Pop1=dec2bin(Pop);

[NPar,NGene]= size(Pop1)

 

for I=1:NPar

for J=1:NGene

if Pop1(1)~=Pop1(NGene)~=1 && Pop(J)~=Pop(J+1)

Pop=BinaryData(I);

end

end

end

 

 

 

می خواستم کد آقای انصاری رو هم تغییر بدم و دیتای خودمو توش بذارم که نتونستم.

 

A = (0:255)';

Bin_A_cell = arrayfun(@(x) bitget(x,8:-1:1),A,'Un',0);

Bin_A = cell2mat(Bin_A_cell);

 

idx1 = ~any(Bin_A(:,1:7) .* Bin_A(:,2:8),2);

idx2 = Bin_A(:,1)~= 0 & Bin_A(:,8)~= 0;

 

[A(idx1 & idx2) Bin_A(idx1 & idx2,:)]

Solar-Data.rar

لینک به دیدگاه
  • پاسخ 50
  • ایجاد شد
  • آخرین پاسخ

بهترین ارسال کنندگان این موضوع

بهترین ارسال کنندگان این موضوع

سلام

 

یک سری داده (کروموزوم) باینری داریم، میخوایم فقط کروموزوم هایی رو که بیت اول و آخرشون 1 هست و هیچ دو بیت کنار همی 1 نیست رو انتخاب کنیم.

ضمن تشکر از آقای انصاری، کدی رو که زحمت کشیدید و نوشتید جواب داد ولی متاسفانه من اصلا متوجه نشدم چکار میکنه.

داده دسیمال من اعدادی بین صفر تا هشته. اول این داده های دسیمال رو به باینری تبدیل کردم. بعد تو یه حلقه گذاشتم. به نظرم اشتباه اومد!

اینم کدش:

 

Pop=xlsread('ِSolar-Data.xls');

Pop1=dec2bin(Pop);

[NPar,NGene]= size(Pop1)

 

for I=1:NPar

for J=1:NGene

if Pop1(1)~=Pop1(NGene)~=1 && Pop(J)~=Pop(J+1)

Pop=BinaryData(I);

end

end

end

 

 

 

می خواستم کد آقای انصاری رو هم تغییر بدم و دیتای خودمو توش بذارم که نتونستم.

 

A = (0:255)';

Bin_A_cell = arrayfun(@(x) bitget(x,8:-1:1),A,'Un',0);

Bin_A = cell2mat(Bin_A_cell);

 

idx1 = ~any(Bin_A(:,1:7) .* Bin_A(:,2:8),2);

idx2 = Bin_A(:,1)~= 0 & Bin_A(:,8)~= 0;

 

[A(idx1 & idx2) Bin_A(idx1 & idx2,:)]

 

سلام

 

مقادیرتون که اعشاری هست، اعداد صحیح بین صفر تا هشت هم چنین خاصیتی ندارن، چون چهار بیت پر ارزش همشون صفر هست، که بیت آخر (یا اول بسته به طوری که در نظر می گیرین) رو شامل میشه.

 

اما کد دوم رو هم بذارین توضیح بدم، A یه ماتریس ستونی از اعداد 0 تا 255 هست، می خوایم ببینیم چند تا از این اعداد چنین خواصی دارن، خب اول باید باینری اون ها بدست بیاریم، bin2dec رشته میده توی خروجی ولی bitget عدد معمولی میده راحت تر میشه باهاش کار کرد. خب مثلا عدد 19 رو می خوایم باینری 8 بیتی رو بدست بیاریم:

 

>> dec2bin(19,8)

ans =


00010011


>> bitget(19,[5 4 3 2 1])


ans =


    1     0     0     1     1


>> bitget(19,8:-1:1)


ans =


    0     0     0     1     0     0     1     1

 

خب حالا اگه یه آرایه ای داشته باشیم بخوایم یه فانکشنی رو روی همه ی درایه ها اجرا کنیم (اینجا bitget) می تونیم به جای حلقه از arrayfun استفاده کنیم همین کار رو می کنه. حالا ما چون برای هر درایه ی ماتریس، 8 تا درایه (برای هر بیت یه دونه) داشته باشیم، متلب این پیش فرض رو داره شاید همه هم اندازه نشن و نتونه توی یه ماتریس بذاره. پس بهش بگیم که اعداد صفر و یک هر درایه مون رو داخل یه سلول از یه متغیر از نوع cell array بذاره، اینکار رو با پارامتر 'UniformOutput' (البته دو حرف اول هم کفایت می کنه) رو روی false یا همون صفر قرار میدیم. بعدش ما که می دونیم همه ی سلول ها 8 تا درایه دارن پس توی ماتریس می تونن قرار بگیرن، با cell2mat تبدیل به ماتریسش می کنیم. حالا یه ماتریس 256 در 8 داریم، یعنی هر ستون این ماتریس معادل یه بیت از تمام عددهامون هست.

 

اینکه دو بیت کنار هم رو می خوایم ببینیم یک هست یا نه، هر بیتی رو در کناریش ضرب می کنیم، هفت بیت اول Bin_A(:,1:7) رو در هفت بیت دوم Bin_A(:,2:8) ضرب کردیم. اگه هر دو یک باشن یک میشه ضربشون دیگه، درسته. پس توی هر سطر ما هفت ستون داریم که نتیجه ی ضرب هر بیت در بیت کناریش هست. از بین این هفتا یه دونه هم یک باشه کافیه، پس میگیم توی هر سری اگه یه یک بود، ما اون عدد رو نمی خوایم، نتیجه صفر باشه. متلب یه فانکشن به نام any داره، اگه یه مقدار غیر یک داشته باشه خروجی یک هست، حالا ما هم اینجا ازش استفاده می کنیم. برای هر سط اگه یه یک داشته باشیم any به ما یک میده، خب ما اینا رو که نمی خوایم، اونایی که یک ندارن رو می خوایم، پس notش می کنیم (~). دیگه می خواستیم چی رو چک کنیم، بیت اول و بیت آخر، اینم برای کل اعداد چک می کنیم (من چرا نوشتم صفر نباشه، می تونستم همون یک باشه رو بنویسم)، در نهایت خروجی مون هم باید هم ویژگی idx1 رو داشته باشه و هم ویژگی idx2، اینا رو با هم and می کنیم. میشه ایندکس عدد هایی که می خوایم.

:a030:

لینک به دیدگاه

مجددا سلام

من دو روزه درگیر اینم که برای اعداد اعشاری چکار کنم

آقای انصاری تو یکی از پستاشون اینو جواب داده بودن

اما خروجی این کد کاراکتر هست و نمیتونه ورودی کد بالا باشه

 

 

Data=xlsread('Solar-Data.xls');
n=10;
Data=Data(: );
points=repmat('.',length(Data),1);
signs =repmat(' ',length(Data),1);
idx=find(Data<0);
signs(idx) = signs(idx) - ' ' + '-';
y=fliplr(dec2bin(abs(Data)*2^n,n));
y=fliplr([y(:,1:n) points y(:,n+1:end) signs])
 
Bin_y_cell = arrayfun(@(x) bitget(x,8:-1:1),y,'Un',0);
Bin_y = cell2mat(Bin_y_cell);

idx1 = ~any(Bin_y(:,1:7) .* Bin_y(:,2:8),2);
idx2 = Bin_y(:,1)~= 0 & Bin_y(:,8)~= 0;

[A(idx1 & idx2) Bin_y(idx1 & idx2,:)]

لینک به دیدگاه
مجددا سلام

من دو روزه درگیر اینم که برای اعداد اعشاری چکار کنم

آقای انصاری تو یکی از پستاشون اینو جواب داده بودن

اما خروجی این کد کاراکتر هست و نمیتونه ورودی کد بالا باشه

 

 

Data=xlsread('Solar-Data.xls');
n=10;
Data=Data(: );
points=repmat('.',length(Data),1);
signs =repmat(' ',length(Data),1);
idx=find(Data<0);
signs(idx) = signs(idx) - ' ' + '-';
y=fliplr(dec2bin(abs(Data)*2^n,n));
y=fliplr([y(:,1:n) points y(:,n+1:end) signs])
 
Bin_y_cell = arrayfun(@(x) bitget(x,8:-1:1),y,'Un',0);
Bin_y = cell2mat(Bin_y_cell);

idx1 = ~any(Bin_y(:,1:7) .* Bin_y(:,2:8),2);
idx2 = Bin_y(:,1)~= 0 & Bin_y(:,8)~= 0;

[A(idx1 & idx2) Bin_y(idx1 & idx2,:)]

 

 

سلام

خب این کد باینری رو برای اعداد اعشاری حساب می کنه، علامت مثبت و منفی یا علامت ممیز رو که نیاز ندارین. نمی دونم درسته با نه، ولی میشه توی یه عدد بزرگی ضرب کرد، بعد باینرشون رو حساب کرد، یه چنین چیزی مثلا:

 

Data = xlsread('Solar-Data.xls');Data = Data(:) * 2^40;
 
Bin_y_cell = arrayfun(@(x) bitget(floor(x),45:-1:1),Data,'Un',0);
Bin_y = cell2mat(Bin_y_cell);


idx1 = ~any(Bin_y(:,1:44) .* Bin_y(:,2:45),2);
idx2 = Bin_y(:,1)~= 0 & Bin_y(:,45)~= 0;


[Data(idx1 & idx2) Bin_y(idx1 & idx2,:)]

 

شما چجوری می خواین عدد ها به باینری تبدیل بشن؟

لینک به دیدگاه
سلام

خب این کد باینری رو برای اعداد اعشاری حساب می کنه، علامت مثبت و منفی یا علامت ممیز رو که نیاز ندارین. نمی دونم درسته با نه، ولی میشه توی یه عدد بزرگی ضرب کرد، بعد باینرشون رو حساب کرد، یه چنین چیزی مثلا:

 

Data = xlsread('Solar-Data.xls');Data = Data(:) * 2^40;
 
Bin_y_cell = arrayfun(@(x) bitget(floor(x),45:-1:1),Data,'Un',0);
Bin_y = cell2mat(Bin_y_cell);


idx1 = ~any(Bin_y(:,1:44) .* Bin_y(:,2:45),2);
idx2 = Bin_y(:,1)~= 0 & Bin_y(:,45)~= 0;


[Data(idx1 & idx2) Bin_y(idx1 & idx2,:)]

 

شما چجوری می خواین عدد ها به باینری تبدیل بشن؟

 

 

 

 

 

برام فرق نمیکنه چجوری باشه. فقط تو مقاله نوشته اعداد باید باینری باشن

این کدی که گذاشتید خروجیش صفره

لینک به دیدگاه
برام فرق نمیکنه چجوری باشه. فقط تو مقاله نوشته اعداد باید باینری باشن

این کدی که گذاشتید خروجیش صفره

 

خب اینا عدد اعشاری هست، نگفته به چه صورت به باینری تبدیل کنین؟

به خاطر این صفر میده، چون فکر کنم تعداد بیت ها رو زیاد گرفتم، بیت با ارزش صفر بشه.

 

گفتم نمی دونم این روشی که میگم درسته یا نه. این معادل باینری به نظر خودتون باید چجوری باشه؟

لینک به دیدگاه
  • 3 هفته بعد...

سلام

عید همه مبارک باشه ان شاءالله

میخوام مدل کار رو تغییر بدم.

 

یه عدد باینری رندوم دارم مثلا به طول 100.

می خوام ببینم از چند تا سکانس تشکیل شده.

 

سکانس: قسمت هایی از عدد باینریمون که بیت اول و آخرشون 1 هست و هیچ دو بیت کنار همیشون 1 نیست.

 

چکار کنم؟

 

 

close all
clear

empty_individual.Position=[];
empty_individual.Cost=[];

pop=repmat(empty_individual,25,1);
Chromosome=randi([0 1],30,1);

for i=1:30
   
   if Chromosome(i)==0
       
   if Chromosome(i)==1 && Chromosome(i+1)~=1
       pop(i)=Chromosom(i);
   else
       
   end
     
   end
end

لینک به دیدگاه
سلام

عید همه مبارک باشه ان شاءالله

میخوام مدل کار رو تغییر بدم.

 

یه عدد باینری رندوم دارم مثلا به طول 100.

می خوام ببینم از چند تا سکانس تشکیل شده.

 

سکانس: قسمت هایی از عدد باینریمون که بیت اول و آخرشون 1 هست و هیچ دو بیت کنار همیشون 1 نیست.

 

چکار کنم؟

 

 

close all
clear

empty_individual.Position=[];
empty_individual.Cost=[];

pop=repmat(empty_individual,25,1);
Chromosome=randi([0 1],30,1);

for i=1:30
   
   if Chromosome(i)==0
       
   if Chromosome(i)==1 && Chromosome(i+1)~=1
       pop(i)=Chromosom(i);
   else
       
   end
     
   end
end

 

سلام

نوشتن کدش سخت نیست.

این عدد باینری رو از همون اعداد اعشاری تون تولید می کنین، حواستون به دقت ممیز شناور که توی محاسبات متلب ازش استفاده می کنه هست، همین فرمت double رو میگم، حدود 16 یا 17 تا از ارقام با ارزش عدد معتبر هستن و رقم های بعد اون رقم های اصلی عددتون نیستن. بیشتر منظورم اینه اگه در عددی ضرب می کنین، اینا رو در نظر بگیرین که عدداتون اشتباه نشن.

 

 

این کد کاری که می خواین رو انجام میده، میاد طول هر کدوم از این سکانس هاتون رو حساب می کنه، بعد این ماتریس طول رو به mat2cell میده تا هر سکانسی رو داخل یکی از cell ها قرار بده:

 

clear;
A = randi([0 1],[1 30]);
idx = find(A);
idx2 = find(diff(idx)==1);

if ~isempty(idx2)
   L =  [idx(idx2(1)) diff(idx(idx2(1:end))) numel(A)-idx(idx2(end))];
   B = mat2cell(A,1,L);
end

لینک به دیدگاه

سلام

 

متشکرم آقا ایمان

متاسفانه این کد، خروجی مورد نظر رو نمیده!

من یه کد دیگه نوشتم

به نظرم منطقش صحیحه

ولی خطا میده!!!

 

 

close all
clear

Array = zeros(30,1);             
Chromosome=randi([0 1],30,1);   

Sequence=0;
for i=1:29 
   
   if chromosome(i)==0
                i=j;
                
                if Chromosome(i)==1 && Chromosome(i+1)~=1
                   Array(i)=Chromosome(i);
                elseif  Chromosome(i)==1 && Chromosome(i+1)==1
            i=i+1;
            
            for j=i+1:29
                
                if Chromosome(j)==0
               Array(j)=Chromosome(j);
                
                else if Chromosome(j)==1
                   Sequence=Sequence+1;
                    end
                end
            end
                end
   end
end
               
           
        
Array

لینک به دیدگاه

بذارید یک مثال بزنم.

 

مثلا این کروموزوم رو داریم: 000110001010011100010000

 

سکانس ها: سه تا صفر اول رو رد میکنیم تا به اولین 1 برسیم چون قراره ابتدا و انتهای هر سکانس، 1 باشه.

اولین 1 رو که دیدیم چک میکنیم که عدد بعدیش 1 هست یا نه، اگر 1 بود باز میریم بیت بعدی چون دو تا 1 کنار هم نباید باشه.

پس میرسیم به بیت پنجم که 1 هست و بیت بعدش هم صفره، حالا اینقدر جلو میریم که به اولین 1 بعدی برسیم. اولین

سکانس میشه: 10001

سکانس های بعدی: 1001

10001

 

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

لینک به دیدگاه
سلام

 

متشکرم آقا ایمان

متاسفانه این کد، خروجی مورد نظر رو نمیده!

من یه کد دیگه نوشتم

به نظرم منطقش صحیحه

ولی خطا میده!!!

 

 

close all
clear

Array = zeros(30,1);             
Chromosome=randi([0 1],30,1);   

Sequence=0;
for i=1:29 
   
   if chromosome(i)==0
                i=j;
                
                if Chromosome(i)==1 && Chromosome(i+1)~=1
                   Array(i)=Chromosome(i);
                elseif  Chromosome(i)==1 && Chromosome(i+1)==1
            i=i+1;
            
            for j=i+1:29
                
                if Chromosome(j)==0
               Array(j)=Chromosome(j);
                
                else if Chromosome(j)==1
                   Sequence=Sequence+1;
                    end
                end
            end
                end
   end
end
               
           
        
Array

 

بذارید یک مثال بزنم.

 

مثلا این کروموزوم رو داریم: 000110001010011100010000

 

سکانس ها: سه تا صفر اول رو رد میکنیم تا به اولین 1 برسیم چون قراره ابتدا و انتهای هر سکانس، 1 باشه.

اولین 1 رو که دیدیم چک میکنیم که عدد بعدیش 1 هست یا نه، اگر 1 بود باز میریم بیت بعدی چون دو تا 1 کنار هم نباید باشه.

پس میرسیم به بیت پنجم که 1 هست و بیت بعدش هم صفره، حالا اینقدر جلو میریم که به اولین 1 بعدی برسیم. اولین

سکانس میشه: 10001

سکانس های بعدی: 1001

10001

 

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

 

سلام

ببخشید، درسته من اصلا حواسم به قسمت اولش نبود.

 

کدی که خودتون نوشتین، متغیر j رو که تعریف نکردین، chromosome یه جا با c رو کوچیک نوشتین. این واسه ارورش، ولی for اینجا جواب نمیده، باید while استفاده کنین. اگه string هم هست فکر کنم می تونین از regexp هم استفاده کنین، جالب تر میشه.

 

فکر کنم این دیگه درست باشه:

 

clear;
% A = [0 0 0 1 1 0 0 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0];
A = randi([0 1],[1 30]);
i = find(A,1,'first');
k = 1;
while i < numel(A)
   if A(i+1) == 1;
       i = i+1;
   else
     i2 = find(A(i+1:end),1,'first')+i;
     if ~isempty(i2)
         B{k,1} = A(i:i2);
         k = k+1;
         i = i2 + 1;
     else
         break;
     end
   end
   if A(i)~=1
       i = find(A(i+1:end),1,'first')+i
   end
end

لینک به دیدگاه

متشکرم

 

بله متوجه خطاش شدم ولی خروجی کد من هم مثل مال شماست

مثلا تو این کروموزوم: 1001001100 سکانس ها رو به این صورت داریم: 1001000100

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

این کد من هم همین خطا رو داره. اونم به این دلیله که تو دستورا میگم اگه 2تا 1 کنار هم بودن، یکی به i اضافه کن و چون آرایه م یه ماتریس zero هست

وقتی i یکی میره جلو، به جاش صفر میاد. در حالی که اگه وقتی اولین بیت سکانس بود و دو تا 1 کنار هم بودند، باید اولی رو صفر کنیم و دومی رو در نظر بگیریم اما

وقتی به انتهای هر سکانس میرسیم، اگه دو تا 1 کنار هم بودن، باید برعکس باشه یعنب اولی 1 و دومی صفر بشه

 

 

close all
clear

Array = zeros(10,1);             
Chromosome=randi([0 1],10,1);   

Sequence=0;
for i=1:9 
   
   for j=i+1:9
   
   if Chromosome(i)==0
                i=i+1;
                
   elseif Chromosome(i)==1 && Chromosome(i+1)~=1
                   Array(i)=Chromosome(i);
   else  Chromosome(i)==1 && Chromosome(i+1)==1
            i=i+1;
            
            
                
                if Chromosome(j)==0
               Array(j)=Chromosome(j);
                
                else if Chromosome(j)==1
                   Sequence=Sequence+1;
                    end
                end
   end
   end
end
                    
                  

               
           
        
Array

   

لینک به دیدگاه
متشکرم

 

بله متوجه خطاش شدم ولی خروجی کد من هم مثل مال شماست

مثلا تو این کروموزوم: 1001001100 سکانس ها رو به این صورت داریم: 1001000100

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

این کد من هم همین خطا رو داره. اونم به این دلیله که تو دستورا میگم اگه 2تا 1 کنار هم بودن، یکی به i اضافه کن و چون آرایه م یه ماتریس zero هست

وقتی i یکی میره جلو، به جاش صفر میاد. در حالی که اگه وقتی اولین بیت سکانس بود و دو تا 1 کنار هم بودند، باید اولی رو صفر کنیم و دومی رو در نظر بگیریم اما

وقتی به انتهای هر سکانس میرسیم، اگه دو تا 1 کنار هم بودن، باید برعکس باشه یعنب اولی 1 و دومی صفر بشه

 

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

 

clear;
A = [1 0 0 1 0 0 1 1 0 0];
i = find(A,1,'first');
k = 1;
while i < numel(A)
   if A(i+1) == 1;
       i = i+1;
   else
     i2 = find(A(i+1:end),1,'first')+i;
     if ~isempty(i2)
         B{k,1} = A(i:i2);
         k = k+1;
         i = i2 + 1;
     else
         break;
     end
   end
   if A(i)~=1
       i = find(A(i+1:end),1,'first')+i
   end
end

B{1}

 

اینم خروجیش:

 

ans =

    1     0     0     1

لینک به دیدگاه

سوال بعد:

 

الان میخوام یه structure تولید کنم که یک قسمت position و یک cost داشته باشه. بعد این سکانس ها رو بریزم توی قسمت position ساختار.

در آخر هم cost سگمنت رو (مجموعه سکانس های یک کروموزوم) محاسبه کنم.

 

empty_individual{nSequence,1}.Position=[]

empty_individual{nSequence,1}.Cost=[]

 

وقتی اینطوری تعریف میکنم، میگه Cell contents assignment to a non-cell array object

لینک به دیدگاه
سوال بعد:

 

الان میخوام یه structure تولید کنم که یک قسمت position و یک cost داشته باشه. بعد این سکانس ها رو بریزم توی قسمت position ساختار.

در آخر هم cost سگمنت رو (مجموعه سکانس های یک کروموزوم) محاسبه کنم.

 

empty_individual{nSequence,1}.Position=[]

empty_individual{nSequence,1}.Cost=[]

 

وقتی اینطوری تعریف میکنم، میگه Cell contents assignment to a non-cell array object

 

 

واسه متغیرهای نوع struct که نمی تونین به صورت cell آدرس دهی کنین، موقعی که آخرین عدد یک بود ارور میداد:

 

clear;
A = [1 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1];
i = find(A,1,'first');
k = 1;
while i < numel(A)
   if A(i+1) == 1;
       i = i+1;
   else
     i2 = find(A(i+1:end),1,'first')+i;
     if ~isempty(i2)
         B(k).Position = A(i:i2);
         k = k+1;
         i = i2 + 1;
     else
         break;
     end
   end
   if i<numel(A)&& A(i)~=1
       i = find(A(i+1:end),1,'first')+i;
   end
end

لینک به دیدگاه

باز هم مشکل

 

میخوام خروجی حلقه قبل رو با k-means کلاستر کنم. باید سکانس های هر کروموزوم یا pop جداگانه کلاستر بشه. چون خروجی از نوع structure هست، k-means قبولش نمیکنه.

بنابراین اول به سلول تبدیلش کردم و بعد به ماتریس که مشکلی پیش نیاد ولی خطا میده! میگه تغییر نوع ممکن نیست!

 

 

clc;
clear;
close all;

%% Chromosome Representation

DecimalData=xlsread('Solar-Data.xls');

DecimalData=vec2mat(DecimalData,1);
[nChro,~]=size(DecimalData);


%% GA Parameters

MaxIt=100;          % Maximum Number of Iterations
nPop=20;            % Population Size

pc=0.8;                 % Crossover Percentage
nc=2*round(pc*nPop/2);  % Number of Offsprings (Parents)

pm=0.3;                 % Mutation Percentage
nm=round(pm*nPop);      % Number of Mutants

mu=0.02;                % Mutation Rate

ANSWER=questdlg('Select the Parent Selection Method:','GA','Random','RWS','TS','RWS');
UseRandomSelection=strcmpi(ANSWER,'Random');
UseRWS=strcmpi(ANSWER,'RWS');
UseTS=strcmpi(ANSWER,'TS');

if UseRWS
   beta=10;                % Selection Pressure
end

if UseTS
   TournamentSize=3;       % Tournament Size
end

pause(0.1);

%% Initialization

% Create Empty Structure
empty_individual.Position=[];
empty_individual.Cost=[];

% Create Population Matrix (Array)
pop=repmat(empty_individual,nPop,1);

% Initialize Population
for j=1:nPop
   
   % Initialize Position
      pop(j).Position=randi([0 1],1,200);
     
   % The Constraints On Chromosomes
   i = find(pop(j).Position,1,'first');
Sequence =1 ;
while i < numel(pop(j).Position)
   if pop(j).Position(i+1) == 1;
       i = i+1;
   else
     i2 = find(pop(j).Position(i+1:end),1,'first')+i;
     if ~isempty(i2)
         TotalSequence(Sequence).Position = pop(j).Position(i:i2);
         TotalSequence=TotalSequence';
         
         TotalSequence(Sequence)=struct2cell(TotalSequence(Sequence));
         TotalSequence(Sequence)=cell2mat(TotalSequence(Sequence));
         
         Sequence = Sequence+1;
         i = i2 + 1;
         
     else
         break;
     end
   end
   if i<numel(pop(j).Position)&& pop(j).Position(i)~=1
       i = find(pop(j).Position(i+1:end),1,'first')+i;
   end
      
   
end


kmeans(TotalSequence(Sequence),3);
      
  
   
end

لینک به دیدگاه

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


×
×
  • اضافه کردن...