遗传算法到变异过程代码实现

import math
import random
from random import sample
import numpy as np
from numpy import *
import geatpy as ea
import xlrd
import pysnooper


##已知数据
q1='F:\共享车选址调度\共享汽车数据\候选点之间的OD(13).xlsx'
T1='F:\共享车选址调度\共享汽车数据\候选点之间的最短期望时间Tik(13).xlsx'
wt1='F:\共享车选址调度\共享汽车数据\需求中心到备选点的步行时间(50行13列).xlsx'
D1='F:\共享车选址调度\共享汽车数据\每个需求中心的需求量(50网格).xlsx'
# ####excel转为矩阵
def excel_to_matrix(path,a):  #路径,sheet
    table = xlrd.open_workbook(path).sheets()[a]#获取第一个sheet表
    row = table.nrows  # 行数
    col = table.ncols  # 列数
    datamatrix = np.zeros((row, col))#生成一个nrows行ncols列,且元素均为0的初始矩阵
    for x in range(col):
        cols = np.matrix(table.col_values(x))  # 把list转换为矩阵进行矩阵操作
        datamatrix[:, x] = cols # 按列把数据存进矩阵中
    return datamatrix
q=excel_to_matrix(q1,0)
T=excel_to_matrix(T1,0)
wt=excel_to_matrix(wt1,0)
D=excel_to_matrix(D1,1)  # 多维数组,50行1列
# #############参数##########################
Cs=1*10
Cp=12*10
Cv=56*10
Ce=6
M=10000
alpha=0.8
beta=0.5
gama=2
I=13
J=50
Pmax=100
w1=50
H =500000  # 成本的最大值
##########################################
##距离衰减
s=zeros((J, I))  # 创建一个J*I的零矩阵,矩阵这里zeros函数的参数是一个tuple类型(J,I)
for i in range(I):
    for j in range(J):
        if wt[j,i]<w1:
            a=-(wt[j,i])**4+w1**4
            b=(w1**4)*(math.exp((wt[j,i]/40)**3))
            s[j,i]=a/b
        elif wt[j,i]>w1:
            s[j,i]=0
## qik/qi
n=zeros((J, I))
for i in range(I):
    for k in range(I):
        if sum(q[i])>0:  #每一行的和
            n[i,k]=q[i,k]/sum(q[i])
        else:
            n[i,k]=0
'''1.目标函数'''
def objection(X,P,V,z):
    z0=np.array(z).reshape(J,I)  #列表转一维数组,转多维数组
    for i in range(I):
        Ti = T[i, :]  # 多维数组,第i行
        ni = n[i, :]
        ui= [sum(D[:,0]*z0[:,i]*s[:,i]) for i in range(I)] # 输出为一个列表,其中含有13个元素,表示分布从13个备选站点出发的租车辆
        # ob = [Cs * X[i] + Cp * P[i] + Cv * V[i] + Ce * sum(Ti * ni) * ui[i] for i in range(I)]  # 输出为一个列表,其中含有13个元素,每个元素对应一个站点的成本
        obj=sum([Cs * X[i] + Cp * P[i] + Cv * V[i] + Ce * sum(Ti * ni) * ui[i] for i in range(I)])  #输出结果为总成本,约29万
    return obj

'''2.实数编码'''
def code():
    Chrom = []
    X_0 = np.random.randint(0, 2, I)  # 随机产生13个只含0,1元素的列表,13为初始种群的个数

    P_0 = np.random.randint(2, 101, I)  # 随机产生13个0到100中的正整数的列表
    V_0 = np.random.randint(1, 81, I)  # 随机产生13个0到80中的正整数的列表.80=100*alpha
    z0 = np.random.random((J, I))  # J=50,I=30,50行13列的二维数组
    for i in range(len(X_0)):
        if X_0[i] == 0:
            P_0[i], V_0[i], z0[:, i] = 0, 0, 0  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值