本文忽略了对于模拟退火的算法的理论讲解,读者可参考相关的博文或者其他相关资料,本文着重于算法的实现:
  1. /*****************************************************************************
  2. ** Copyright: NEW NEU laboratory
  3. ** File name: SA_工作指派问题
  4. ** Description:模拟退火算法解决工作指派问题
  5. ** Author: 1702--GCJ
  6. ** Version: 1.0
  7. ** Date: 2017/10/4
  8. ** History: 无
  9. *****************************************************************************/
  10.  
  11. #include"stdio.h"
  12. #include"stdlib.h"
  13. #include"string.h"
  14. #include "time.h"
  15. #include "math.h"
  16.  
  17. /*----------------------------------------------------
  18. @brief 参数配置区
  19. */
  20. #define WORK_NUM 100 //工作数量
  21. #define WORKER_NUM 100 //工人数量
  22. #define INIT_TEM (60 + WORK_NUM * 10) //初始温度
  23. #define END_TEM 60 //终止温度
  24. #define De_TEM 2 //降温函数
  25. #define INTER_WHILE 500 //内循环次数 类似于邻居个数
  26.  
  27. typedef int ElementType;
  28. ElementType **Time; //存储工人工作时间 指针
  29. ElementType CurrentTem; //当前温度
  30.  
  31. //定义解的存储类型 向量形式
  32. typedef struct _Solve{
  33. ElementType *initSolution; //初始解 //每个元素对应的序号表示工人 总序号表示工人总数 内部元素表示工人对应的工作
  34. ElementType *currentSolution; //当前解
  35. ElementType * optimalSolution; //最优解
  36. ElementType *tempSolution; //临时解
  37. ElementType OptimalSolutionValue; //记录最优解 (总时间)
  38. ElementType CurrentSolutionValue; //记录上次的值
  39. ElementType NextSolutionValue ; //记录交换后的总时间
  40.  
  41. }StrSolve;//存储解结构
  42.  
  43. StrSolve * SolutionSpace ; //解空间(包含当前解和初始解)指针
  44.  
  45. typedef struct _Tabu{
  46. int smallNum;
  47. int bigNum; //存储数量大的元素
  48. }Tabu; //禁忌表结构
  49.  
  50. typedef struct _MotionTable{
  51. Tabu tabu; //存储改变的元素
  52. ElementType changedistance; //改变的距离
  53. }MotionTable;//记录2opt邻域移动信息
  54.  
  55. /*************************************************
  56. **Function: MemBlockWork
  57. **Description: 申请存储工人工作时间的空间
  58. **Calls: 无
  59. **Called By: ReadDataTxt()
  60. **Input: 无
  61. **Output: 无
  62. **Return: 指向存储工人工作时间的指针
  63. **Others: 无
  64. *************************************************/
  65. ElementType ** MemBlockWork();
  66.  
  67. /*************************************************
  68. **Function: ReadDataTxt
  69. **Description: 从txt文档中读取工人工作时间数据
  70. **Calls: MemBlockWork()
  71. **Called By: main()
  72. **Input: 无
  73. **Output: 无
  74. **Return: void
  75. **Others: 里面直接用的全局变量 指针Time
  76. *************************************************/
  77. void ReadDataTxt();
  78.  
  79. /*************************************************
  80. **Function: CreateSolutionSpace
  81. **Description: 创建并初始化解空间
  82. **Calls: 无
  83. **Called By: Init2Opt()
  84. **Input: worker_num 工人数量
  85. **Output: 无
  86. **Return: StrSolve *指针变量
  87. **Others: 不用这块内存的时候要逐一释放掉 !
  88. *************************************************/
  89. StrSolve *CreateSolutionSpace(int worker_num);
  90.  
  91. /*************************************************
  92. **Function: GetInitSolution
  93. **Description: 获得初始解
  94. **Calls: 无
  95. **Called By: Init2Opt()
  96. **Input: StrSolve * 指针变量
  97. **Output: 无
  98. **Return: StrSolve *指针变量
  99. **Others: 这里在初始化解的时候可以用其他元启发式算法得出一个较好的解 ! 工人工作不能重复及数组空间的数字不能重复
  100. *************************************************/
  101. void GetInitSolution(StrSolve * strSolve);
  102.  
  103. /*************************************************
  104. **Function: Get2optSolution
  105. **Description: 得到1个2邻域解 用tempSolution来存储
  106. **Calls:
  107. **Called By: SA()
  108. **Input: solutionSpace 解空间指针
  109. **Output: 无
  110. **Return: void
  111. **Others: 随机数要注意!
  112. *************************************************/
  113. void Get2optSolution( StrSolve * solutionSpace );
  114.  
  115. /*************************************************
  116. **Function: Init2Opt
  117. **Description: 初始化SA需要用的值
  118. **Calls: CreateSolutionSpace() GetInitSolution()
  119. **Called By: main()
  120. **Input: 无
  121. **Output: 无
  122. **Return: void
  123. **Others: 这里在初始化解的时候可以用其他元启发式算法得出一个较好的解 ! 不知道为什么只能在Main函数中调用否则 会出现段错误
  124. *************************************************/
  125. void Init2Opt();
  126.  
  127. /*************************************************
  128. **Function: GetSumTime
  129. **Description: 获取当前解的总工作时间
  130. **Calls:
  131. **Called By: SA()
  132. **Input: distance 存储工人工作时间的矩阵指针 Solution 解指针
  133. **Output: 无
  134. **Return: 总工作时间
  135. **Others: 里面用到了WORKER_NUM 宏
  136. *************************************************/
  137. int GetSumTime( ElementType **distance,ElementType * Solution);
  138.  
  139. /*************************************************
  140. **Function: SA
  141. **Description: 模拟退火算法
  142. **Calls: GetSumTime() Get2optSolution() memcpy() rand() exp()
  143. **Called By: main()
  144. **Input: solutionSpace 解空间指针
  145. **Output: 最优值信息 工人工作分配
  146. **Return: 无
  147. **Others:
  148. *************************************************/
  149. void SA( StrSolve *solutionSpace);
  150.  
  151. /*************************************************
  152. **Function: MemFree
  153. **Description: 释放申请的动态内存
  154. **Calls: free()
  155. **Called By: main()
  156. **Input: distance 存储工人工作时间矩阵 strSolve 解空间的指针
  157. **Output: 无
  158. **Return: void
  159. **Others: 这里也可以一步一步的释放掉 各自的指针 因为就用一个.c所以释放内存的操作都在这里进行
  160. *************************************************/
  161. void MemFree(ElementType ** distance,StrSolve *strSolve);
  162.  
  163. /*******************************************************************************MAIN函数*************************************/
  164. int main(int argc,char *argv[])
  165. {
  166. clock_t start, finish;
  167. double duration;
  168.  
  169. //设置随机数种子 为以后使用rand()做准备
  170. srand((unsigned int)time());
  171. Init2Opt();
  172.  
  173. //从读取数据开始的起始时间
  174. start = clock();
  175.  
  176. //将工人工作时间的数据存储到Time指向的空间中
  177. ReadDataTxt(Time);
  178.  
  179. //模拟退火算法开始
  180. SA(SolutionSpace);
  181.  
  182. //第二次用模拟退火
  183. // memcpy( SolutionSpace->currentSolution,SolutionSpace->optimalSolution,sizeof(ElementType)*WORKER_NUM );
  184. // memcpy( SolutionSpace->initSolution,SolutionSpace->optimalSolution,sizeof(ElementType)*WORKER_NUM );
  185. // memcpy( SolutionSpace->tempSolution,SolutionSpace->optimalSolution,sizeof(ElementType)*WORKER_NUM );
  186. // GetInitSolution(SolutionSpace);//初始化解
  187. // SA(SolutionSpace);
  188.  
  189. //结束时间
  190. finish = clock();
  191. duration = (double)(finish - start) / CLOCKS_PER_SEC;
  192. printf("\n SA算法运行时间:%.4f秒 \n",duration);
  193.  
  194. //释放申请的内存
  195. MemFree(Time,SolutionSpace);
  196.  
  197. return ;
  198. }
  199.  
  200. /*************************************************
  201. **Function: MemBlockWork
  202. **Description: 申请存储工人工作时间的空间
  203. **Calls: 无
  204. **Called By: ReadDataTxt()
  205. **Input: 无
  206. **Output: 无
  207. **Return: 指向存储工人工作时间的指针
  208. **Others: 无
  209. *************************************************/
  210. ElementType ** MemBlockWork()
  211. {
  212. ElementType ** Distance;
  213. int i=;
  214.  
  215. //动态申请一块内存存储工人工作时间
  216. Distance = (ElementType **)malloc(sizeof(ElementType *)* WORKER_NUM);
  217. for(i = ;i< WORKER_NUM; i++){
  218. Distance[i] = (ElementType *)malloc(sizeof (ElementType )* WORK_NUM);
  219. }
  220. return Distance;
  221. }
  222.  
  223. /*************************************************
  224. **Function: ReadDataTxt
  225. **Description: 从txt文档中读取工人工作时间数据
  226. **Calls: MemBlockWork()
  227. **Called By: main()
  228. **Input: 无
  229. **Output: 无
  230. **Return: void
  231. **Others: 里面直接用的全局变量 指针Time
  232. *************************************************/
  233. void ReadDataTxt()
  234. {
  235. // FILE *fpRead=fopen("F:\\GCJ\\Desktop\\智能优化方法作业\\data.txt","r");
  236. FILE *fpRead=fopen("data.txt","r"); //从data.txt中读取数据
  237. int i,j;
  238. if(fpRead==NULL){
  239. printf("open file data.txt failed!\n");
  240. exit();
  241. }
  242. Time = MemBlockWork(); //申请一块存储城市数量空间
  243. for( i = ;i < WORKER_NUM; i++ ){
  244. for(j= ;j < WORK_NUM ;j++ ){
  245. fscanf(fpRead,"%d",&Time[i][j]);//自动读取数据 只要自己能够控制好存储位置即可
  246. // printf("Time[%d][%d] = %d ",i,j,Time[i][j]);
  247. }
  248. }
  249. fclose(fpRead);
  250. }
  251.  
  252. /*************************************************
  253. **Function: CreateSolutionSpace
  254. **Description: 创建并初始化解空间
  255. **Calls: 无
  256. **Called By: Init2Opt()
  257. **Input: worker_num 工人数量
  258. **Output: 无
  259. **Return: StrSolve *指针变量
  260. **Others: 不用这块内存的时候要逐一释放掉 !
  261. *************************************************/
  262. StrSolve *CreateSolutionSpace(int worker_num)
  263. {
  264. int i;
  265. StrSolve *strSolve = (StrSolve *)malloc( sizeof(StrSolve) ) ;
  266. strSolve->initSolution = ( ElementType *)malloc(sizeof(ElementType)* worker_num );
  267. strSolve->currentSolution = ( ElementType *)malloc(sizeof(ElementType)* worker_num );
  268. strSolve->optimalSolution = ( ElementType *)malloc(sizeof(ElementType)* worker_num );
  269. strSolve->tempSolution = ( ElementType *)malloc(sizeof(ElementType)* worker_num );
  270.  
  271. //初始化解空间
  272. for(i = ;i< worker_num;i++){
  273. strSolve->initSolution[i] = (ElementType);
  274. strSolve->currentSolution[i] = (ElementType);
  275. strSolve->optimalSolution[i] = (ElementType);
  276. strSolve->tempSolution[i] = (ElementType);
  277. }
  278. strSolve->CurrentSolutionValue = ;
  279. strSolve->NextSolutionValue = ;
  280. strSolve->OptimalSolutionValue = ;
  281.  
  282. return strSolve;
  283. }
  284.  
  285. /*************************************************
  286. **Function: GetInitSolution
  287. **Description: 获得初始解
  288. **Calls: 无
  289. **Called By: Init2Opt()
  290. **Input: StrSolve * 指针变量
  291. **Output: 无
  292. **Return: StrSolve *指针变量
  293. **Others: 这里在初始化解的时候可以用其他元启发式算法得出一个较好的解 ! 工人工作不能重复及数组空间的数字不能重复
  294. *************************************************/
  295. void GetInitSolution(StrSolve * strSolve)
  296. {
  297. int i;
  298. //产生0- WORK_NUM-1 (工作数量减1) 之间的随机数不能重复
  299. //默认从0号工作顺序开始
  300. for( i = ;i < WORKER_NUM;i++){
  301. strSolve->initSolution[i] = i;
  302. strSolve->currentSolution[i] = i;
  303. strSolve->optimalSolution[i] = i;
  304. strSolve->tempSolution[i] = i;
  305. }
  306.  
  307. }
  308.  
  309. /*************************************************
  310. **Function: Get2optSolution
  311. **Description: 得到1个2邻域解 用tempSolution来存储
  312. **Calls:
  313. **Called By: SA()
  314. **Input: solutionSpace 解空间指针
  315. **Output: 无
  316. **Return: void
  317. **Others: 随机数要注意!
  318. *************************************************/
  319. void Get2optSolution( StrSolve * solutionSpace )
  320. {
  321. //产生一个 0 - - WORKER-1之间的随机数 表示交换工人对应的工作数 [0,WORKER)
  322. MotionTable motiontable;
  323. ElementType temp;
  324. // ElementType changeDistance;
  325. int rand1,rand2;
  326. // rand1 = (CityNum-1) *rand()/(RAND_MAX + 1.0);
  327. rand1 = rand()%WORKER_NUM; //[0,WORKER_NUM)
  328. rand2 = rand()%WORKER_NUM;
  329. while( rand2 == rand1 ) //必须产生两个不同的随机数
  330. rand2 = rand()%WORKER_NUM;
  331.  
  332. //记录交换的两个工人编号
  333. motiontable.tabu.smallNum = (rand2 >rand1)? rand1:rand2;
  334. motiontable.tabu.bigNum = (rand2 >rand1)? rand2:rand1;
  335.  
  336. //更新当前解 //用临时解作为j解
  337. temp = solutionSpace->tempSolution[ motiontable.tabu.smallNum ];
  338. solutionSpace->tempSolution[ motiontable.tabu.smallNum] = solutionSpace->tempSolution[ motiontable.tabu.bigNum ];
  339. solutionSpace->tempSolution[ motiontable.tabu.bigNum ] = temp;
  340.  
  341. // motiontable->changedistance = Get2OptChangeDistance( &motiontable->tabu ,strSolve->tempSolution );
  342.  
  343. }
  344.  
  345. /*************************************************
  346. **Function: Init2Opt
  347. **Description: 初始化SA需要用的值
  348. **Calls: CreateSolutionSpace() GetInitSolution()
  349. **Called By: main()
  350. **Input: 无
  351. **Output: 无
  352. **Return: void
  353. **Others: 这里在初始化解的时候可以用其他元启发式算法得出一个较好的解 ! 不知道为什么只能在Main函数中调用否则 会出现段错误
  354. *************************************************/
  355. void Init2Opt()
  356. {
  357. SolutionSpace = CreateSolutionSpace(WORKER_NUM);//创建解空间
  358. GetInitSolution(SolutionSpace);//初始化解
  359. }
  360.  
  361. /*************************************************
  362. **Function: GetSumTime
  363. **Description: 获取当前解的总工作时间
  364. **Calls:
  365. **Called By: SA()
  366. **Input: distance 存储工人工作时间的矩阵指针 Solution 解指针
  367. **Output: 无
  368. **Return: 总工作时间
  369. **Others: 里面用到了WORKER_NUM 宏
  370. *************************************************/
  371. int GetSumTime( ElementType **distance,ElementType * Solution)
  372. {
  373. //只要保证Solution 里面的值不一样即可算出
  374. int i;
  375. int SumLevel = ;
  376. for(i = ; i < WORKER_NUM ; i++){
  377. SumLevel += distance[ i ][ Solution[i] ];
  378. }
  379.  
  380. return SumLevel;
  381. }
  382.  
  383. /*************************************************
  384. **Function: SA
  385. **Description: 模拟退火算法
  386. **Calls: GetSumTime() Get2optSolution() memcpy() rand() exp()
  387. **Called By: main()
  388. **Input: solutionSpace 解空间指针
  389. **Output: 最优值信息 工人工作分配
  390. **Return: 无
  391. **Others:
  392. *************************************************/
  393. void SA( StrSolve *solutionSpace)
  394. {
  395. int i;//当前内循环次数
  396. ElementType ChangeValue = ;
  397. double rand1;
  398.  
  399. //更新初始值和最优解/值
  400. solutionSpace->OptimalSolutionValue = GetSumTime( Time,solutionSpace->initSolution );
  401. solutionSpace->CurrentSolutionValue = solutionSpace->OptimalSolutionValue;
  402. // memcpy( solutionSpace->optimalSolution,solutionSpace->initSolution,sizeof(ElementType)* WORKER_NUM );//初始化的时候已经完成
  403.  
  404. //设定当前温度为初始温度
  405. CurrentTem = INIT_TEM;
  406. while( CurrentTem >= END_TEM){
  407.  
  408. for( i = ;i < INTER_WHILE ;i++){
  409.  
  410. //获取 2邻域一个解 //里面修改了临时解的邻域 在下面的if else if else 处理应对好了
  411. Get2optSolution( solutionSpace );
  412.  
  413. //计算目标值改变大小
  414. solutionSpace->NextSolutionValue = GetSumTime( Time,solutionSpace->tempSolution );
  415. ChangeValue = solutionSpace->NextSolutionValue - solutionSpace->CurrentSolutionValue ;
  416.  
  417. //Metropolis准则
  418. if( ChangeValue < ){//接受该解
  419.  
  420. //更新当前解 //不用更新临时解了 因为已经更新好了
  421. memcpy( solutionSpace->currentSolution,solutionSpace->tempSolution,sizeof(ElementType)*WORKER_NUM );
  422. solutionSpace->CurrentSolutionValue = solutionSpace->NextSolutionValue;
  423.  
  424. //判断是否更新最优解
  425. if( solutionSpace->CurrentSolutionValue < solutionSpace->OptimalSolutionValue ){
  426.  
  427. //更新最优解
  428. memcpy( solutionSpace->optimalSolution,solutionSpace->currentSolution,sizeof(ElementType)*WORKER_NUM );
  429. solutionSpace->OptimalSolutionValue = solutionSpace->CurrentSolutionValue;
  430. }
  431. }/*Metropolis 准则 end*/
  432. else if( exp ( -(1.00*ChangeValue)/CurrentTem ) > (rand1 = rand()/(RAND_MAX+1.0) ) ){ //如果大于随机数 那么也接受该点
  433.  
  434. //更新当前解 //不用更新临时解了 因为已经更新好了
  435. memcpy( solutionSpace->currentSolution,solutionSpace->tempSolution,sizeof(ElementType)*WORKER_NUM );
  436. solutionSpace->CurrentSolutionValue = solutionSpace->NextSolutionValue;
  437.  
  438. //判断是否更新最优解 //实际上在这里肯定不会更新的 但是先不改了
  439. if( solutionSpace->CurrentSolutionValue < solutionSpace->OptimalSolutionValue ){
  440. //更新最优解
  441. memcpy( solutionSpace->optimalSolution,solutionSpace->currentSolution,sizeof(ElementType)*WORKER_NUM );
  442. solutionSpace->OptimalSolutionValue = solutionSpace->CurrentSolutionValue;
  443. }
  444. }
  445. else{//没有满足准则的时候 就要更新临时解为原来的currentSolution 因为获得2邻域解的时候修改了tempSolution
  446.  
  447. memcpy( solutionSpace->tempSolution,solutionSpace->currentSolution,sizeof(ElementType)*WORKER_NUM );
  448.  
  449. }/*if ...else if ..else end*/
  450.  
  451. }/*for end 内循环*/
  452.  
  453. //更新降温函数 根据外层的循环次数而定
  454. CurrentTem -= De_TEM;
  455.  
  456. } /*while end*/
  457.  
  458. //输出历史最优值及工作分配
  459. printf("\n工人工作时间最优值为:%d\n",solutionSpace->OptimalSolutionValue);
  460. printf("工人分配的工作为:\n");
  461. for( i = ;i < WORKER_NUM; i++){
  462. printf("工人:%d 分配工作:%d\n",i+,+solutionSpace->optimalSolution[i]);
  463. }
  464. printf("\n工人工作时间最优值为:%d\n",solutionSpace->OptimalSolutionValue);
  465. }
  466.  
  467. /*************************************************
  468. **Function: MemFree
  469. **Description: 释放申请的动态内存
  470. **Calls: free()
  471. **Called By: main()
  472. **Input: distance 存储工人工作时间矩阵 strSolve 解空间的指针
  473. **Output: 无
  474. **Return: void
  475. **Others: 这里也可以一步一步的释放掉 各自的指针 因为就用一个.c所以释放内存的操作都在这里进行
  476. *************************************************/
  477. void MemFree(ElementType ** distance,StrSolve *strSolve)
  478. {
  479. int i=;
  480. int j = ;
  481.  
  482. //释放矩阵元素存储区
  483. for(i = ;i < WORKER_NUM; i++){
  484. free( distance[i] );
  485. }
  486. free(distance);
  487.  
  488. //释放解空间
  489. free(strSolve->initSolution);
  490. free(strSolve->currentSolution);
  491. free(strSolve->optimalSolution);
  492. free(strSolve->tempSolution);
  493. free(strSolve);
  494.  
  495. }

下面是试验的结果图:

相关资源(源码包+数据+报告)可在下面网址下载:

http://download.csdn.net/download/geself/10191272

运行环境:windows7

IDE        :  DEVC++

原创:工作指派问题解决方案---模拟退火算法C实现的更多相关文章

  1. 模拟退火算法Python编程(3)整数规划问题

    1.整数规划问题 整数规划问题在工业.经济.国防.医疗等各行各业应用十分广泛,是指规划中的变量(全部或部分)限制为整数,属于离散优化问题(Discrete Optimization). 线性规划问题的 ...

  2. 【原创】机器学习之PageRank算法应用与C#实现(2)球队排名应用与C#代码

    在上一篇文章:机器学习之PageRank算法应用与C#实现(1)算法介绍 中,对PageRank算法的原理和过程进行了详细的介绍,并通过一个很简单的例子对过程进行了讲解.从上一篇文章可以很快的了解Pa ...

  3. 推荐学习《算法之美:指导工作与生活的算法》中文PDF+英文PDF

    我们所有人的生活都受到有限空间和有限时间的限制,因此常常面临一系列难以抉择的问题.在一天或者一生的时光里,哪些事是我们应该做的,哪些是应该放弃的?我们对杂乱无序的容忍底线是什么?新的活动与熟悉并喜爱的 ...

  4. 模拟退火算法(1)Python 实现

    1.模拟退火算法 模拟退火算法借鉴了统计物理学的思想,是一种简单.通用的启发式优化算法,并在理论上具有概率性全局优化性能,因而在科研和工程中得到了广泛的应用. 退火是金属从熔融状态缓慢冷却.最终达到能 ...

  5. 模拟退火算法Python编程(2)约束条件的处理

    1.最优化与线性规划 最优化问题的三要素是决策变量.目标函数和约束条件. 线性规划(Linear programming),是研究线性约束条件下线性目标函数的极值问题的优化方法,常用于解决利用现有的资 ...

  6. 【原创】机器学习之PageRank算法应用与C#实现(1)算法介绍

    考虑到知识的复杂性,连续性,将本算法及应用分为3篇文章,请关注,将在本月逐步发表. 1.机器学习之PageRank算法应用与C#实现(1)算法介绍 2.机器学习之PageRank算法应用与C#实现(2 ...

  7. 模拟退火算法-[HDU1109]

    模拟退火算法的原理模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到 ...

  8. 【高级算法】模拟退火算法解决3SAT问题(C++实现)

    转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46453761 ---------------------------------- ...

  9. 模拟退火算法(SA)求解TSP 问题(C语言实现)

    这篇文章是之前写的智能算法(遗传算法(GA).粒子群算法(PSO))的补充.其实代码我老早之前就写完了,今天恰好重新翻到了,就拿出来给大家分享一下,也当是回顾与总结了. 首先介绍一下模拟退火算法(SA ...

随机推荐

  1. 前端开发【第3篇:JavaScript序】

    JavaScript历史 聊聊JavaScript的诞生 JavaScirpt鼻祖:Bremdan Eich(布兰登·艾奇),JavaScript的诞生于浏览器的鼻祖网景公司(Netscape),发布 ...

  2. JavaWeb程序连接SQLserver数据库

    声明:一直以来都以为javaweb程序连接数据库是一个很高大上很难的问题,结果今天学习了一下,不到两个小时就解决了,所以总结一篇博客. JavaWeb程序连接SQLserver数据库分为一下步骤: 1 ...

  3. poj 1986LCA离线dfs+并查集

    题意,给出边和权值,求出两个点间的最短距离. 用离线算法的时候有个地方不知道怎么处理了.在线的本来想用倍增的,但发现倍增算法貌似需要预处理深度而不是权值,不知道怎么处理.套一个rmq的模板吧,用来处理 ...

  4. CCIE-交换路由复习笔记

    交换 考点: 1.trunk link(基础) 2.vtp 3.vlan 4.stp rstp mstp 5.hsrp vrrp glbp 6.ec Trunk link: 修改封装模式 802.1q ...

  5. 转:【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17965867   方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法 ...

  6. 关于SVM数学细节逻辑的个人理解(一)

    网上,书上有很多的关于SVM的资料,但是我觉得一些细节的地方并没有讲的太清楚,下面是我对SVM的整个数学原理的推导过程,其中我理解的地方力求每一步都是有理有据,希望和大家讨论分享. 首先说明,目前我的 ...

  7. 201521123084 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  8. 团队作业8——第二次项目冲刺(Beta阶段)Day5--5.23

    1.提供当天站立式会议照片一张 2.会议内容 讨论已完成的功能 对于界面,谈谈各自的看法 商定测试计划 用户需求进一步调研 3.工作安排 队员 今日任务 明日任务 贡献比 林燕 测试运行效果 根据测试 ...

  9. 201521123082《Java程序设计》第2周学习总结

    201521123082<Java程序设计>第2周学习总结 标签(空格分隔): Java 1.本周学习总结 巩固了类型转换的相关细节 初步认识了类和对象,使用Java撰写程序几乎都在使用对 ...

  10. 201521123080《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1) 1.1 实验总结 在covnertS ...