Python使用遗传算法解决最大流问题


Posted in Python onJanuary 29, 2018

本文为大家分享了Python遗传算法解决最大流问题,供大家参考,具体内容如下

Generate_matrix

def Generate_matrix(x,y):
 import numpy as np
 import random
 return np.ceil(np.array([random.random()*10 for i in range(x*y)]).reshape(x,y))

Max_road

def Max_road(A,degree,start):

 import random
 import numpy as np
 import copy

 def change(M,number,start): # number 控制变异程度 start 控制变异量 
  x , y = M.shape
  for i in range(start,x):
   Line = zip(range(len(M[i])),M[i])
   index_0 = [t[0] for t in Line if t[1]==0] # 获取 0 所对应的下标    
   index_1 = [t[0] for t in Line if t[1]==1] # 获取 1 所对应的下标
   M[i][random.sample(index_0,number)[0]]=1 # 随机改变序列中 number 个值 0->1
   M[i][random.sample(index_1,number)[0]]=0 # 随机改变序列中 number 个值 1->0
  return M

 x,y = A.shape

 n=x
 generation = y

 #初始化一个有 n 中情况的解决方案矩阵
 init_solve = np.zeros([n,x+y-2]) 
 init=[1]*(x-1)+[0]*(y-1)
 for i in range(n) :
  random.shuffle(init)
  init_solve[i,:] = init # 1 表示向下走 0 表示向右走 
 solve = copy.copy(init_solve)

 for loop in range(generation):
  Sum = [A[0,0]]*n # 用于记录每一种方案的总流量
  for i in range(n):
   j=0;k=0;
   for m in solve[i,:]:
    if m==1:
     k=k+1
    else:
     j=j+1   
    Sum[i] = Sum[i] + A[k,j]

  Sum_index = zip(range(len(Sum)),Sum)
  sort_sum_index = sorted(Sum_index,key = lambda d : d[1] , reverse =True) # 将 方案 按照流量总和排序

  Max = sort_sum_index[0][1] # 最大流量
  #print Max
  solve_index_half = [a[0] for a in sort_sum_index[:n/2]] # 保留排序后方案的一半
  solve = np.concatenate([solve[solve_index_half],solve[solve_index_half]]) # 将保留的一半方案 进行复制 ,复制部分用于变异
  change(solve,int((x+y-2)*degree)+1 ,start) # 变异

 return solve[0] , Max

Draw_road

def Draw_road(road,A):

 import pylab as plt
 import seaborn
 seaborn.set()

 x , y =A.shape 

 # 将下移和右移映射到绘图坐标上
 Road = [(1,x)] # 初始坐标
 j=1;k=x;
 for m in road:
  if m==1:
   k=k-1
  else:
   j=j+1
  Road.append((j,k))

 # print Road

 for i in range(len(road)):  
  plt.plot([Road[i][0],Road[i+1][0]],[Road[i][1],Road[i+1][1]])

实际运行的例子

In [119]: A = Generate_matrix(4,6)

In [120]: A
Out[120]: 
array([[ 10., 1., 7., 10., 8., 8.],
  [ 4., 8., 8., 4., 8., 2.],
  [ 9., 8., 8., 3., 9., 8.],
  [ 7., 2., 5., 9., 3., 8.]])

In [121]: road , M=Max_road(A,0.1,2)

In [122]: Draw_road(road,A)

Python使用遗传算法解决最大流问题

较大规模的情况

In [105]: A = Generate_matrix(40,60)

In [106]: road , M=Max_road(A,0.1,4)

In [107]: road
Out[107]: 
array([ 0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.,
  1., 0., 0., 0., 1., 0., 0., 1., 0., 1., 1., 1., 1.,
  1., 0., 0., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0.,
  1., 0., 0., 0., 1., 0., 1., 0., 0., 1., 0., 0., 1.,
  0., 0., 0., 1., 0., 0., 1., 1., 1., 1., 0., 0., 0.,
  0., 0., 0., 1., 0., 1., 1., 1., 1., 0., 1., 0., 1.,
  1., 1., 0., 1., 0., 1., 0., 1., 0., 1., 0., 0., 1.,
  0., 1., 0., 0., 1., 0., 1.])

In [108]: Draw_road(road,A)

Python使用遗传算法解决最大流问题

In [109]: A = generate_Matrix(100,200)
In [110]: road , M=Max_road(A,0.1,10)
In [111]: draw_road(road,A)

Python使用遗传算法解决最大流问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取元素在数组中索引号的方法
Jul 15 Python
python实现文本文件合并
Dec 29 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
May 25 Python
python一键升级所有pip package的方法
Jan 16 Python
Python3.6简单操作Mysql数据库
Sep 12 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
在Python中关于使用os模块遍历目录的实现方法
Jan 03 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
基于python中__add__函数的用法
Nov 25 Python
Python 简单计算要求形状面积的实例
Jan 18 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 Python
Python subprocess模块详细解读
Jan 29 #Python
python微信跳一跳游戏辅助代码解析
Jan 29 #Python
Python面向对象之继承代码详解
Jan 29 #Python
Python多线程threading和multiprocessing模块实例解析
Jan 29 #Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 #Python
Python模块搜索路径代码详解
Jan 29 #Python
python机器人行走步数问题的解决
Jan 29 #Python
You might like
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
关于php fread()使用技巧
2010/01/22 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
在Python中使用模块的教程
2015/04/27 Python
python实现指定字符串补全空格的方法
2015/04/30 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
Python正则表达式经典入门教程
2017/05/22 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
python模块常用用法实例详解
2019/10/17 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
如何写出高性能的JSP和Servlet
2013/01/22 面试题
企业行政文员岗位职责
2013/12/03 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
社区党支部承诺书
2015/04/29 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书
2019新员工心得体会
2019/06/25 职场文书
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL