Python 3
สิ่งนี้ไม่ได้แย่ไปกว่า 1 ที่ดีที่สุดในกรณีทดสอบใด ๆ ฉันเชื่อว่าและทำได้ใน 5 วินาที
โดยทั่วไปฉันใช้วิธีแถบเดียว ฉันสุ่มสั่งซื้ออินพุตจากนั้นใส่น้ำหนักลงในแถบทีละครั้ง แต่ละองค์ประกอบจะอยู่ในตำแหน่งที่ลดน้ำหนักส่วนเกินทั้งสองข้างหรือตำแหน่งที่ดีที่สุดที่สองจากมุมมองนั้นโดยใช้ 75% ในอดีตและ 25% ของเวลา จากนั้นฉันจะตรวจสอบว่ามือถือมีความสมดุลในตอนท้ายและดีกว่ามือถือที่ดีที่สุดที่เคยพบมา ฉันเก็บที่ดีที่สุดแล้วหยุดและพิมพ์ออกมาหลังจากค้นหา 5 วินาที
ผลลัพธ์ในระยะเวลา 5 วินาที:
py mobile.py <<< '3 8 7 5 9'
Best mobile found, score 15:
|
+-+-+-+-+
| | | | |
8 7 3 5 9
py mobile.py <<< '2 2 1 9'
Best mobile found, score 13:
|
+-++-+-+
| | | |
1 9 2 2
py mobile.py <<< '2 3 3 5 3 9'
Best mobile found, score 18:
|
+-+-+-+-+-+
| | | | | |
2 3 3 5 9 3
py mobile.py <<< '8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7'
Best mobile found, score 49:
|
+-+--+-+-+-+-+-+++-+-+-+-+-+-+-+
| | | | | | | | | | | | | | | |
7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
\py mobile.py <<< '1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 7 7'
Best mobile found, score 61:
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--+
| | | | | | | | | | | | | | | | | | | |
1 7 7 5 4 3 1 9 6 7 8 2 2 9 3 7 6 5 8 4
py mobile.py <<< '3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7'
Best mobile found, score 51:
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | | | | | | |
4 4 6 7 7 4 5 7 6 6 5 4 6 3 5 5 7
รหัส:
import random
import time
class Mobile:
def __init__(self):
self.contents = {}
self.lean = 0
def usable(self, loc):
return not any(loc + k in self.contents for k in (-1,0,1))
def choose_point(self, w):
def goodness(loc):
return abs(self.lean + w * loc)
gl = sorted(list(filter(self.usable,range(min(self.contents.keys() or [0]) - 5,max(self.contents.keys() or [0]) + 6))), key=goodness)
return random.choice((gl[0], gl[0], gl[0], gl[1]))
def add(self, w, loc):
self.contents[loc] = w
self.lean += w*loc
def __repr__(self):
width = range(min(self.contents.keys()), max(self.contents.keys()) + 1)
return '\n'.join((''.join(' ' if loc else '|' for loc in width),
''.join('+' if loc in self.contents or loc == 0 else '-' for loc in width),
''.join('|' if loc in self.contents else ' ' for loc in width),
''.join(str(self.contents.get(loc, ' ')) for loc in width)))
def score(self):
return max(self.contents.keys()) - min(self.contents.keys()) + len(self.contents) + 2
def my_score(self):
return max(self.contents.keys()) - min(self.contents.keys()) + 1
best = 1000000
best_mob = None
in_weights = list(map(int,input().split()))
time.clock()
while time.clock() < 5:
mob = Mobile()
for insert in random.sample(in_weights, len(in_weights)):
mob.add(insert, mob.choose_point(insert))
if not mob.lean:
if mob.score() < best:
best = mob.score()
best_mob = mob
print("Best mobile found, score %d:" % best_mob.score())
print(best_mob)
หนึ่งในวิธีแก้ปัญหาเหล่านี้ซึ่งฉันเชื่อว่าเป็นสิ่งที่ดีที่สุดคือวิธีที่ยาวที่สุดซึ่งมีวิธีแก้ปัญหานี้ซึ่งฉันพบหลังจากใช้เวลา 10 นาที:
Best mobile found, score 60:
|
+-+-+-+-+-+-+-+-+-+++-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | | | | | | | | | |
3 2 9 4 7 8 1 6 9 8 7 1 6 2 4 5 7 3 5 7