Commit 1fead6cf authored by Allvey's avatar Allvey

出入场时间

parent 882a1c66
# Default ignored files
/workspace.xml
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$/../WatoDisp-master" />
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.7 (waytous)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="pytest" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (waytous)" project-jdk-type="Python SDK" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/integrated-scheduling.iml" filepath="$PROJECT_DIR$/.idea/integrated-scheduling.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
......@@ -10,20 +10,12 @@ import numpy
from settings import *
from static_data_process import *
from settings import *
load_area_uuid_to_index_dict, unload_area_uuid_to_index_dict, \
load_area_index_to_uuid_dict, unload_area_index_to_uuid_dict = build_work_area_uuid_index_map()
park_uuid_to_index_dict, park_index_to_uuid_dict = build_park_uuid_index_map()
load_area_num, unload_area_num = len(load_area_uuid_to_index_dict), len(unload_area_uuid_to_index_dict)
truck_uuid_to_name_dict, truck_name_to_uuid_dict = build_truck_uuid_name_map()
from para_config import *
M = 1000000
class PathPlanner:
class PathPlanner(WalkManage):
def __init__(self):
# 路线行驶成本
self.rout_cost = np.array((unload_area_num, load_area_num))
......@@ -37,11 +29,11 @@ class PathPlanner:
self.num_of_unload_area = len(set(update_unload_area()))
# 备停区数量
self.num_of_park_area = len(set(update_park_area()))
# 路网信息
self.walk_time_to_load_area = np.full((self.num_of_unload_area, self.num_of_load_area), M)
self.walk_time_to_unload_area = np.full((self.num_of_unload_area, self.num_of_load_area), M)
# 路网行驶成本信息信息
self.cost_to_load_area = np.full((self.num_of_unload_area, self.num_of_load_area), M)
self.cost_to_unload_area = np.full((self.num_of_unload_area, self.num_of_load_area), M)
# 路网信息(备停区)
self.walk_time_park = np.full((self.num_of_park_area, self.num_of_load_area), M)
self.cost_park_to_load_area = np.full((self.num_of_park_area, self.num_of_load_area), M)
# 路段类
self.lane = LaneInfo()
self.lane.lane_speed_generate()
......@@ -49,16 +41,16 @@ class PathPlanner:
def path_cost_generate(self, load_area_id, unload_area_id, is_park):
# 卸载道路阻塞成本初始化
to_unload_blockage_cost = 0
cost_to_unload_blockage = 0
# 装载道路阻塞成本初始化
to_load_blockage_cost = 0
cost_to_load_blockage = 0
# 卸载道路总成本初始化
to_unload_cost = 0
# 装载道路总成本初始化
to_load_cost = 0
# 阻塞成本权重
alpha = 500
alpha = 10000
# 距离成本权重
beta = 1
......@@ -72,27 +64,27 @@ class PathPlanner:
# 读取道路路段信息
for lane_id in path.park_load_lanes:
# 各路段阻塞成本累加
to_load_blockage_cost = to_load_blockage_cost + beta * self.lane_cost_generate(lane_id)
cost_to_load_blockage = cost_to_load_blockage + beta * self.lane_cost_generate(lane_id)
# 道路总成本=道路距离成本+道路阻塞成本
to_load_cost = alpha * to_load_blockage_cost + beta * path.park_load_distance
to_load_cost = alpha * cost_to_load_blockage + beta * path.park_load_distance
else:
path = session_postgre.query(WalkTime).filter_by(load_area_id=load_area_id,
unload_area_id=unload_area_id).first()
for lane_id in path.to_unload_lanes:
to_unload_blockage_cost = to_unload_blockage_cost + self.lane_cost_generate(lane_id)
cost_to_unload_blockage = cost_to_unload_blockage + self.lane_cost_generate(lane_id)
for lane_id in path.to_load_lanes:
to_load_blockage_cost = to_load_blockage_cost + self.lane_cost_generate(lane_id)
cost_to_load_blockage = cost_to_load_blockage + self.lane_cost_generate(lane_id)
to_unload_cost = alpha * to_unload_blockage_cost + beta * path.to_unload_distance
to_load_cost = alpha * to_load_blockage_cost + beta * path.to_load_distance
to_unload_cost = alpha * cost_to_unload_blockage + beta * path.to_unload_distance
to_load_cost = alpha * cost_to_load_blockage + beta * path.to_load_distance
except Exception as es:
logger.error(f'道路{load_area_id-unload_area_id}行驶成本计算异常')
logger.error(es)
return to_unload_cost, to_load_cost
return to_load_cost, to_unload_cost
def lane_cost_generate(self, lane_id):
try:
......@@ -119,39 +111,49 @@ class PathPlanner:
def walk_cost(self):
try:
self.period_walk_para_load()
# 读取路网距离信息
walk_time_load_distance = np.full((self.num_of_unload_area, self.num_of_load_area), M)
walk_time_unload_distance = np.full((self.num_of_unload_area, self.num_of_load_area), M)
self.period_map_para_load()
try:
# 读取路网成本
for walk_time in session_postgre.query(WalkTime).all():
unload_area_index = unload_area_uuid_to_index_dict[str(walk_time.unload_area_id)]
load_area_index = load_area_uuid_to_index_dict[str(walk_time.load_area_id)]
self.walk_time_to_load_area[unload_area_index][load_area_index], \
self.walk_time_to_unload_area[unload_area_index][load_area_index] = \
self.cost_to_load_area[unload_area_index][load_area_index], \
self.cost_to_unload_area[unload_area_index][load_area_index] = \
self.path_cost_generate(walk_time.load_area_id, walk_time.unload_area_id, False)
walk_time_unload_distance[unload_area_index][load_area_index] = walk_time.to_load_distance
walk_time_load_distance[unload_area_index][load_area_index] = walk_time.to_unload_distance
# 读取备停区路网成本
for walk_time_park in session_postgre.query(WalkTimePark).all():
park_area_index = park_uuid_to_index_dict[str(walk_time_park.park_area_id)]
load_area_index = load_area_uuid_to_index_dict[str(walk_time_park.load_area_id)]
_, self.walk_time_park[park_area_index][load_area_index] = \
_, self.cost_park_to_load_area[park_area_index][load_area_index] = \
self.path_cost_generate(walk_time_park.load_area_id, walk_time_park.park_area_id, True)
except Exception as es:
logger.error('路网信息计成本计算异常')
logger.error(es)
print("真实路网距离:装载-卸载")
print(self.walk_time_to_load_area)
print(self.walk_time_to_unload_area)
print("实际路网距离(阻塞):装载-卸载")
print(walk_time_load_distance)
print(walk_time_unload_distance)
cost_to_excavator = np.zeros_like(self.distance_to_excavator)
cost_to_dump = np.zeros_like(self.distance_to_dump)
for i in range(dynamic_dump_num):
for j in range(dynamic_excavator_num):
cost_to_excavator[i][j] = self.cost_to_load_area[self.dump_index_to_unload_area_index_dict[i]][self.excavator_index_to_load_area_index_dict[j]]
cost_to_dump[i][j] = self.cost_to_unload_area[self.dump_index_to_unload_area_index_dict[i]][self.excavator_index_to_load_area_index_dict[j]]
logger.info("真实路网距离-驶往挖机:")
logger.info(self.distance_to_excavator)
logger.info("真实路网距离-驶往卸点:")
logger.info(self.distance_to_dump)
logger.info("阻塞路网距离-驶往挖机:")
logger.info(cost_to_excavator)
logger.info("阻塞路网距离-驶往卸点:")
logger.info(cost_to_dump)
class LaneInfo:
......@@ -185,7 +187,8 @@ class LaneInfo:
item = item.decode(encoding='utf-8')
json_value = json.loads(redis2.get(item))
device_type = json_value.get('type')
if device_type == 1:
is_online = json_value.get('isOnline')
if device_type == 1 and is_online:
truck_locate = json_value.get('laneId')
truck_locate_dict[truck_name_to_uuid_dict[item]] = truck_locate
except Exception as es:
......@@ -198,14 +201,20 @@ class LaneInfo:
# truck -> lane
truck_locate_dict = self.update_truck_loacate()
print("truck -> lane")
print(truck_locate_dict)
# print("truck -> lane")
# print(truck_locate_dict)
logger.info("矿卡位于路段:")
logger.info(truck_locate_dict)
# truck -> speed
truck_speed_dict = self.update_truck_speed()
print("truck -> speed")
print(truck_speed_dict)
# print("truck -> speed")
# print(truck_speed_dict)
logger.info("矿卡当前速度:")
logger.info(truck_speed_dict)
try:
# lane_set, 用到的路段集合
......@@ -221,6 +230,7 @@ class LaneInfo:
lane_set = set(lane_set)
except Exception as es:
logger.error('所用路网路段集合读取异常')
logger.info(es)
# lane -> speed, 各路段平均行驶速度
self.lane_speed_dict = {}
......@@ -250,8 +260,11 @@ class LaneInfo:
tmp_lane_set.append(lane_id)
# 存在矿卡的路段
print("存在矿卡的路段:")
print(tmp_lane_set)
# print("存在矿卡的路段:")
# print(tmp_lane_set)
logger.info("存在矿卡的路段:")
logger.info(tmp_lane_set)
# 对不存在的矿卡路段,实时速度设置为最高
for lane_id in lane_set:
......@@ -268,3 +281,7 @@ class LaneInfo:
logger.error(es)
return self.lane_speed_dict
# path_planner = PathPlanner()
#
# path_planner.walk_cost()
This diff is collapsed.
......@@ -11,6 +11,15 @@
from tables import *
from urllib.parse import quote
import logging.handlers
from redis import StrictRedis, ConnectionPool
import numpy as np
from redis import StrictRedis, ConnectionPool
import redis
from datetime import datetime, timedelta
import copy
import json
import sched
import time
# 创建日志
########################################################################################################################
......@@ -31,7 +40,7 @@ logger.setLevel(logging.INFO)
# timefilehandler = logging.handlers.TimedRotatingFileHandler(log_path + "/dispatch.log", when='M', interval=1, backupCount=60)
# filehandler = logging.handlers.RotatingFileHandler(log_path + "/dispatch.log", maxBytes=3*1024*1024, backupCount=10)
filehandler = logging.handlers.RotatingFileHandler("./RDlogs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10)
filehandler = logging.handlers.RotatingFileHandler("./TFlog/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10)
# 设置后缀名称,跟strftime的格式一样
filehandler.suffix = "%Y-%m-%d_%H-%M.log"
......
......@@ -159,8 +159,14 @@ def update_total_truck():
query = np.array(session_mysql.query(Equipment).filter_by(device_type=1, isdeleted=0).all())
for item in query:
json_value = json.loads(redis2.get(item.equipment_id))
is_online = json_value.get('isOnline')
if is_online:
truck_list.append(item.id)
# for item in query:
# truck_list.append(item.id)
if len(truck_list) < 1:
raise Exception("无矿卡设备可用-矿卡集合读取异常")
except Exception as es:
......
......@@ -14,27 +14,19 @@ from sqlalchemy import Column, create_engine
from sqlalchemy import VARCHAR, DateTime, Float, Integer, BOOLEAN
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import numpy as np
from redis import StrictRedis, ConnectionPool
import redis
from datetime import datetime, timedelta
import copy
import json
import sched
import time
# import numpy as np
# from redis import StrictRedis, ConnectionPool
# import redis
# from datetime import datetime, timedelta
# import copy
# import json
# import sched
# import time
pool5 = ConnectionPool(host='192.168.28.111', db=5, port=6379, password='Huituo@123')
redis5 = StrictRedis(connection_pool=pool5)
pool2 = ConnectionPool(host='192.168.28.111', db=2, port=6379, password='Huituo@123')
redis2 = StrictRedis(connection_pool=pool2)
# 创建对象的基类:
Base = declarative_base()
# 初始化数据库连接:
engine_mysql = create_engine('mysql+mysqlconnector://root:Huituo@123@192.168.28.111:3306/waytous')
......@@ -350,3 +342,21 @@ class JobRecord(Base):
self.start_time = start_time
self.end_time = end_time
self.work_type = work_type
class WrokRecord(Base):
__tablename__ = 'statistic_work_record'
equipment_id = Column(VARCHAR(50), primary_key=True)
work_day = Column(DateTime, primary_key=True)
load_entrance_time = Column(Float)
load_entrance_count = Column(Integer)
load_exit_time = Column(DateTime)
load_exit_count = Column(Integer)
def __init__(self, equipment_id, work_day, load_entrance_time, load_entrance_count, load_exit_time, load_exit_count):
self.equipment_id = equipment_id
self.work_day = work_day
self.load_entrance_time = load_entrance_time
self.load_entrance_count = load_entrance_count
self.load_exit_time = load_exit_time
self.load_exit_count = load_exit_count
\ No newline at end of file
This diff is collapsed.
......@@ -14,15 +14,6 @@ from traffic_flow.traffic_flow_info import *
# start = time.time()
# much_job = [x**2 for x in range (1, 1000000, 3)]
# 需要提供的值
# traffic_programme_para.excavator_strength[excavator_index] = 200 # 挖机最大装载能力,单位吨/小时
# traffic_programme_para.grade_loading_array[excavator_index] = 100 # 挖机装载物料品位
# traffic_programme_para.excavator_priority_coefficient[excavator_index] = 1 # 挖机优先级
# traffic_programme_para.dump_strength[dump_index] = 200 # 卸载设备最大卸载能力,单位吨/小时
# traffic_programme_para.grade_upper_dump_array[dump_index] = 100 # 卸载设备品位上限
# traffic_programme_para.grade_lower_dump_array[dump_index] = 100 # 卸载设备品位下限
# traffic_programme_para.dump_priority_coefficient[dump_index] = 1 # 卸载设备优先级
# 从数据库中读取挖机和卸载设备相关参数,并将线性规划所用参数保存在TrafficProgPara类中
......@@ -31,7 +22,7 @@ from traffic_flow.traffic_flow_info import *
def transportation_problem_slove(coefficient, w_ij, s_ij, b_excavator,
b_dump, grade_loading_array,
max_unload_weigh_alg_flag, truck_total_num,
goto_excavator_dis, goto_dump_dis, min_throughout,
walk_time_to_excavator, walk_time_to_dump, min_throughout,
grade_lower_array=None, grade_upper_array=None):
row = len(coefficient) # 代表挖机的个数,第i行代表第i台挖机
col = len(coefficient[0]) # 代表卸载设备的个数,第j行代表第j个卸载设备
......@@ -51,8 +42,8 @@ def transportation_problem_slove(coefficient, w_ij, s_ij, b_excavator,
prob += pulp.lpDot(flatten(var_x), coefficient.flatten())
else:
prob = pulp.LpProblem('Transportation Problem', sense=pulp.LpMinimize)
goto_excavator_cost = var_x * goto_excavator_dis
goto_dump_cost = var_y * goto_dump_dis
goto_excavator_cost = var_x * walk_time_to_excavator
goto_dump_cost = var_y * walk_time_to_dump
prob += (pulp.lpSum(flatten(goto_excavator_cost)) + 1.5 * pulp.lpSum(flatten(goto_dump_cost)))
# 定义约束条件
......@@ -60,6 +51,9 @@ def transportation_problem_slove(coefficient, w_ij, s_ij, b_excavator,
if max_unload_weigh_alg_flag == False:
prob += pulp.lpSum(var_x) >= min_throughout
logger.info("road_factor")
logger.info(w_ij)
# 矿卡总数约束,在每条道路上的车辆总数要小于矿卡总个数
# 通过矩阵按元素相乘得到每条卸载道路上的车辆个数
unload_truck_total_num_array = w_ij * var_x
......@@ -67,7 +61,7 @@ def transportation_problem_slove(coefficient, w_ij, s_ij, b_excavator,
load_truck_totla_num_array = s_ij * var_y
# 装载的矿卡数和卸载的矿卡数需要小于矿卡总数
prob += (pulp.lpSum(unload_truck_total_num_array) +
pulp.lpSum(load_truck_totla_num_array) <= truck_total_num)
pulp.lpSum(load_truck_totla_num_array) <= 2)
# 最大工作强度约束
# 约束每个挖机的工作强度
......@@ -168,13 +162,13 @@ def traffic_flow_plan():
grade_lower_dump_array = traffic_programme_para.grade_lower_dump_array
grade_upper_dump_array = traffic_programme_para.grade_upper_dump_array
min_throughout = traffic_programme_para.min_throughout
goto_excavator_distance = traffic_programme_para.goto_excavator_distance
goto_dump_distance = traffic_programme_para.goto_dump_distance
walk_time_to_excavator = traffic_programme_para.walk_time_to_excavator
walk_time_to_dump = traffic_programme_para.walk_time_to_dump
truck_total_num = traffic_programme_para.truck_total_num
res = transportation_problem_slove(coefficient, w_ij, s_ij, b_excavator, b_dump,
grade_loading_array, max_unload_weigh_alg_flag, truck_total_num,
goto_excavator_distance, goto_dump_distance, min_throughout,
walk_time_to_excavator, walk_time_to_dump, min_throughout,
grade_upper_dump_array, grade_lower_dump_array)
if max_unload_weigh_alg_flag:
......@@ -192,11 +186,14 @@ def traffic_flow_plan():
logger.info(f'空运车流:{res["var_y"]} 单位: 吨/时')
# 通过矩阵按元素相乘得到每条卸载道路上的车辆个数
print("卸载道路上的车辆个数")
unload_traffic = res['var_x']
print((traffic_programme_para.goto_dump_factor * unload_traffic).round(3))
# 通过矩阵按元素相乘得到每条装载道路上的车辆个数
print("装载道路上的车辆个数")
load_traffic = res['var_y']
print((traffic_programme_para.goto_excavator_factor * load_traffic).round(3))
return res["var_x"], res["var_y"]
traffic_flow_plan()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment