Поиск:

Ответ в темуСоздание новой темы Создание опроса
> параллельные процессы, модель работы лифта, Ошибка в программном коде 
:(
    Опции темы
YaMolekula
  Дата 13.11.2011, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.9.2011

Репутация: нет
Всего: нет



Здравствуйте! Я пытаюсь решить задачу на параллельные процессы, она звучит следующим образом:
Цитата

Разработайте систему, управляющую пассажирским лифтом, с одной кнопкой вызова. Реализуйте схему работы лифта при перевозке пассажиров, если есть вызовы, то лифт останавливается при движении вниз.


Для написания кода я взял за основу модель "производитель-потребитель".Вышел следующий алгоритм, рабочий:
Код

# To change this template, choose Tools | Templates
# and open the template in the editor.

require 'semaphore'
t0 = Time.now

max=5#грузоподъемность(максимальное количество людей в лифте)
c = 10#колличество циклов

tp = []#индексы потребителя
tc = []#индексы производителя


#параметры работы лифта
ffrom=Array.new(max)#этаж, где нажата кнопка (0 - кнопка не была нажата)
fto=Array.new(max)#этаж, запрошенный пассажиром лифта

prod_from=[]#этаж где был взят пассажир для первого процесса
prod_to=[]#этаж который запросил пассажир для первого процесса
cons_from=[]#этаж где был взят пассажир для второго процесса
cons_to=[]#этаж который запросил пассажир для второго процесса

buf = Array.new(max)#буфер для информации о пассажирах
s1 = Semaphore.new(buf.size)#защита от переполнения буфера
s2 = Semaphore.new(0)
m  = Semaphore.new(1)
first=true

producer = Thread.new do#процесс-производитель - вводит пассажиров
  i = 0
  j=0
  c.times do
    #sleep(rand(5)%5)
    good_pas=false
    m.P
    d = rand(8)+1
    puts "вызов лифта на этаже #{d}" unless(first)
    unless(first)then
      if((d>fto[j])and(d<=ffrom[j]))then
        good_pas=true
        puts "пассажир будет взят по пути\n"
      else
        puts "пассажир не может быть взят по пути\n"
      end
    end
    j = ( j + 1 ) % buf.size unless(first)
    m.V unless(good_pas)
    ffrom[i]=d
    fto[i]=rand(8)+1;
    first=false
    while(fto[i]==ffrom[i])do fto[i]=rand(8)+1;  end
    prod_from<<ffrom[i]
    prod_to<<fto[i]
    tp << d
    s1.P
    m.P unless(good_pas)
    puts "\nс #{ffrom[i]}-го этажа зашёл пассажир и запросил #{fto[i]}-й этаж"
    buf[i] = d
    m.V
    s2.V
    i = ( i + 1 ) % buf.size#когда i+1=buf.size,i присваивается 0 как при первой итерации
  end
end

consumer = Thread.new do#процесс-потребитель - выводит пассажиров
  i = 0
  c.times do
    s2.P
    m.P
    d = buf[i]
    puts "\nприбыл пассажир с #{ffrom[i]}-го на #{fto[i]}-й"
    cons_from<<ffrom[i]
    cons_to<<fto[i]
    m.V
    s1.V
    tc << d
    i = ( i + 1 ) % buf.size
  end
end

producer.join
consumer.join

puts "\nмассив этажей входа, с точки зрения производителя:\n\t["+prod_from.join(',')+"]"
puts "массив этажей выхода, с точки зрения производителя:\n\t["+prod_to.join(',')+"]"
puts "массив этажей входа, с точки зрения потребителя:\n\t["+cons_from.join(',')+"]"
puts "массив этажей выхода, с точки зрения потребителя:\n\t["+cons_to.join(',')+"]"

puts "\n\nПроверка на равенство этажей входа: #{prod_from==cons_from}"
puts "Проверка на равенство этажей выхода: #{prod_to==cons_to}"
puts "Время выполнения: #{Time.now - t0}"


Но выходят очень странные данные. Получается, что пассажиры запрашивают лифт лишь когда лифт взял какого-либо пассажира и везёт его. Но нет ни одного пассажира (кроме первого) который запросил бы лифт, когда в лифте никого нет. Данные выходят такие:
Цитата


с 3-го этажа зашёл пассажир и запросил 4-й этаж
вызов лифта на этаже 7
пассажир не может быть взят по пути

прибыл пассажир с 3-го на 4-й

с 7-го этажа зашёл пассажир и запросил 5-й этаж
вызов лифта на этаже 3
пассажир не может быть взят по пути

прибыл пассажир с 7-го на 5-й

с 3-го этажа зашёл пассажир и запросил 8-й этаж
вызов лифта на этаже 1
пассажир не может быть взят по пути

прибыл пассажир с 3-го на 8-й

с 1-го этажа зашёл пассажир и запросил 2-й этаж
вызов лифта на этаже 7
пассажир не может быть взят по пути

прибыл пассажир с 1-го на 2-й

с 7-го этажа зашёл пассажир и запросил 6-й этаж
вызов лифта на этаже 8
пассажир не может быть взят по пути

прибыл пассажир с 7-го на 6-й

с 8-го этажа зашёл пассажир и запросил 3-й этаж
вызов лифта на этаже 2
пассажир не может быть взят по пути

прибыл пассажир с 8-го на 3-й

с 2-го этажа зашёл пассажир и запросил 8-й этаж
вызов лифта на этаже 6
пассажир не может быть взят по пути

прибыл пассажир с 2-го на 8-й

с 6-го этажа зашёл пассажир и запросил 8-й этаж
вызов лифта на этаже 1
пассажир не может быть взят по пути

прибыл пассажир с 6-го на 8-й

с 1-го этажа зашёл пассажир и запросил 7-й этаж
вызов лифта на этаже 4
пассажир не может быть взят по пути

прибыл пассажир с 1-го на 7-й

с 4-го этажа зашёл пассажир и запросил 8-й этаж

прибыл пассажир с 4-го на 8-й

массив этажей входа, с точки зрения производителя:
        [3,7,3,1,7,8,2,6,1,4]
массив этажей выхода, с точки зрения производителя:
        [4,5,8,2,6,3,8,8,7,8]
массив этажей входа, с точки зрения потребителя:
        [3,7,3,1,7,8,2,6,1,4]
массив этажей выхода, с точки зрения потребителя:
        [4,5,8,2,6,3,8,8,7,8]


Проверка на равенство этажей входа: true
Проверка на равенство этажей выхода: true
Время выполнения: 0.125002


Подскажите пожалуйста, есть ли способ решения этой проблемы?

Это сообщение отредактировал(а) YaMolekula - 13.11.2011, 18:28
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby: Общие вопросы"
source777
  • С чего начать? начинаем
  • Ссылки на полезные ресурсы смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0680 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.