贪婪迭代算法(IG)

IG算法由是Ruiz等提出的一种新型智能优化算法,该算法主要由邻域搜索、扰动算子和接受准则3个基本部分组成。IG算法提出后,以其参数少、易实现和效率高等特点引起了众多国内外学者的关注和研究,并在阻塞流水车间调度和二次多重背包问题等领域得到了理论研究和实践应用。

————————————————

算法初始化这两个解之后(通常由启发式规则实现),从当前解出发,考虑针对所解决问题设计的局部搜索方法,若局部搜索中有更好的解则贪婪地移动到那个解,局部搜索结束之后算法会采用类似模拟退火的接受准则以一定的概率接受比最好解更差的解,然后更新最好解,再对当前解采用破坏重建过程以跳出局部最优并准备下一次的迭代过程。该算法结构非常简单,参数较少,且求解效果好。

 

IG算法伪代码

初始化

初始解由NEH规则生成初始解,NEH算法伪代码如下: 

 

领域搜索 

 插入领域搜索和交换领域搜索结合的随机领域搜索算法(Random Neigh-borhood Search,RNS)

  1. 每次从当前解中随机地选择一个订单,随机地选择插入邻域或者交换邻域进行搜索,
  2. 前者将其从原位置移除并插入到所有可能位置中的最优位置,后者将其与所有可能位置中最优位置的订单进行交换;
  3. 如果通过邻域搜索找到的新解优于当前解,则替换当前解并且继续搜索,否则结束搜索。

 

 破坏-重构阶段:扰动算子-避免陷入局部最优

破坏和重建过程思想

  1. 在破坏阶段,从当前解中随机选择若干订单并移除,得到两个部分序列:
  2. 由剩余订单组成的部分解、由移除订单按照移除顺序组成的部分序列;
  3. 在重建阶段,将部分序列中的订单逐一插入到部分解中所有可能位置的最优位置,从而最终得到一个扰动解。

接受准则

接受准则的作用是更新IG算法的当前解和最好解。由于扰动算子的扰动有时可能不是足够大,导致算法在后续局部搜索过程中又陷入到相同局部最优点。

基于遗传算法中的轮盘赌选择策略

在该接受准则中,需要构建一个精英表,该精英表储存了通过局部搜索找到的新解。RWS接受准则:通过局部搜索找到新解后,如果新解优于最好解,则更新最好解,且清空精英表;如果新解不在精英表中,则将新解添加到精英表的尾部;如果精英表的长度超过ω,则从表中删除最坏解;按照RWS策略从精英表中选择一个解为当前解。令精英表的长度为τ(τ≤ω),RWS策略的实现步骤如下

reference :

本文参考了CSDN博主「~晚风微凉~」的原创文章,
原文链接:https://blog.csdn.net/qq_51976555/article/details/123167039

[1]张杨, 但斌, 高华丽. 基于改进迭代贪婪算法的产品服务系统订单调度优化[J/OL]. 计算机集成制造系统, 2020, 26(12): 3435-3446. 

一、实验目的: 掌握分页式存储管理的基本概念和实现方法。要求编写一个模拟的分页式管理程序, 并能对分页式存储的页面置换算法进行编写和计算各个算法的缺页率。 二、程序设计: 假定一个能够存放M个页面的内存,当发生缺页时,调入一个页面, 通过LRU算法求出应该置换出的页面号。输入一连串的页面号, 程序自动选择调出的页面并计算缺页率。 设计页面置换算法,这里采用最近最久未使用置换算法LRU。 LRU算法的实现要归功于一个8位的寄存器的实现。 三、算法说明: 执行程序时,当主存没有可用页面时,为了选择淘汰主存中的哪一页面, 腾出1个空闲块以便存放新调入的页面。淘汰哪个页面的首要问题是选择何种置换算法。 该程序采用LRU方法选择,依置换策略选择一个可置换的页面并计算它们的缺页率以便比较。 */ #include using namespace std; #define M 3 #include int reg[2][M]; int count; int num; int N; /********初始化函数,数组reg[0][i]存放页面号,初始化为-1,reg[1][i]当作寄存器, 初始化为0*********/ void init() { int i,count=0;num=0; N=(int)pow(2,7); /********二进制数10000000**********/ for(i=0;i<M;i++) { reg[0][i]=-1; reg[1][i]=0; } } /*********寻找数组a中的最小值,返回最小值对应的下标***********/ int min(int a[]) { int i,index=0; int min=a[0]; for(i=1;ia[i]) { min=a[i]; index=i; } } return index; } /***判断页面号x是否在数组中,如果在,返回对应的下标;否则返回-1***/ int isIn(int x,int a[]){ int i; int index=-1; for(i=0;i<M;i++) { if(a[i]==x) { index=i; break; } } return index; } /**********判断虚拟的内存中是否已经存满了页面,如果满了,则返回-1, 没有满则返回找到空的对应的第一个下标**************/ int isFull(int a[]) { int i,index=-1; for(i=0;i<M;i++) { if(a[i]==-1) { index=i; break; } } return index; } /*************页面置换方法*****************/ void swap(int x) { int i,k,temp,temp0,count; int index=isIn(x,reg[0]); /****判断x是否在reg[0]数组中*******/ if(index!=-1) { reg[1][index]=reg[1][index]^N; }/**reg[1][index]异或二进制数10000000**/ else{ temp=isFull(reg[0]); if(temp!=-1) /*******内存没有满,直接调入页面************/ { reg[0][temp]=x; reg[1][temp]=reg[1][temp]^N; } else if(temp==-1) { k=min(reg[1]); /**置换出寄存器中数值最小的对应的下标的页面***/ temp0=reg[0][k]; /*********临时保留要换出的页面号*****/ reg[0][k]=x; reg[1][k]=reg[1][k]^N; printf("the page %d is exchanged out!\n",temp0); /******打印要置换出的页号**************/ count++; /*********置换次数加1**************/ } } for(i=0;i>1; }/********寄存器中的所有数右移一位*****/ /***************打印缺页数和缺页率**********************/ printf("the count of Exchanged is: %d \n",count); printf("the rate of exchanged is: %f\n",count*1.0/num); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱佩棋(代码版)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值