Shoshinsha_1 2022-06-14 22:23 采纳率: 100%
浏览 193
已结题

实例遗传算法的详细求解

构建一个遗传算法程序,书中已给出详细步骤,但由于基础知识的欠缺,不能完全理解每一步的原因。希望得到重点部分的解释和与结果一样的程序,以及最后如何在excel表格中现实图表的显示。最好能够具体说明。
找到由30件行李组成的背包问题的最优解。
然而,knapsack问题是以下问题(图3.15)。
假设现在有几件行李。 每件行李都被赋予了一定的重量(重量)和价格(价值)。 你选择其中一些行李,并将其装入背包。
并将它们装入背包。 由于背包有重量限制,行李的总重量不得超过一定重量。 在这些条件下,我们寻找一种行李的组合,使总价格尽可能高。

img

(1)每件行李都有一定的重量(weight)和价格(value)
(2)选择其中一些,将其装入有重量限制的背包中,并找到使总价值最大化的组合。
图3.15 Knapsack问题
首先,考虑一下染色体是如何表示的。 在背包问题中,直接的方法是将哪些行李要装在背包中表示为0/1。 因此,按行李的件数排列0/1,把要放进背包的行李件数对应的位置作为1,把不放进背包的行李件数对应的位置作为0。 例如,在图3.15中,假设只有五件行李中的第二件和第三件被装在背包里。 在这种情况下,染色体的表示方法看起来像 "01100"。
染色体的估值被计算为装在编织袋中的价值之和。 然而,如果超过了背包的重量限制,该值将被设置为零。 例如,假设在图3.15中,背包的重量限制为100。 在这种情况下,对于将第二和第三件行李装入背包的染色体 "01100",其数值计算如下
染色体 "01100" 価値
82+85=167
重量
39+9=48

总重量值为48,总重量小于或等于重量限制,所以总数值167,是染色体的原值。
相反,如果我们考虑,例如,图315中所有的行李都装在一个背包里的情况,染色体的表达是1。 以同样的方式思考价值和重量,染色体 "1111 "有以下价值27+82+85+71+91=356
重量65+39+9+72+87=272
染色体的总价值很大,但染色体的总重量超过了100的重量限制,所以染色体的价值为0。
现在我们已经决定如何表示和评估染色体,现在我们可以根据前面介绍的程序建立遗传算法程序。 首先,考虑数据结构。 遗传算法在一个染色体群体上运行。 因此,让我们在C语言中把染色体群表示为一个变量。
染色体被表示为0/1的序列,所以一条染色体可以被表示为一个一维数组。 其中的几个走到一起,形成一个染色体群体。 因此,一个染色体群体用一个二维数组表示,如下所示。
int pool [POOLSIZE] [N]
int ngpool [POOLSIZE * 2]
其中,符号常数POOLSIZE给出了每一代染色体组的数量;pool数组保存特定一代的染色体,而ngpool数组保存在遗传操作中作为下一代染色体的候选个体。 ngpool序列中的元素数量是pool序列的两倍。 这样做是为了给后代创造更多的染色体,通过选择的遗传操作可以从中选择合适的染色体。
在编织袋问题中,必须保留每个包裹的重量和价值。 这里,一个名为PARCEL的二维数组被用来保存重量和数值。 这里,第一个下标给出了包裹之间的区别,第二个下标给出了重量和价值之间的区别。 在下文中,第二个下标如果是0,则被视为代表权重,如果是1,则代表价值。 另外,符号常数N是地块的数量。
int parcel [N][2]; /行李 /
现在让我们考虑如何根据一个程序来描述一个具体的过程。 首先,在处理步骤(1)中,通过随机数对染色体群进行初始化,具体操作如下。
int i, j;/用于重复的控制变量 /
for (i = 0; i < POOLSIZE; ++i)for (j = 0; j < N; ++j)pool [i] [j] = rndn (2);
这里,函数rndn是一个返回随机数的函数,该随机数小于作为参数给定的数字,并且大于或等于0。 在这里,染色体种群是通过随机生成0或1来初始化的。
接下来是处理步骤(2),使用for语句将以下过程重复适当次数。
首先,(2-1),交叉过程,首先创建一个轮盘,选择父母。
具体来说,一个数组轮盘被创建如下,连同评价的总值totalfitness一起被计算。 其中函数evalfit计算作为参数的染色体的评估值。
/
创建轮盘
/
for (i = 0; i < POOLSIZE; ++i)
roulette[i] = evalfit (pool [i]);
/
计算评估的总和
/ for (i = 0; i < POOLSIZE; ++i)
totalfitness += roulette [i];
利用这些结果,步骤(2-1-1)中的父本选择被写成如下
做(/选择父母/)
mama=selectP(轮盘赌,Totalfitness)。
papa = selectp(轮盘赌,totalfitness)。
在这里,函数selectp通过轮盘选择来选择一个父本。
上述做法还可以防止同一染色体被选择两次,这将使交叉运算无效。
上述做法可以防止同一染色体被选择两次,这将使交叉运算无效。
接下来,步骤(2-1-2)中的一点交叉等被实施,如下所示。这里,m和PD序列是父染色体,而c1和c2序列持有子染色体。
/* 交叉点的确定 /cp = rndn (N)。
/
复制前半部分 */
for (j = 0; j < cp; ++j)
c1 [j] = m[j]。
c2 [j] = P[j]。
/*复制后半部分的内容 */
for (; j< N; ++j)[c2 [j] = m[j];
c1 [j] = p[j]。
然后,步骤(2-2)中的突变过程按以下方式实施。下面的if语句对应于步骤(2-2-1),最后的赋值语句对应于(2-2-2)。注意,notval0函数将0和1倒置。
for (i = 0; i < POOLSIZE * 2; ++i)
for (j = 0; j < N; ++j)
如果((double) rndn (100) / 100.0 <= MRATE)
ngpool [i] [j] = notval(ngpool [i] [j])。
上述过程以程序的形式实现,其模块结构如图3.16所示。 该程序应命名为kpga.c。

img

img

img

img

img

img

img

img

img

img

img

  • 写回答

5条回答 默认 最新

查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 6月23日
  • 已采纳回答 6月15日
  • 赞助了问题酬金70元 6月15日
  • 赞助了问题酬金30元 6月15日
  • 展开全部

悬赏问题

  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多