一个排序有关问题,大家都来看看
一个排序问题,大家都来看看,
一个排序问题,大家都来看看,
这周做了一个蚁群算法的演示程序,用MFC 做的,看起来很好玩啊,比他们dos窗口中做的好看多啦,可是效率没有人家高,他们的50多个蚂蚁机器还不卡,我的有20的时候,就卡的不行了,今天终于把算法写完了, 不过有几个了问题,大多都是排序的问题,贴在这里,大家讨论一下,看谁的算法好,我的写的感觉太麻烦了,而且不清晰,大家都想一下啊
分离出一个小问题:
从数组 int a[8] 找到一个符合以下三点的数 ,返回这个数的索引号(注意是返回索引号) 注:(原数组数值未排序)
1 谁的值最大,就取谁的索引号 (这个当然啦)
2 这个数要可以被3整除,如果最大值都不可以,则取第二大的数,依次类推,如果数组内的数都不可以被3整除,则返回符合以上一点的数的索引号。
2 任何情况下,如果出现多项符合条件的(如多个最大值,最大值里面又有多个能被3整除的),随机取一个,(注意这个是重点,也是难点,因为你要知道,最大值有几个,而且是要随机,这是本程序的重点)
这是从我的程序里分离出来的一个问题,哈哈,不知道,大家都看没看明白,问题原型是这样的,蚂蚁在走下一步的时候,要检测周围的8个坐标点,取以下条件
可以到达,
信息素最高
不要和走过的坐标重复,全部重复,则取最早走过的点。
任何情况下,出现多项符合条件的。随机取(这个最头疼)
还有啊,大家回贴的时候,最好不要回复,,以下格试的
XXXXXXXXXXXXXXXXXX不就行吗,XXXXXXXXXXXXXXXXXXXXX不就可以了吗,
最好动手写一下,不然,你体会不到乐趣的(或是头疼),,,
------解决方案--------------------
#include <iostream>
#include <ctime>
#include <map>
using namespace std;
int BestChoice(int a[], int arraySize)
{
multimap <int, int> mm;
for(int i=0; i <arraySize; i++)
mm.insert(pair <int, int> (a[i], i));
multimap <int,int> ::reverse_iterator p=mm.rbegin();
while(p!=mm.rend() && p-> first%3 != 0) p++;
if(p==mm.rend()) p=mm.rbegin(); // didn 't find the proper value, so choose the biggest one
int nC = mm.count(p-> first);
if(nC==1) return p-> second;
int magicN = rand()%nC;
for(int i=0; i <magicN; i++) p++;
return p-> second;
}
int main()
{
int n[8];
srand ( time(NULL) );
for(;;) {
for(int i=0; i <8; i++)
{
n[i] = rand()%10+1;
cout < < n[i] < < " ";
}
cout < < endl;
int a = BestChoice(n, 8);
cout < < a < < endl;
system( "pause ");
}
return 0;
}
------解决方案--------------------
给个建议少用rand()。
这样的东西太慢了
n[i] = rand()%10+1;
又是rand(),又是%
最好两个都优化了。
想想有什么办法。
------解决方案--------------------
帮顶不就行吗,帮顶不就可以了吗
一个排序问题,大家都来看看,
这周做了一个蚁群算法的演示程序,用MFC 做的,看起来很好玩啊,比他们dos窗口中做的好看多啦,可是效率没有人家高,他们的50多个蚂蚁机器还不卡,我的有20的时候,就卡的不行了,今天终于把算法写完了, 不过有几个了问题,大多都是排序的问题,贴在这里,大家讨论一下,看谁的算法好,我的写的感觉太麻烦了,而且不清晰,大家都想一下啊
分离出一个小问题:
从数组 int a[8] 找到一个符合以下三点的数 ,返回这个数的索引号(注意是返回索引号) 注:(原数组数值未排序)
1 谁的值最大,就取谁的索引号 (这个当然啦)
2 这个数要可以被3整除,如果最大值都不可以,则取第二大的数,依次类推,如果数组内的数都不可以被3整除,则返回符合以上一点的数的索引号。
2 任何情况下,如果出现多项符合条件的(如多个最大值,最大值里面又有多个能被3整除的),随机取一个,(注意这个是重点,也是难点,因为你要知道,最大值有几个,而且是要随机,这是本程序的重点)
这是从我的程序里分离出来的一个问题,哈哈,不知道,大家都看没看明白,问题原型是这样的,蚂蚁在走下一步的时候,要检测周围的8个坐标点,取以下条件
可以到达,
信息素最高
不要和走过的坐标重复,全部重复,则取最早走过的点。
任何情况下,出现多项符合条件的。随机取(这个最头疼)
还有啊,大家回贴的时候,最好不要回复,,以下格试的
XXXXXXXXXXXXXXXXXX不就行吗,XXXXXXXXXXXXXXXXXXXXX不就可以了吗,
最好动手写一下,不然,你体会不到乐趣的(或是头疼),,,
------解决方案--------------------
#include <iostream>
#include <ctime>
#include <map>
using namespace std;
int BestChoice(int a[], int arraySize)
{
multimap <int, int> mm;
for(int i=0; i <arraySize; i++)
mm.insert(pair <int, int> (a[i], i));
multimap <int,int> ::reverse_iterator p=mm.rbegin();
while(p!=mm.rend() && p-> first%3 != 0) p++;
if(p==mm.rend()) p=mm.rbegin(); // didn 't find the proper value, so choose the biggest one
int nC = mm.count(p-> first);
if(nC==1) return p-> second;
int magicN = rand()%nC;
for(int i=0; i <magicN; i++) p++;
return p-> second;
}
int main()
{
int n[8];
srand ( time(NULL) );
for(;;) {
for(int i=0; i <8; i++)
{
n[i] = rand()%10+1;
cout < < n[i] < < " ";
}
cout < < endl;
int a = BestChoice(n, 8);
cout < < a < < endl;
system( "pause ");
}
return 0;
}
------解决方案--------------------
给个建议少用rand()。
这样的东西太慢了
n[i] = rand()%10+1;
又是rand(),又是%
最好两个都优化了。
想想有什么办法。
------解决方案--------------------
帮顶不就行吗,帮顶不就可以了吗