correct speedLimitTable

This commit is contained in:
2023-01-12 21:26:26 +01:00
parent f85f6da78b
commit b0eb9a40db

View File

@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""HashCode2022_张杰.ipynb """HashCode2022_BUG.ipynb
Automatically generated by Colaboratory. Automatically generated by Colaboratory.
@@ -16,8 +16,8 @@ import numpy as np
import os import os
import math import math
File_Directory = 'drive/MyDrive/polyhash/DataSet/' File_Directory = 'drive/MyDrive/Ecole/PolyHash2022/DataSet/'
File_Name = 'a_an_example.in.txt' File_Name = 'f_festive_flyover.in.txt'
File_Path = File_Directory+File_Name File_Path = File_Directory+File_Name
DataSet = [line.strip().split() for line in open(File_Path, "r")] DataSet = [line.strip().split() for line in open(File_Path, "r")]
@@ -64,6 +64,7 @@ def readLine(m = 0, n = 2, offset = 1):
return line return line
class Person: class Person:
priority:float
def __init__(self, infomationLine): def __init__(self, infomationLine):
self.name, self.score, self.weightOfGift, self.x_position, self.y_position = infomationLine self.name, self.score, self.weightOfGift, self.x_position, self.y_position = infomationLine
@@ -74,6 +75,9 @@ class Person:
global Score global Score
Score += self.score Score += self.score
def caculatePriority(self):
return self.score / (self.weightOfGift * caculateDistance([0,0], (self.x_position, self.y_position)))
class People: class People:
info = [] info = []
@@ -93,11 +97,8 @@ class People:
plt.show() plt.show()
class Santa: class Santa:
tableauDeDistribution = []
position = [0.0,0.0] position = [0.0,0.0]
speed = [0.0,0.0] speed = [0.0,0.0]
weightOfCarrots:int = 0 weightOfCarrots:int = 0
@@ -114,18 +115,13 @@ class Santa:
def getWeight(self): def getWeight(self):
return self.weightOfCarrots + self.weightOfGift return self.weightOfCarrots + self.weightOfGift
#[[2000.0, 20.0], [3000.0, 15.0], [5000.0, 10.0], [6000.0, 9.0], [7000.0, 8.0]]
def nowSpeedLimit(self): def nowSpeedLimit(self):
w = self.getWeight() w = self.getWeight()
assert w >= 0 assert w >= 0
if w <= self.speedLimitTable[0][0]: for i in range(len(self.speedLimitTable)):
return self.speedLimitTable[0][1] if w < self.speedLimitTable[i][0]:
elif w > self.speedLimitTable[0][0] and w <= self.speedLimitTable[1][0]: return self.speedLimitTable[i][1]
return self.speedLimitTable[1][1]
elif w > self.speedLimitTable[1][0] and w <= self.speedLimitTable[2][0]:
return self.speedLimitTable[2][1]
elif w > self.speedLimitTable[2][0] and w <= self.speedLimitTable[3][0]:
return self.speedLimitTable[3][1]
else:
return 0 return 0
@@ -138,21 +134,37 @@ class Santa:
self.weightOfCarrots -= 1 self.weightOfCarrots -= 1
def AccUp(self, s): def AccUp(self, s):
if self.timeLimit>0:
assert self.isAllowedBySpeedLimit(s) assert self.isAllowedBySpeedLimit(s)
self.speed[1] += s self.speed[1] += s
self.consumeCarrot() self.consumeCarrot()
print("AccUp:",s)
else:
pass
def AccDown(self, s): def AccDown(self, s):
if self.timeLimit>0:
assert self.isAllowedBySpeedLimit(s) assert self.isAllowedBySpeedLimit(s)
self.speed[1] -= s self.speed[1] -= s
self.consumeCarrot() self.consumeCarrot()
print("AccLeft:",s)
else:
pass
def AccRight(self, s): def AccRight(self, s):
if self.timeLimit>0:
assert self.isAllowedBySpeedLimit(s) assert self.isAllowedBySpeedLimit(s)
self.speed[0] += s self.speed[0] += s
self.consumeCarrot() self.consumeCarrot()
print("AccRight:",s)
else:
pass
def AccLeft(self, s): def AccLeft(self, s):
if self.timeLimit>0:
assert self.isAllowedBySpeedLimit(s) assert self.isAllowedBySpeedLimit(s)
self.speed[0] -= s self.speed[0] -= s
self.consumeCarrot() self.consumeCarrot()
print("AccLeft:",s)
else:
pass
def LoadCarrots(self, w): def LoadCarrots(self, w):
self.weightOfCarrots += w self.weightOfCarrots += w
@@ -160,15 +172,23 @@ class Santa:
self.weightOfGift += w self.weightOfGift += w
def DiliveryGift(self,p: Person): def DiliveryGift(self,p: Person):
if self.timeLimit >=0 and caculateDistance(self.getPosition(), p.getPosition()) <= self.deliveryDistanceLimit:
assert caculateDistance(self.getPosition(), p.getPosition()) <= self.deliveryDistanceLimit assert caculateDistance(self.getPosition(), p.getPosition()) <= self.deliveryDistanceLimit
self.weightOfGift -= p.weightOfGift self.weightOfGift -= p.weightOfGift
assert self.weightOfGift >= 0 assert self.weightOfGift >= 0
p.getScore() p.getScore()
print("Delivert gift to",p.name)
else:
pass
def Float(self, t:int = 1): def Float(self, t:int = 1):
if (self.timeLimit - t) >=0:
self.position[0] += self.speed[0] * t self.position[0] += self.speed[0] * t
self.position[1] += self.speed[1] * t self.position[1] += self.speed[1] * t
self.timeLimit -= t self.timeLimit -= t
print("Float:",t)
else:
pass
def getSituation(self): def getSituation(self):
print("Now position is:",self.position) print("Now position is:",self.position)
@@ -177,349 +197,248 @@ class Santa:
print("Now weightOfGift is:",self.weightOfGift) print("Now weightOfGift is:",self.weightOfGift)
print("Now weightOfCarrots is:",self.weightOfCarrots) print("Now weightOfCarrots is:",self.weightOfCarrots)
def generateTableauDeDistribution(self, pp: People):
self.tableauDeDistribution = sorted(pp.info, key=lambda x: x.caculatePriority(), reverse=True)
return self.tableauDeDistribution
def kidoneWay(self,x:int,p:Person): def kidoneWay(self,x:int,p:Person):
v = self.nowSpeedLimit() v = self.nowSpeedLimit()
if isinstance(x/v,int) and x > 0: if isinstance(x/v,int) and x > 0 :
t = x/v t = x/v
self.AccUp(v) self.AccUp(v)
print("AccUp:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccDown(v) self.AccDown(v)
print("AccLeft:",v) self.Float(1)
self.Float()
print("Float:",1)
self.DiliveryGift(p) self.DiliveryGift(p)
print("Delivert gift to",p.name)
t = x/v t = x/v
self.AccDown(v) self.AccDown(v)
print("AccDown:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccUp(v) self.AccUp(v)
print("AccUp:",v) self.Float(1)
self.Float()
print("Float:",1)
elif isinstance(x/v,int) and x < 0: elif isinstance(x/v,int) and x < 0 :
t = abs(x)/v t = abs(x)/v
self.AccDown(v) self.AccDown(v)
print("AccDown:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccUp(v) self.AccUp(v)
print("AccUp:",v) self.Float(1)
self.Float()
print("Float:",1)
self.DiliveryGift(p) self.DiliveryGift(p)
print("Delivert gift to",p.name)
t = abs(x)/v t = abs(x)/v
self.AccUp(v) self.AccUp(v)
print("AccUp:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccDown(v) self.AccDown(v)
print("AccDown:",v) self.Float(1)
self.Float()
print("Float:",1)
elif x < v and x > 0: elif x < v and x > 0 :
v = x v = x
self.AccUp(v) self.AccUp(v)
print("AccUp:",v) self.Float(1)
self.Float()
print("Float:",1)
self.AccDown(v) self.AccDown(v)
print("AccDown:",v) self.Float(1)
self.Float()
print("Float:",1)
self.DiliveryGift(p) self.DiliveryGift(p)
print("Delivert gift to",p.name)
v = x v = x
self.AccDown(v) self.AccDown(v)
print("AccDown:",v)
self.Float() self.Float()
print("Float:",1)
self.AccUp(v) self.AccUp(v)
print("AccUp:",v) self.Float(1)
self.Float()
print("Float:",1)
elif abs(x) < v and x < 0: elif abs(x) < v and x < 0 :
v = abs(x) v = abs(x)
self.AccDown(v) self.AccDown(v)
print("AccDown:",v) self.Float(1)
self.Float()
print("Float:",1)
self.AccUp(v) self.AccUp(v)
print("AccUp:",v) self.Float(1)
self.Float()
print("Float:",1)
self.DiliveryGift(p) self.DiliveryGift(p)
print("Delivert gift to",p.name)
v = x v = x
self.AccUp(v) self.AccUp(v)
print("AccUp:",v) self.Float(1)
self.Float()
print("Float:",1)
self.AccDown(v) self.AccDown(v)
print("AccDown:",v) self.Float(1)
self.Float()
print("Float:",1)
elif x > v and x > 0: elif x > v and x > 0 :
t = x//v t = x//v
v1 = v - (x - t*v) v1 = v - (x - t*v)
self.AccUp(v) self.AccUp(v)
print("AccUp:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccDown(v1) self.AccDown(v1)
print("AccDown:",v1)
self.Float() self.Float()
print("Float:",1)
self.AccDown(v - v1) self.AccDown(v - v1)
print("AccDown:",v - v1) self.Float(1)
self.Float()
print("Float:",1)
self.DiliveryGift(p) self.DiliveryGift(p)
print("Delivert gift to",p.name)
t = x//v t = x//v
v1 = v - (x - t*v) v1 = v - (x - t*v)
self.AccDown(v) self.AccDown(v)
print("AccDown:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccUp(v1) self.AccUp(v1)
print("AccUp:",v1) self.Float(1)
self.Float()
print("Float:",1)
self.AccUp(v - v1) self.AccUp(v - v1)
print("AccUp:",v - v1) self.Float(1)
self.Float()
print("Float:",1)
elif abs(x) > v and x < 0: elif abs(x) > v and x < 0 :
t = abs(x)//v t = abs(x)//v
v1 = v - (abs(x) - t*v) v1 = v - (abs(x) - t*v)
self.AccDown(v) self.AccDown(v)
print("AccDown:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccUp(v1) self.AccUp(v1)
print("AccUp:",v1) self.Float(1)
self.Float()
print("Float:",1)
self.AccUp(v - v1) self.AccUp(v - v1)
print("AccUp:",v - v1) self.Float(1)
self.Float()
print("Float:",1)
self.DiliveryGift(p) self.DiliveryGift(p)
print("Delivert gift to",p.name)
t = abs(x)//v t = abs(x)//v
v1 = v - (abs(x) - t*v) v1 = v - (abs(x) - t*v)
self.AccUp(v) self.AccUp(v)
print("AccUp:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccDown(v1) self.AccDown(v1)
print("AccDown:",v1) self.Float(1)
self.Float()
print("Float:",1)
self.AccDown(v - v1) self.AccDown(v - v1)
print("AccDown:",v - v1) self.Float(1)
self.Float()
print("Float:",1)
def oneWay(self, p:Person): def oneWay(self, p:Person):
if self.timeLimit >0:
self.LoadCarrots(12) self.LoadCarrots(12)
print("LoarCarrots:12") print("LoarCarrots:12")
self.LoadGift(p.weightOfGift) self.LoadGift(p.weightOfGift)
print("LoarGift:",p.weightOfGift) print("LoarGift:",p.weightOfGift)
v = self.nowSpeedLimit() v = self.nowSpeedLimit()
if isinstance(p.x_position/v,int) and p.x_position > 0: if isinstance(p.x_position/v,int) and p.x_position > 0 :
t = p.x_position/v t = p.x_position/v
self.AccRight(v) self.AccRight(v)
print("AccRight:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccLeft(v) self.AccLeft(v)
print("AccLeft:",v) self.Float(1)
self.Float()
print("Float:",1)
self.kidoneWay(p.y_position,p) self.kidoneWay(p.y_position,p)
t = p.x_position/v t = p.x_position/v
self.AccLeft(v) self.AccLeft(v)
print("AccLeft:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccRight(v) self.AccRight(v)
print("AccRight:",v)
self.Float() self.Float()
print("Float:",1)
elif isinstance(p.x_position/v,int) and p.x_position < 0: elif isinstance(p.x_position/v,int) and p.x_position < 0:
t = abs(p.x_position)/v t = abs(p.x_position)/v
self.AccLeft(v) self.AccLeft(v)
print("AccLeft:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccRight(v) self.AccRight(v)
print("AccRight:",v) self.Float(1)
self.Float()
print("Float:",1)
self.kidoneWay(p.y_position,p) self.kidoneWay(p.y_position,p)
t = abs(p.x_position)/v t = abs(p.x_position)/v
self.AccRight(v) self.AccRight(v)
print("AccRight:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccLeft(v) self.AccLeft(v)
print("AccLeft:",v) self.Float(1)
self.Float()
print("Float:",1)
elif p.x_position < v and p.x_position > 0: elif p.x_position < v and p.x_position > 0 :
v = p.x_position v = p.x_position
self.AccRight(v) self.AccRight(v)
print("AccRight:",v) self.Float(1)
self.Float()
print("Float:",1)
self.AccLeft(v) self.AccLeft(v)
print("AccLeft:",v) self.Float(1)
self.Float()
print("Float:",1)
self.kidoneWay(p.y_position,p) self.kidoneWay(p.y_position,p)
v = p.x_position v = p.x_position
self.AccLeft(v) self.AccLeft(v)
print("AccLeft:",v) self.Float(1)
self.Float()
print("Float:",1)
self.AccRight(v) self.AccRight(v)
print("AccRight:",v) self.Float(1)
self.Float()
print("Float:",1)
elif abs(p.x_position) < v and p.x_position < 0: elif abs(p.x_position) < v and p.x_position < 0 :
v = abs(p.x_position) v = abs(p.x_position)
self.AccLeft(v) self.AccLeft(v)
print("AccLeft:",v) self.Float(1)
self.Float()
print("Float:",1)
self.AccRight(v) self.AccRight(v)
print("AccRight:",v) self.Float(1)
self.Float()
print("Float:",1)
self.kidoneWay(p.y_position,p) self.kidoneWay(p.y_position,p)
v = p.x_position v = p.x_position
self.AccRight(v) self.AccRight(v)
print("AccRight:",v) self.Float(1)
self.Float()
print("Float:",1)
self.AccLeft(v) self.AccLeft(v)
print("AccLeft:",v) self.Float(1)
self.Float()
print("Float:",1)
elif p.x_position > v and p.x_position > 0: elif p.x_position > v and p.x_position > 0 :
t = p.x_position//v t = p.x_position//v
v1 = v - (p.x_position - t*v) v1 = v - (p.x_position - t*v)
self.AccRight(v) self.AccRight(v)
print("AccRight:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccLeft(v1) self.AccLeft(v1)
print("AccLeft:",v1) self.Float(1)
self.Float()
print("Float:",1)
self.AccLeft(v - v1) self.AccLeft(v - v1)
print("AccLeft:",v - v1) self.Float(1)
self.Float()
print("Float:",1)
self.kidoneWay(p.y_position,p) self.kidoneWay(p.y_position,p)
t = p.x_position//v t = p.x_position//v
v1 = v - (p.x_position - t*v) v1 = v - (p.x_position - t*v)
self.AccLeft(v) self.AccLeft(v)
print("AccLeft:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccRight(v1) self.AccRight(v1)
print("AccRight:",v1) self.Float(1)
self.Float()
print("Float:",1)
self.AccRight(v - v1) self.AccRight(v - v1)
print("AccRight:",v - v1) self.Float(1)
self.Float()
print("Float:",1)
elif abs(p.x_position) > v and p.x_position < 0: elif abs(p.x_position) > v and p.x_position < 0 :
t = abs(p.x_position)//v t = abs(p.x_position)//v
v1 = v - (abs(p.x_position) - t*v) v1 = v - (abs(p.x_position) - t*v)
self.AccLeft(v) self.AccLeft(v)
print("AccLeft:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccRight(v1) self.AccRight(v1)
print("AccRight:",v1) self.Float(1)
self.Float()
print("Float:",1)
self.AccRight(v - v1) self.AccRight(v - v1)
print("AccRight:",v - v1) self.Float(1)
self.Float()
print("Float:",1)
self.kidoneWay(p.y_position,p) self.kidoneWay(p.y_position,p)
t = abs(p.x_position)//v t = abs(p.x_position)//v
v1 = v - (abs(p.x_position) - t*v) v1 = v - (abs(p.x_position) - t*v)
self.AccRight(v) self.AccRight(v)
print("AccRight:",v)
self.Float(t) self.Float(t)
print("Float:",t)
self.AccLeft(v1) self.AccLeft(v1)
print("AccLeft:",v1) self.Float(1)
self.Float()
print("Float:",1)
self.AccLeft(v - v1) self.AccLeft(v - v1)
print("AccLeft:",v - v1) self.Float(1)
self.Float() elif p.x_position == 0 :
print("Float:",1)
else:
self.kidoneWay(p.y_position,p) self.kidoneWay(p.y_position,p)
print("Get score:",Score)
s = Santa() s = Santa()
s.speedLimitTable
pp = People() pp = People()
s.oneWay(pp.info[2]) pp.info[0]
pp.visualization() pp.visualization()
s.LoadGift(10) s.generateTableauDeDistribution(pp)
for i in s.generateTableauDeDistribution(pp):
s.oneWay(i)
s.getSituation()
Score
pp.info[2].getPosition()