简介
第二问的公式
\[\frac{x_{i}-f}{v_{i}} \geq T+\sum_{j=0(j !=i)}^{29} \frac{x_{j}-f}{r}
\]
T 路径上一周消耗的时间
f 最低电量
r 充电速度
v 每个sensor的消耗速度
x 每个sensor的电池电量
code
主要使用了模拟退火
main.py
#coding=utf-8
from solution import solution
from draw import draw
import time
import winsound
def main1():
solve = solution(salesNumber = 1)
# 因为 xlsx2 文件可以用来解决问题1,2,3所以直接都读取了
myNodes = solve.readFromFile('B题附件2.xlsx')
start = time.clock()
xmin, x, y = solve.solutionForSubjectOne()
elapsed = (time.clock() - start)
drawObj = draw()
drawObj.drawY(x, y)
drawObj.drawRoute1(xmin, myNodes)
print("Time used:", elapsed)
def main2():
# 问题2 要赋值
xmin = [16, 27, 15, 12, 8, 11, 14, 6, 7, 9, 1, 2, 0, 17, 20, 19, 18, 25, 26, 29, 21, 23, 24, 28, 22, 4, 3, 5, 10, 13]
solve = solution(salesNumber=1)
# 因为 xlsx2 文件可以用来解决问题1,2,3所以直接都读取了
myNodes = solve.readFromFile(
'XXX')
start = time.clock()
drawObj = draw()
solve.setScheme(minEnergy=15, moveSpeed=10, chargeRate=20)
re = solve.solutionForSubjectTwo(xmin)
elapsed = (time.clock() - start)
drawObj.drawRect2(re, myNodes, 15) # 15是最小电量
print("Time used:", elapsed)
def main3():
# 问题3解决方案
solve = solution(salesNumber=4)
solve.setScheme(minEnergy=15, moveSpeed=10, chargeRate=20)
solve.setCoef(consumeOneMeter = 0.001, consumeOneMa = 1)
# 因为 xlsx2 文件可以用来解决问题1,2,3所以直接都读取了
myNodes = solve.readFromFile(
'XXX')
start = time.clock()
drawObj = draw()
xmin, ymin, drawX, drawY = solve.monituihuo()
elapsed = (time.clock() - start)
drawObj.drawY(drawX, drawY)
drawObj.drawRoute3(xmin, myNodes, ymin)
# 将 xmin 拆分为4 个
travelingSalesman = []
allDistance = []
for i in range(4):
tmp = [0]
allDistance.append(0)
travelingSalesman.append(tmp)
j = 0
for i in range(len(xmin)):
if (xmin[i] != 0):
travelingSalesman[j].append(xmin[i])
else:
j += 1
re = []
for i in range(4):
tmp = solve.solveFor3(travelingSalesman[i])
re.append(tmp)
# for i in range(4):
# print(re[i])
# print(travelingSalesman[i])
newRE = []
for i in range(30):
newRE.append(0)
for i in range(4):
for j in range(len(travelingSalesman[i])):
newRE[travelingSalesman[i][j]] = re[i][j]
drawObj.drawRect2(newRE, myNodes, 15) # 15是最小电量
for i in range(len(newRE)):
print(newRE[i])
# 对每一个节点进行绘图
# drawObj.drawRect3(re, travelingSalesman, myNodes)
# 根据得到的路径图 计算 传感器节点所需要的的电池电量
print("Time used:", elapsed)
def test():
solve = solution(salesNumber=4)
solve.setScheme(minEnergy=15, moveSpeed=10, chargeRate=20)
solve.setCoef(consumeOneMeter=0.001, consumeOneMa=1)
# 因为 xlsx2 文件可以用来解决问题1,2,3所以直接都读取了
myNodes = solve.readFromFile('XXX')
start = time.clock()
drawObj = draw()
newRE = [
15.0,
16.75801,
17.53926,
16.46503,
16.79056,
16.17204,
16.46503,
17.08354,
16.49758,
16.46503,
16.79056,
16.46503,
17.40906,
17.11609,
16.46503,
16.23715,
16.46503,
16.79056,
17.44161,
16.79056,
16.46503,
16.13948,
16.79056,
17.44161,
16.13948,
16.79056,
16.39992,
16.17204,
17.08354,
16.75801
]
drawObj.drawRect2(newRE, myNodes, 15) # 15是最小电量
if __name__ == "__main__":
test()
winsound.Beep(300, 2000)
utils.py
#coding=utf-8
from math import radians, cos, sin, asin, sqrt
def haversine(lon1, lat1, lon2, lat2): # 经度1,纬度1,经度2,纬度2 (十进制度数)
"""
https://blog.csdn.net/vernice/article/details/46581361
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# 将十进制度数转化为弧度
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine公式
dlon = lon2 - lon1