• 【项目】优化算法设计(二):程序的简单实现


    程序在2月26日已经弄出来了。因为准备资料,安装VS2008等问题,现在才放到博客上。

    程序运行正确,但运行的效果不太好,最优个体通常在第2,3代就找到了,换句话说就是过早收敛。这是算法问题吧。我做了些算例实验了一下(实验的算例在下面可以下载,是mpp文件,要通过Project 2003生成xml文件),结果如下:

    对于实验算例1,2,3,由于可调整的地方有限,解空间较少,而且算法也有瑕疵,所以最优个体通常在第2,3代就找到了。特别的是实验算例3是同济大学出版的《建筑施工》教材中为了教授手动调整资源平均方法而设计的算例,程序优化的效果还不如书上给出的手动计算的结果。

    但是到了实验算例4,应该是应为解空间大了,程序并不是很快就收敛。我尝试了几次,结果如下
    交叉率 变异率 种群大小 最大遗传代数 最优个体所在世代 项目资源的方差
     0.7  0.08  50  100  87  511.2500
     0.6  0.08  200  2000  1884  434.6750
     0.6  0.4  100  1500  673  459.8250

    这里我是给出了方差,但在遗传算法的评价函数中我是使用了方差的倒数。因为我们要求的是方差小的方案,而遗传算法中规定适应值为非负,而且在任何情况下都希望数值越大越好(看看遗传算法中选择算子的轮盘赌形式就知道了),所以不能直接使用方差作为染色体的适应度。我只是随便把方差取倒数来用,只是为了先实现,再改进。实际上要考虑到适应度的分布,不要太离散了,不然的话就会有不正常的收敛。当然用了double还有考虑到c#双精度浮点数的精度去到多少位。还有的就是根据李东南老师论文,整个项目理想的资源消耗量应该是钟形,而不是矩形这样的话,评价适应度函数是有改进的地方。

    还有就是李文雄老师周一晚来看了一下。他说遗传算法的核心是要保存种群的多样性,就像现实世界一样,只有保存种群多样性才能逼近全局最优解。他强调特别是运行到了后面各个个体都差不多,在进行交叉就意义不大了。要实现多样性这一点,就要设计好遗传算法的各个算子,例如都保留旧种群中某些个体,或者在新种群中挑一些适应度低的跟旧种群进行替换。具体要怎样做就要自己设计了。

    程序的大体框架是这样的:

    程序时序图


    程序类图结构

    两个xsd文件均是强类型的DataSet,主要是方便数据的处理。通过Command中的DataOperator读取xml格式的Project文件(使用到类型化DataSet),在通过DataAccess把数据填充到Entity中。要注意的是Project,Task这几个类是根据Project文件的xml标记设计的。

    优化相关的全部设置在Bussiness里面,考虑到优化的方向不止资源均衡一方面(还有像如何调整每项工作的时间来缩短总工期),有把所以与资源均衡相关的都放到ResourceEquipoise中。而为了实现多种算子,并能够更新(就是相当于升级),还设定一个遗传算子的接口。在GAOperator中是接口的实现。这里还要用一下Patterns,我还没有考虑好是用那个。

    程序源代码
    实验算例打包
  • 相关阅读:
    icomet研究
    python使用ssdb的队列,用于替换canal+rabbitmq
    最近关于mysql的造型,binlog使用,以及阿里云上线数据处理错误导致被处罚的思考
    删除一个存在的RabbitMQ队列
    检查Rabbitmq中队列及消息个数,还有清空的方法
    Mysql在master上查看有哪些slave
    查看Linux端口的占用及连接情况
    Kettle根据时间戳同步数据实现
    kettle的下载、安装和初步使用(windows平台下)(图文详解)
    golang学习 ----获取URL
  • 原文地址:https://www.cnblogs.com/alonecat06/p/1092000.html
Copyright © 2020-2023  润新知