Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 28, 2013 17:35:14

nokados
От: Ростов
Зарегистрирован: 2013-10-15
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача о графах

Между 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. Объясните еще, как работает программа



моя подпись

Офлайн

#2 Окт. 28, 2013 18:11:22

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Задача о графах

nokados
Ты хочешь, чтобы тебе решили задачу, объяснили как работает код, а ты при этом ничего сам не сделаешь ?



Офлайн

#3 Окт. 28, 2013 18:45:00

nokados
От: Ростов
Зарегистрирован: 2013-10-15
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача о графах

Budulianin, я решаю параллельно, но у меня ничего работающего пока не получается. Мог бы я решить сам, я не просил бы помощи у специалистов.



моя подпись

Офлайн

#4 Окт. 29, 2013 05:15:21

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

Задача о графах

nokados
но у меня ничего работающего пока не получается.
ты покажи, что конкретно не работает. тогда и помочь легче

Офлайн

#5 Окт. 29, 2013 08:08:08

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Задача о графах

М = 2 или 3. А 5 уже не может ?

nokados
A(i,j), где I,J-номера пунктов
nokados
Скорость I-того робота
шо ?

Отредактировано Singularity (Окт. 29, 2013 08:57:12)

Офлайн

#6 Окт. 29, 2013 14:18:11

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Задача о графах

Хоть 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



Офлайн

#7 Окт. 29, 2013 15:46:33

nokados
От: Ростов
Зарегистрирован: 2013-10-15
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача о графах

Singularity
М = 2 или 3. А 5 уже не может ?
nokados
A(i,j), где I,J-номера пунктов
nokados
Скорость I-того робота
шо ?
Условие составлял не я. Брал с Алголиста.



моя подпись

Офлайн

#8 Окт. 29, 2013 20:38:41

nokados
От: Ростов
Зарегистрирован: 2013-10-15
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача о графах

У меня пока получилась программа для 1 случая(все дороги по единице). И не работает в следующих случаях:

  1. Если нет решений (например граф не связан)
  2. если встречаются на одной дороге роботы с разными скоростями.

Собственно код:
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)



моя подпись

Офлайн

#9 Окт. 29, 2013 20:44:14

nokados
От: Ростов
Зарегистрирован: 2013-10-15
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача о графах

Работает она так: Если робот находится в городе, то он “разделяется”. Его дубли/клоны идут по всем доступным дорогам из этого города. После каждого шага проверяется, есть ли в каком-либо месте столько РАЗНЫХ роботов, сколько их было в самом начале. Если да, то значит путь найден, программу можно завершать, иначе

time+=0.5
и следующий шаг.

По сути грубый перебор.



моя подпись

Отредактировано nokados (Окт. 29, 2013 20:45:38)

Офлайн

#10 Окт. 30, 2013 08:04:07

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Задача о графах

Надо запоминать состояния и избегать повторов. Так можно определить, что нет решения.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version