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基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
在Python中构建增广矩阵的实现方法
Jul 01 Python
Python Des加密解密如何实现软件注册码机器码
Jan 08 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
基于python检查SSL证书到期情况代码实例
Apr 04 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
Jul 03 Python
Python如何截图保存的三种方法(小结)
Sep 01 Python
在pycharm创建scrapy项目的实现步骤
Dec 01 Python
用ldap作为django后端用户登录验证的实现
Dec 07 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 Python
分位数回归模型quantile regeression应用详解及示例教程
Nov 02 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
cmd下运行php脚本
2008/11/25 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
PHP实现图片的等比缩放和Logo水印功能示例
2017/05/04 PHP
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
Firefox div高度自适应
2009/04/28 Javascript
js post提交调用方法
2014/02/12 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
用python对oracle进行简单性能测试
2020/12/05 Python
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
先进工作者获奖感言
2014/02/08 职场文书
成绩单家长评语大全
2014/04/16 职场文书
大学三年计划书范文
2014/04/30 职场文书
新党员入党决心书
2015/09/22 职场文书
教师外出学习心得体会
2016/01/18 职场文书
当你焦虑迷茫时,请读读这6句话
2019/07/24 职场文书
python OpenCV学习笔记
2021/03/31 Python
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL