Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите пожалуйста с домашним заданием!! 
:(
    Опции темы
iritschultz
Дата 3.12.2011, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужно создать симуляцию компании, которая нанимает программистов. Код содержит информацию о 7 компаниях, 7 программистах и 10 проектах. Вся она хранится в  "array of hashes".

programmers = [
  {"name" => "Martin", "speed" => 2.0, "daily_wage" => 2000},
  {"name" => "Jarda", "speed" => 1.0, "daily_wage" => 1300},
  # more programmers...
]
 
companies = [
  {"name" => "Alpha", "capacity" => 2, "daily_expenses" => 1000, "budget" => 100000},
  {"name" => "Beta", "capacity" => 2, "daily_expenses" => 1500, "budget" => 150000},
  # more companies...
]
 
projects = [
  {"name" => "Web", "man_days" => 5.0, "price" => 20000},
  {"name" => "Portal", "man_days" => 15.0, "price" => 60000},
  # more projects...


Компания должна завершить 10 проектов. Чтобы работать над проектами компании нужно нанять программистов в соответствии с их employees capacity. Каждый проект различается по трудодням и цене, которую компания получает за его выполнение.У программистов разная продуктивность.Их продуктивность определена как "speed", это значит кол-во трудодней работы программист может сделать в один день. Каждый программист может работать только над одним проектом, но над одним проектом могуть работать несколько программистов. Симуляция должна идти последовательно, каждая компания работает с одним и тем же проектом и с одними и теми же программистами. Различие лишь в том, какое кол-во программистов может нанять компания.Симуляция может заканчиваться 3 способами:
1.Компания заканчивает все проекты и ставит статус " "finished"
2.Бюджет кончается и компания ставит статус  "bankrupt"
3.Если кол-во дней превышает1000, симуляция заканчивается автоматически и компания ставит статус "idle". Но в нашей практике не было компании, которая превышала бы 200 дней, это правило нужно лишь для избежания бесконечных циклов.
как оптимизировать выбор программистов для пректов - это ваше дело. Как мы знаем, даже такой глупый способ как нанять первых Х программистов (где X это capacity компании) и позволить им работать над продуктами тоже приводит к удовлетворительным результатам. Тут нет единого верного решения, ваше задание привести как можно больше компаний к удачным результатам. вы можете выбрать любой алгоритм.Незаконченный код в приложении уже содержит законченный классы Programmer и Project и почти законченный класс Company. компания может читать данные из arrays в objects, делать симуляцию для каждой компании и выдавать результаты. Код уже делает симуляции для всех компаний.

company_objects = []
companies.each do |c|
  # Create all objects of Company type and assign them to company_objects
  company_objects << Company.new(c["name"],c["capacity"],c["daily_expenses"],c["budget"])
end
 
# This cycle repeats for each company:
company_objects.each do |c|
  # Hire programmers
  c.allocate_programmers(programmers)
  # Initialize projects
  c.allocate_projects(projects)
  # Run simulation
  c.run
  # Display result
  c.output_result
end

Ваша задача ввести индивидуальные методы в симуляцию, которые привязывают программистов к проектам, проверить закончены ли проекты и управлять денежными переводами между компаниями, программистами и проектами. метод check_projects уже введен чтобы показывать пример, который мы ожидаем, остальная часть на вас. Методы, которые вы должны ввести: check_programmers, assign_new_projects, programmers_work, check_company_state. Описание их функций в комментариях в коде.
# Check what projects are already finished and move them to
  # an array @projects_done
  def check_projects
    @projects_current.each do |project|
      if (project.man_days_done >= project.man_days)
        project.state = 'done'
        @projects_done << project
        @projects_current.delete(project)
        @budget += project.price
      end
    end
  end
 
  # Unassign programmers who work on already finished projects.
  def check_programmers
    # IMPLEMENT THIS METHOD
  end
 
  # Assign new projects from @projects_waiting to programmmers who
  # are available. Move these projects to @projects_current
  def assign_new_projects
    # IMPLEMENT THIS METHOD
  end
 
  # Programmers work. Iterate all programmers and assign their daily work to
  # their assigned projects. At the same time, give programmers their wages
  # and process the daily expenses of the company.
  def programmers_work
    # IMPLEMENT THIS METHOD
  end
 
  # Check the state of the company. If the budget is < 0, set its state
  # to :bankrupt. If all projects are finished, set its state to :finished.
  def check_company_state
    # IMPLEMENT THIS METHOD
  end

Этот метод будет вызван метедом, который управляет симуляцией 

# Run the simulation. The cycle ends when the state of the company is
# either "bankrupt" or "finished", or if the simulation runs for longer
# than 1000 days
def run
  @state = "running"
  while @state != "bankrupt" and @state != "finished" and @days <= 1000
    @days += 1
    check_projects
    check_programmers
    assign_new_projects

вы можете выбрать другой способ решения, не используя этот код. Или вы можете изменить дизайн. В таком случае знайте, что мы ожидаем объектный! код. Tрешение должно отвечать следующим требованиям:
Должно содержать определение class для programmer, project, company.
Вся информация должна храниться в разных объектах. Никаких больше независимых методов свободно определенных вне классов.

Код:
Data about programmers. Speed means how many man-days of work
# the given programmer does in one day. Daily_wage is a one-day
# salary of the programmer.
programmers = [
  {"name" => "Martin", "speed" => 2.0, "daily_wage" => 2000},
  {"name" => "Jarda", "speed" => 1.0, "daily_wage" => 1300},
  {"name" => "Lukas", "speed" => 0.5, "daily_wage" => 900},
  {"name" => "Pepa", "speed" => 1.7, "daily_wage" => 2200},
  {"name" => "Kamil", "speed" => 0.4, "daily_wage" => 1800},
  {"name" => "Honza", "speed" => 1.2, "daily_wage" => 1500},
  {"name" => "Filip", "speed" => 1.1, "daily_wage" => 1000}
]

# Data about companies. The capacity says how many programmers can
# the company hire. Daily_expenses are fixed expenses of the company
# per one work day.
companies = [
  {"name" => "Alpha", "capacity" => 2, "daily_expenses" => 1000, "budget" => 100000},
  {"name" => "Beta", "capacity" => 2, "daily_expenses" => 1500, "budget" => 150000},
  {"name" => "Gamma", "capacity" => 3, "daily_expenses" => 3000, "budget" => 300000},
  {"name" => "Delta", "capacity" => 5, "daily_expenses" => 6000, "budget" => 500000},
  {"name" => "Epsilon", "capacity" => 6, "daily_expenses" => 8000, "budget" => 1000000},
  {"name" => "Theta", "capacity" => 7, "daily_expenses" => 10000, "budget" => 1500000},
  {"name" => "Omega", "capacity" => 7, "daily_expenses" => 20000, "budget" => 25000000}
]

# Data about projects. Man-days is a number of man-days that must be done
# on a particular project to finish it. Price is an amount of money the company
# receives if the project is successfully finished.
projects = [
  {"name" => "Web", "man_days" => 5.0, "price" => 20000},
  {"name" => "Portal", "man_days" => 15.0, "price" => 60000},
  {"name" => "Email system", "man_days" => 25.0, "price" => 90000},
  {"name" => "Eshop", "man_days" => 40.0, "price" => 150000},
  {"name" => "CMS", "man_days" => 60.0, "price" => 250000},
  {"name" => "Forum", "man_days" => 30.0, "price" => 35000},
  {"name" => "B2B System", "man_days" => 120.0, "price" => 800000},
  {"name" => "Multimedia Web", "man_days" => 7.0, "price" => 50000},
  {"name" => "TODO List", "man_days" => 3.0, "price" => 10000},
  {"name" => "CRM", "man_days" => 20.0, "price" => 80000}
]


class Programmer
  attr_reader :name, :speed, :daily_wage
  attr_reader :project

  def initialize(name, speed, daily_wage)
    @name=name
    @speed=speed
    @daily_wage=daily_wage
    @project = nil
  end

  # Set which project the programmer works on
  def assign_project(project)
    @project = project
  end

  # Unassign the programmer from a project
  def clear_project
    @project = nil
  end

  # Work on a project
  def write_code
    @project.recieve_work(@speed)
  end
end

class Project
  attr_reader :name, :man_days, :price
  attr_reader :man_days_done
  attr_accessor :state # possibilities: "waiting", "current", "done"

  def initialize(name, man_days, price)
    @name = name
    @man_days = man_days
    @man_days_done = 0
    @price = price
    @state = "waiting"
  end

  # A work that the programmer does on a project
  def recieve_work(man_days)
    @man_days_done += man_days
  end
end

class Company
  attr_reader :name, :capacity, :daily_expenses, :budget
  attr_reader :days, :programmers
  attr_reader :projects_waiting, :projects_current, :projects_done
  attr_reader :state # possibilities: "idle", "running" "finished", "bankrupt"

  def initialize(name, capacity, daily_expenses, budget)
    @name = name
    @capacity = capacity
    @daily_expenses = daily_expenses
    @budget = budget
    @state = "idle"
    @days = 0
    @projects_waiting = []
    @projects_current = []
    @projects_done = []
  end

  # Hire as many programmers as the company capacity allows
  def allocate_programmers(programmers_array)
    @programmers = []
    @capacity.times do |i|
      prog = programmers_array[i]
      @programmers << Programmer.new(prog["name"], prog["speed"],prog["daily_wage"])
    end
  end

  # Initialize all projects and store them in an array @projects_waiting
  def allocate_projects(projects_array)
    projects_array.each do |proj|
      @projects_waiting << Project.new(proj["name"], proj["man_days"], proj["price"])
    end
  end

  # Check what projects are already finished and move them to
  # an array @projects_done
  def check_projects
    @projects_current.each do |project|
      if (project.man_days_done >= project.man_days)
        project.state = 'done'
        @projects_done << project
        @projects_current.delete(project)
        @budget += project.price
      end
    end
  end

  # Unassign programmers who work on already finished projects.
  def check_programmers
    # IMPLEMENT THIS METHOD
  end

  # Assign new projects from @projects_waiting to programmmers who
  # are available. Move these projects to @projects_current
  def assign_new_projects
    # IMPLEMENT THIS METHOD
  end

  # Programmers work. Iterate all programmers and assign their daily work to
  # their assigned projects. At the same time, give programmers their wages
  # and process the daily expenses of the company.
  def programmers_work
    # IMPLEMENT THIS METHOD
  end

  # Check the state of the company. If the budget is < 0, set its state
  # to :bankrupt. If all projects are finished, set its state to :finished.
  def check_company_state
    # IMPLEMENT THIS METHOD
  end

  # Run the simulation. The cycle ends when the state of the company is
  # either "bankrupt" or "finished", or if the simulation runs for longer
  # than 1000 days
  def run
    @state = "running"
    while @state != "bankrupt" and @state != "finished" and @days <= 1000
      @days += 1
      check_projects
      check_programmers
      assign_new_projects
      programmers_work
      check_company_state
    end
    @state = "idle" if @state == "running"
  end

  def output_result
    puts
    puts "Company name #{name}"
    puts "Days running #{@days}"
    puts "Final budget #{@budget}"
    puts "Final state #{@state}"
    puts "Number of projects done #{@projects_done.size}"
  end
end

company_objects = []
companies.each do |c|
  # Create all objects of Company type and assign them to company_objects
  company_objects << Company.new(c["name"],c["capacity"],c["daily_expenses"],c["budget"])
end

# This cycle repeats for each company:
company_objects.each do |c|
  # Hire programmers
  c.allocate_programmers(programmers)
  # Initialize projects
  c.allocate_projects(projects)
  # Run simulation
  c.run
  # Display result
  c.output_result
end


Выглядеть должно так:

Company name Alpha
Days running 176
Final budget 888200
Final state finished
Number of projects done 10
Company name Beta
Days running 176
Final budget 850200
Final state finished
Number of projects done 10
Company name Gamma
Days running 111
Final budget 1045800
Final state finished
Number of projects done 10
Company name Delta
Days running 71
Final budget -13200
Final state bankrupt
Number of projects done 8
Company name Epsilon
Days running 130
Final budget -6000
Final state bankrupt
Number of projects done 9
Company name Theta
Days running 97
Final budget -12900
Final state bankrupt
Number of projects done 8
Company name Omega
Days running 152
Final budget 21878600
Final state finished
Number of projects done 10
    

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

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

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


 




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


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

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