private String Mutation(String s)
{
int pos = 0;
for (int n = 0; n < 5; n++)
{
pos = r.Next() % 31;
if (s.Substring(pos, 1) == "0")
s = s.Remove(pos, 1).Insert(pos, "1");
else
s = s.Remove(pos, 1).Insert(pos, "0");
}
return s;
}
Как правильней работать со строками?
Вот значит делаю 5-точечную мутацию. Хромосома храницца в строке. Может кто подскажет, как это записать нормальным языком, а то мне этот код не особо нравицца:
Код:
if (s.Substring(pos, 1) == "0")
можно:
Код:
if(s[pos] == '0')
Код:
[SIZE=2][COLOR=#0000ff][FONT=Courier New]private [/FONT][/COLOR][/SIZE][FONT=Courier New][SIZE=2][COLOR=#008080]String[/COLOR][/SIZE][SIZE=2] Mutation([/SIZE][SIZE=2][COLOR=#008080]String[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] s)[/FONT]
[FONT=Courier New]{[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] for[/COLOR][/SIZE][SIZE=2] ([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] n = 0; n < 5; n++)[/FONT]
[FONT=Courier New] {[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] int[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] pos = r.Next() % 31;[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] string[/COLOR][/SIZE][SIZE=2] temp = [/SIZE][SIZE=2][COLOR=#800000]"0"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New];[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] if[/COLOR][/SIZE][SIZE=2] (s[pos] == [/SIZE][SIZE=2][COLOR=#800000]'0'[/COLOR][/SIZE][SIZE=2]) temp = [/SIZE][SIZE=2][COLOR=#800000]"1"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New];[/FONT]
[FONT=Courier New] s = s.Remove(pos, 1).Insert(pos, temp);[/FONT]
[FONT=Courier New] }[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] return[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] s;[/FONT]
[FONT=Courier New]}[/FONT]
[/SIZE]
[FONT=Courier New]{[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] for[/COLOR][/SIZE][SIZE=2] ([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] n = 0; n < 5; n++)[/FONT]
[FONT=Courier New] {[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] int[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] pos = r.Next() % 31;[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] string[/COLOR][/SIZE][SIZE=2] temp = [/SIZE][SIZE=2][COLOR=#800000]"0"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New];[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] if[/COLOR][/SIZE][SIZE=2] (s[pos] == [/SIZE][SIZE=2][COLOR=#800000]'0'[/COLOR][/SIZE][SIZE=2]) temp = [/SIZE][SIZE=2][COLOR=#800000]"1"[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New];[/FONT]
[FONT=Courier New] s = s.Remove(pos, 1).Insert(pos, temp);[/FONT]
[FONT=Courier New] }[/FONT]
[/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff] return[/COLOR][/SIZE][/FONT][SIZE=2][FONT=Courier New] s;[/FONT]
[FONT=Courier New]}[/FONT]
[/SIZE]
Насчет r: это поле типа [color="#008080"]Random[/color]
Еще вопросик: Что лучше в плане оптимальности [color="#008080"]String[/color] или [color="#008080"]Char[/color][]?
Код:
private string Mutation(string s)
{
StringBuilder str = new StringBuilder(s);
for (int n = 0; n < 5; n++)
{
int pos = r.Next() % 31;
str[pos] = str[pos] == '0' ? '1' : '0';
}
return str.ToString();
}
{
StringBuilder str = new StringBuilder(s);
for (int n = 0; n < 5; n++)
{
int pos = r.Next() % 31;
str[pos] = str[pos] == '0' ? '1' : '0';
}
return str.ToString();
}
Как бы то ни было странным, работа с массивом напрямую быстрее всего. Поэтому классические циклы for быстрее чем удобные foreach. Поэтому что String, что StringBuilder для индексации применяют доступ к массиву символов типа Char[], что уже быстрее чем сам Char[] быть не может. Замерить производительность можно различными Perfomance Counter'ами.
А я и не спорю. Но зачем изобретать велосипед (по сути перегоняя строку в char[], а потом наоборот), когда есть уже готовое и очень удобное решение? Ну если только предложить автору топика переделать программу с о string на Char[]? ;)