2013-02-13 2 views
1

Я в процессе кодирования просто Genetic Algorithm (GA). Есть, вероятно, бесчисленные области, где я излишне использовал цикл for. Я хотел бы получить несколько советов о том, как быть более эффективным MATLAB, а также отвечать на мой вопрос. Насколько я могу судить, я преуспел, но я не уверен. Область, которая определяет этот код является одноточечной crossoverКак я могу поменять часть строки на другую в массиве?

Вот что я пытался ...

crossPoints=randi([1 24],popSize/2,1); 

for popNo=2:2:popSize 
    isolate=chromoParent(popNo-1:popNo,crossPoints(popNo/2,1)+1:end); 
    isolate([1 2],:)=isolate([2 1],:); 
    chromoParent(popNo-1:popNo,crossPoints(popNo/2,1)+1:end)=isolate; 
end 

chromoChild=chromoParent; 
  • где «» точками пересечения является точкой, в которой одна точке пересечения между двумя бинарными кодируется chromosomes.
  • «popSize» является размер population, требует мой код, чтобы быть четным числом
  • «изолят» определяет секции 2 строки, которые необходимы для быть выгружена друг с другом
  • «chromoParent 'является начальная популяция, которая требуется, чтобы быть изменен одноточечного кроссовера
  • „chromoChild“ является полученное население
  • и „chromoParent“ и „chromoChild“ представлены массив размера, popSize х 25 двоичные символы

Вы можете обнаружить ошибку в том, как я думаю об этой проблеме? Каков наиболее эффективный способ (в вычислительном времени) достичь того же? Это помогло бы, если бы вы были как можно более широкими, чтобы я мог начать применять принципы, которые я изучаю здесь, для остальной части моего кода.

спасибо.

ответ

2

Ваш код выглядит хорошо. Если вы хотите, вы можете уменьшить инструкции в цикле к одной строке некоторой очень простой индексация:

chromoParent( popNo-1:popNo, crossPoints(popNo/2,1)+1:end) = ... 
    chromoParent(popNo:-1:popNo-1,crossPoints(popNo/2,1)+1:end); 

Это может быть немного быстрее, но, как и любой оптимизация, вы должны профилем его первым (Я думаю, что эта линия очень мало влияет на общее время процессора).

+0

Не уверен, что вы подразумеваете под «вы должны сначала его профиль». Если это простая концепция, вы можете сообщить мне об этом? Или, если это более активно, возможно, вы могли бы указать мне хороший ресурс. Спасибо. –

+2

@DeanKayton: Когда вы просматриваете код, вы измеряете время выполнения для каждой строки, что позволяет идентифицировать узкие места в вашем коде. [Вот ссылка на документацию к профилировщику Matlab] (http://www.mathworks.com/help/matlab/matlab_prog/profiling-for-improving-performance.html) – Jonas

Смежные вопросы