Форум сайта python.su
Между N пунктами (N<=50) заданы дороги длиной A(i,j), где I,J-номера пунктов. Дороги проложены на разной высоте и пересекаются только в общих пунктах. В начальный момент времени из заданных пунктов начинают двигаться с постоянной скоростью M роботов (M=2 или 3), независимо меняя направление движения только в пунктах. Роботы управляются таким образом, чтобы минимизировать время до встречи всех роботов в одном месте. Скорость I-того робота может быть равна 1 или 2. Остановка роботов запрещена.
Задание:
Написать программу, которая:
1) при заданных N,M и сети дорог единичной длины (все имеющиеся A(i,j)=1) определяет минимальное время, через которое может произойти встреча всех M роботов, при этом начальное положение роботов и скорость их движения известны.
2) Выполнить те же действия, что и в п. 1, но только для различных значений A(i,j).
Примечание: В случае невозможности встречи всех M роботов в одном месте ни в какой момент времени в результате выполнения программы должно быть сформировано соответствующее сообщение.
Требование к вводу-выводу:
1) Все входные данные - целые неотрицательные числа;
2) при задании сети дорог должно быть указано количество дорог - K и пункты их начала и конца в виде пар (i,j).
P.S. Объясните еще, как работает программа
Офлайн
nokados
Ты хочешь, чтобы тебе решили задачу, объяснили как работает код, а ты при этом ничего сам не сделаешь ?
Офлайн
Budulianin, я решаю параллельно, но у меня ничего работающего пока не получается. Мог бы я решить сам, я не просил бы помощи у специалистов.
Офлайн
nokadosты покажи, что конкретно не работает. тогда и помочь легче
но у меня ничего работающего пока не получается.
Офлайн
М = 2 или 3. А 5 уже не может ?
nokados
A(i,j), где I,J-номера пунктов
nokadosшо ?
Скорость I-того робота
Отредактировано Singularity (Окт. 29, 2013 08:57:12)
Офлайн
Хоть nokados своего кода не показал, привожу пример для роботов с одинаковыми скоростями.
# coding: windows-1251
import itertools
class Map:
def __init__( self, N, roads, start_state ):
# Строим индексы соседних узлов
index = [ set() for n in range(N) ]
for n1, n2 in roads:
index[n1].add( n2 )
index[n2].add( n1 )
self.index = index
# Уже обработанные состояния
self.old_states = dict( [[start_state,None]] )
# Возможные состояния на текущем шаге
self.last_states = [ start_state ]
def states_gen( self, state ):
args = [ self.index[n] for n in state ]
return ( s for s in itertools.product( *args ) if s not in self.old_states )
def one_step( self ):
print "Next step, last_states: %d, old_states: %d" % ( len( self.last_states ), len( self.old_states ) )
new_states = []
for state in self.last_states:
for new_state in self.states_gen( state ):
self.old_states[ new_state ] = state
if len( set( new_state ) ) == 1:
print "Solution found, node = ", new_state[0]
self.print_path( new_state )
return True
new_states.append( new_state )
if not new_states:
print "Solution not found"
return True
self.last_states = new_states
return False
def print_path( self, state ):
while state:
print repr( state )
state = self.old_states[ state ]
# Исходные данные для 10 узлов
N = 10
roads = [ (0,1), (0,2), (1,2), (2,3), (1,3), (3,4), (4,5), (5,6), (6,7), (7,8), (8,9) ]
start = ( 0, 1, 9 )
proc = Map( N, roads, start )
while not proc.one_step():
pass
Офлайн
SingularityУсловие составлял не я. Брал с Алголиста.
М = 2 или 3. А 5 уже не может ?
nokados
A(i,j), где I,J-номера пунктов
nokados
Скорость I-того робота
шо ?
Офлайн
У меня пока получилась программа для 1 случая(все дороги по единице). И не работает в следующих случаях:
citis=set() roads={} robots=[] places=[] where={} time=0 nc=int(raw_input('Сколько дорог?')) print('city1 city2 dlina') for i in range(nc): s=raw_input().split() roads[(s[0],s[1])]=s[2] citis.update(set(s[:2])) #составим список мест, где могут находиться роботы for i in citis: places.append({'type':'city','obj':i}) for i in roads: places.append({'type':'road','obj':i}) nr=int(raw_input('Сколько Роботов?')) print('city skorost') for i in range(nr): s=raw_input().split() for (j,item) in enumerate(places): if item['type']=='city' and item['obj']==s[0]: robots.append({'place':j, 'v':s[1], 'color':i}) break; for i in robots: #удаляем одинаковые t=i for j in robots: if j['place']==t['place'] and j['v']==t['v']: robots.remove(j) robots.append(t) nr=len(robots) colors=[i['color'] for i in robots] ncolors=len(colors) def step(robots): # time+=0.5 new_robots=[] for (w,i) in enumerate(robots): pl=places[i['place']] if pl['type']=='city': for road in roads: if pl['obj'] in road: if i['v']==1: place=places.index({'type':'road','obj':road}) where[w]=road[0] if pl['obj']==road[1] else road[1] else: place=places.index({'type':'city','obj':road[0] if pl['obj']==road[1] else road[1]}) new_robots.append({'place':place,'v':i['v'],'color':i['color']}) else:#Раз робот на дороге, то его скорость равна 1 place=places.index({'type':'city','obj':where[w]}) new_robots.append({'place':place,'v':i['v'],'color':i['color']}) where.pop(w) robots=new_robots #Теперь удалю одинаковых, чтобы излищне не нагружать комп. for i in robots: t=i while i in robots: robots.remove(i) robots.append(i) return robots def is_together(): r_in_p=[] for i in range(len(places)): r_in_p.append(0) for j in robots: r_in_p[j['place']]+=1 if max(r_in_p)>=ncolors: return True else: return False while not(is_together()): time+=0.5 robots=step(robots) print(time)
Офлайн
Работает она так: Если робот находится в городе, то он “разделяется”. Его дубли/клоны идут по всем доступным дорогам из этого города. После каждого шага проверяется, есть ли в каком-либо месте столько РАЗНЫХ роботов, сколько их было в самом начале. Если да, то значит путь найден, программу можно завершать, иначе
time+=0.5
Отредактировано nokados (Окт. 29, 2013 20:45:38)
Офлайн
Надо запоминать состояния и избегать повторов. Так можно определить, что нет решения.
Офлайн