我写了以下内容,它获取了最大数字的索引值。
int TravellingSalesMan::getMaximum(double *arr){
double temp = arr[0];
int iterator = 0;
for(int i = 0; i < 30; i++){
if(arr[i] > temp){
iterator = i;
}
}
return iterator;
}
但是输出继续进入条件语句并继续打印出来。我不知道为什么会发生这种情况
我也尝试过使用max_element()但没有运气
修改
以下
调用上述函数static unsigned int chromosome = 30;
double value[chromosome]
for(int i = 0; i < chromosomes; i++){
value[i] = estimateFitness(currPopultaion[i]);
}
int best = 0;
best = getMaximum(value);
cout<<best<<endl; // this just prints out 29
答案 0 :(得分:2)
当您找到新的最大值时,您应该为temp
分配一个新值。
int TravellingSalesMan::getMaximum(double *arr){
double temp = arr[0];
int iterator = 0;
for(int i = 0; i < 30; i++){
if(arr[i] > temp){
iterator = i;
temp = arr[i]; // this was missing
}
}
return iterator;
}
如果没有这个,你会发现一个值的最大索引大于索引零处的值。
更好的解决方案是简单地使用std::max_element。在大多数(如果不是全部)需要迭代器的算法中,指针可以用作迭代器。
#include <algorithm>
static unsigned int chromosomes = 30;
double value[chromosomes];
for (int i=0; i<chromosomes; ++i) {
value[I] = estimate_fitness(current_population[i]);
}
double *max_elm = std::max_element(&value[0], &value[chromosomes]);
int best = int(max_elm - &value[0]);
std::cout << best << std::endl;
答案 1 :(得分:2)
好的,所以我没有计划写答案,但我在代码中看到太多逻辑错误让我在评论部分写下来了!
首先,您使用变量名称
iterator
非常 错误。它不用于列表上的迭代。为什么会造成混乱。最好使用类似max_index
之类的东西。
为什么从
i=0
开始?您的临时值为arr[0]
,因此没有用处。再次检查第一个元素。从i = 1开始!
temp
在该功能中毫无意义。最大索引最初应为0
,如果某些i
大于arr[i]
,则设置为arr[max_index]
。
将长度分别传递给函数是更好的编码,因为它使代码更清晰。
arr
中的内容未被修改,因此比抱歉更安全:制作指针const
。
重写代码,应该是:
int TravellingSalesMan::getMaximum(const double *arr,int len)
{
int max_index = 0;
for(int i = 1; i < len; i++)
{
if(arr[i] > arr[max_index])
max_index = i;
}
return max_index;
}
值得注意,但在上面的代码中,len
,i
和 all 的函数结果应该是无符号整数类型。没有理由允许签名整数索引,因此如果他们通过硬指定unsigned
或仅size_t
作为索引变量类型来使其成为警告条件。