深圳杯数学建模2020c题_模拟退火解 深圳杯2020C题

本文介绍了利用模拟退火算法解决2020年深圳杯数学建模挑战赛C题,涉及传感器电量分配问题。通过模拟退火算法,确定了每个传感器在满足最低电量需求时的电池容量,并给出了具体代码实现。
摘要由CSDN通过智能技术生成

简介

第二问的公式

\[\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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值