房间分配问题

denghui0815 2007-12-08 02:03:40
写了个精确查找的算法 32个学生T2050上单线程 2秒 用TTB 1秒多
核心算法如下

递归调用

void FindBestComb(int* pIndexAry, int nPos, int nStudent, int fCur, int* pMin, int** ppAppetency)
{
int i,j,nTmp;
int fTmp;
if(nPos + 2 == nStudent)
{
fCur += ppAppetency[pIndexAry[nPos]][pIndexAry[nPos+1]];
if(*pMin > fCur) *pMin = fCur;
}
else
{
for(i = nPos + 1; i < nStudent; ++i)
{
fTmp = fCur + ppAppetency[pIndexAry[nPos]][pIndexAry[nPos + 1]];
if(fTmp < *pMin) FindBestComb(pIndexAry, nPos+2, nStudent, fTmp, pMin, ppAppetency);
nTmp = pIndexAry[nPos+1];
for(j = nPos+1; j < nStudent-1; ++j) pIndexAry[j] = pIndexAry[j+1];
pIndexAry[nStudent-1] = nTmp;
}
}
}
...全文
529 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
OpenHero 2007-12-25
  • 打赏
  • 举报
回复
2^20 students 3.76351 seconds
OpenHero 2007-12-25
  • 打赏
  • 举报
回复
core(TM)2 CPU 6300 1.86 GHz
denghui0815 2007-12-24
  • 打赏
  • 举报
回复
终于有了新的突破 在2路双核cpu = 4核cpu 上的结果

20480000个学生

The initial Disharmony is 4095697.365000
Time to compute room assignments is 42.23 seconds
Final Disharmony is 2587629.605000

目前已经没有使用模拟退火算法了
haojn 2007-12-24
  • 打赏
  • 举报
回复
写一下srand的种子值和学生数就唯一确定了
denghui0815 2007-12-24
  • 打赏
  • 举报
回复
我昏 1.2G的数据 没办法发啊
你用我提供那个函数构造就可以了
modnar 2007-12-24
  • 打赏
  • 举报
回复
数据发出来看看
denghui0815 2007-12-24
  • 打赏
  • 举报
回复
进一步提高
The initial Disharmony is 4095697.365000
Time to compute room assignments is 15.71 seconds
Final Disharmony is 2615698.235000
denghui0815 2007-12-15
  • 打赏
  • 举报
回复
用了TBB SSE 计算结果基本上都不是最小值 能到原值的70%左右就不错了
denghui0815 2007-12-15
  • 打赏
  • 举报
回复
用了TBB SSE 计算结果基本上都不是最小值 能到原值的70左右就不错了
kelkch 2007-12-14
  • 打赏
  • 举报
回复
9楼

我也怀疑最小值此点. 足够大的总数不保证能在有限时间内完成.
kelkch 2007-12-14
  • 打赏
  • 举报
回复
10楼

题目基本上是叫你用TBB, Intel出的SDK, 入门之后感觉还行. :)
clasj 2007-12-13
  • 打赏
  • 举报
回复
请问楼主,你的退火算法能直接找到最小值么?我在网上找到的退火算法怎么只能尽量小啊,火退完了也不一定得到最小值。既然不一定得到最小值,那对于这个题目来说还有没有意义啊?
denghui0815 2007-12-13
  • 打赏
  • 举报
回复
提供一个构造测试数据的函数


void XCreateTestData(int nStudent)
{
char szName[62]={0};

FILE* fp = fopen("Students.in", "w");

szName[10] = ' ';

if(fp != NULL)
{
fprintf(fp, "%d\n", nStudent);

for(int i = 0; i < nStudent; ++i)
{
for(int j = 0; j < 10; ++j) szName[j] = (rand() % 60) + '0';
for(int j = 11; j < 61; ++j) szName[j] = (rand() % 5) + '0';
fprintf(fp, "%s\n", szName);
}

fclose(fp);
}
}
denghui0815 2007-12-11
  • 打赏
  • 举报
回复
呵呵 这个算法是公布题目前做的 所以做成了精确解 也没考虑效率

现在提交的用了模拟退火 但是好像超过50万学生的数据就基本上很难在120秒内收敛了

看来还要优化啊
kelkch 2007-12-10
  • 打赏
  • 举报
回复
想请问你们是怎样设定TBB的? 我连个GettingStarted都编译不过去.
hisome 2007-12-09
  • 打赏
  • 举报
回复
首先说明,我还没写什么代码,还没有思路,正在研究

对你算法的质疑:

学生数N将是一个小于 2^28 - 1 的偶数,所以你的时间是不可接受的,即使换高档机器好像也没有用
那么你的算法就是没有优化的,所谓的精确查找大约,没有什么用处。
感觉这里的精确查找不过是穷举法,数据少时,可以一用

说得不对的请多指教,有冒犯的地方,请原谅
zyx0507 2007-12-09
  • 打赏
  • 举报
回复
楼主的算法很高深啊,大概明白了一点.这种精确查找都用在什么地方啊.学习一下.
OpenHero 2007-12-09
  • 打赏
  • 举报
回复
呵呵
lz可以用SSE 和 OpenMP*效率会更高:)嘿嘿
trublemaker 2007-12-08
  • 打赏
  • 举报
回复
直接把源程序都贴上来让大家看看,呵呵 

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧