Member 13999630 Ответов: 3

У меня есть базовый алгоритм проектирования, но я не могу поместить его в решение


Существует заводская производственная линия вокруг одной конвейерной ленты.

Компоненты (типа А и в) приходят на начало ремня случайным образом

интервалы; рабочие должны взять один компонент каждого типа из ленты
как только они пройдут мимо, соедините их и получите готовый продукт.

Пояс разделен на пазы фиксированного размера; каждый слот может вместить только один
компонент или один готовый продукт. Есть целый ряд рабочих

станции по обе стороны от пояса, расположенные на расстоянии, соответствующем размеру пояса.
прорези на поясе, вот так (шрифт фиксированной ширины ASCII pic):
     v   v   v   v   v workers
   ---------------------
-> | A |   | B | A | P | -> conveyor belt
   ---------------------
     v   v   v   v   v workers


В каждую единицу времени пояс перемещается вперед на одно положение, и там
это время для работника на одной стороне каждого слота либо взять предмет

из гнезда или заменить предмет на ремне. Рабочий напротив
они не могут касаться одного и того же гнезда ремня, пока делают это.
(Таким образом, вы не можете позволить одному работнику выбрать что-то из слота, пока
их двойник кладет что-то на то же место).


Как только работник собрал один из обоих типов компонентов, он может
начните сборку готового изделия. Это занимает определенное количество времени,
таким образом, они будут готовы только к тому, чтобы поместить собранный продукт обратно на стол.

ремень на четвертом последующем пазу. В то время как они собирают
продукт, они не могут коснуться конвейерной ленты. Рабочие могут только держать
два предмета (компонент или продукт) одновременно: по одному в каждой руке.

Создайте имитацию этого, с тремя парами рабочих. На каждом из них

интервал времени, слот в начале конвейерной ленты должен иметь
равный (1/3) шанс ничего не содержать, компонент А или А
компонент В.

Запустите симуляцию на 100 шагов и вычислите, сколько из них закончено

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


Реализация на C или C++?

Что я уже пробовал:

Есть 4-5 классов:

class Worker
{

public:
int parts_required;
int time_Remaining;
int slave_worker;
int finished_slot;

void execute();


};


void execute()
{
	if(part a && part B)
	{
		if(time < 0)
		{
			print("Worker A is ready");
			
			if(empty_place)
			{
				cache = empty;
				clk = time_required;
				slot = item.worker a
			
			}
			else
			{
				run again
			}
		


}

class Source
{

public:

int item_a;
int item_b;


};

class Stage
{};


class Conveyor
{};

3 Ответов

Рейтинг:
20

Stefan_Lang

Ваш код выглядит как случайный набор мыслей, а не структурированная программа.

Сначала вы должны посмотреть на свои объекты. Судя по текстовому описанию, у вас есть производственная линия, которая состоит из одной конвейерной ленты и нескольких рабочих. Это три класса, прямо из текста:

class Worker {
   // add details later
};
class Conveyor {
   // add details later
};
class ProductionLine {
   Conveyor the_conveyor;
   std::vector<Worker> workers;
   // add more details later
};

Во-вторых, проверьте деятельность: конвейер может перемещать свою ленту, рабочие могут доставать предметы, класть предметы или собирать предметы. Вы должны добавить функции для этого:
class Conveyor {
public:
   void move();
};
class Worker {
public:
   void getPart(Conveyor& conveyor);
   void putItem(Conveyor& conveyor);
   void assembleItem();
};

Далее, есть условия, которые необходимо учитывать: рабочий не может получить деталь во время сборки, и не может собрать, если у него нет необходимых деталей, и не может поставить деталь, пока он ее не собрал. Чтобы проверить эти условия, вы должны добавить функции для запроса текущего состояния работника:
class Worker {
   ...
   bool isAssembling() const;
   bool hasAllParts() const;
   bool hasAssembly() const;
};

Это должно охватывать большую часть интерфейса, необходимого для ваших классов. Теперь вы можете перейти к деталям классов: какие переменные-члены вам нужны для управления их внутренним состоянием и обработки функций, которые вы указали?

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


Member 13999630

Привет Стефан,
Спасибо за вашу почту.

Основываясь на вашем исходном коде,я создал несколько строк кода, основанных на следующих предположениях:

а) детали поступают на конвейерную ленту в фиксированной последовательности а,в,а,в,нуль
б) учитывая сложность до сих пор я сделал это так, как если бы на работе была только одна сторона конвейерной ленты(нужно обобщить ее на 6 рабочих(по 3 с каждой стороны).

Я также работаю над его обобщением.Пожалуйста, помогите мне улучшить это.Я не понимаю,как обобщить это для 6 рабочих, по 3 с каждой стороны конвейерной ленты

Еще раз спасибо за помощь и сотрудничество:

Рейтинг:
2

OriginalGriff

Мы более чем готовы помочь тем, кто застрял, но это не значит, что мы здесь, чтобы сделать все это для вас! Мы не можем сделать всю работу, вам либо платят за это, либо это часть ваших оценок, и было бы совсем несправедливо, если бы мы сделали все это за вас.

Поэтому нам нужно, чтобы вы сделали работу, и мы поможем вам, когда вы застряли. Это не значит, что мы дадим вам пошаговое решение, которое вы можете сдать!
Начните с объяснения, где вы находитесь в данный момент и каков следующий шаг в этом процессе. Затем расскажите нам, что вы пытались сделать, чтобы этот следующий шаг сработал, и что произошло, когда вы это сделали.
Поэтому прочитайте ваши инструкции и определите, что нужно хранить в каждом классе. Затем подумайте о том, какую обработку должен выполнять каждый класс для каждого объекта. При необходимости возьмите блокнот и сделайте это вручную, используя отдельные страницы для каждого экземпляра класса.

Разработка того, как хранить и обрабатывать данные, является большой частью этой задачи - и это зависит от вас, чтобы изучить этот процесс, потому что это фундаментально для проектирования рабочей системы - и если мы сделаем это для вас, то вы ничего не узнаете, и все равно не сможете сделать это в следующий раз. Поскольку домашнее задание почти наверняка станет более сложным со временем, вам нужно научиться этому на относительно простых вещах, потому что если вы не будете иметь его "вниз ПЭТ" ко времени экзамена, вы провалите курс.


Рейтинг:
1

Member 13999630

#include <string>
#include <iostream>
#include <vector> 
#include <list>

using namespace std;

enum {
	STATE_WORKING = 0,
	STATE_FINISHED = 1,
	STATE_SUBMITTED = 2
} WORKER_STATE;

typedef enum {
	CACHE_STATE_EMPTY = 0,
	CACHE_STATE_ONLY_PART_A = 1,
	CACHE_STATE_ONLY_PART_B = 2,
	CACHE_STATE_BOTH_PARTA_PARTB = 3
}CACHE_STATE;

class Conveyor {
public:
	string move();
	void init();
private:
	vector<string> parts;
	
};

void Conveyor::init()
{
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_A");
	parts.push_back("part_B");
	parts.push_back("part_NULL");


		
}

string Conveyor::move()
{

	/*
	list <string> ::iterator it;
	for (auto it = parts.begin(); it != parts.end(); ++it)
		cout << '\t' << *it;
	cout << '\n';
	*/
	
	string partno;
	partno = parts.front();

	parts.erase(parts.begin());
	
	return partno;

}

class Worker {
public:
	void getPart(Conveyor& conveyor);
	void putItem(Conveyor& conveyor);
	void assembleItem(string part_a, string part_b);
	bool isAssembling() const;
	bool hasAllParts() const;
	bool hasAssembly() const;
private:
	int parts_reqd;
	int time_reqd;
	string slave;
};

void Worker::getPart(Conveyor& conveyor)
{
	bool cache_empty = true;
	CACHE_STATE cachestate;
	string incoming_part;
	
	incoming_part = conveyor.move();
	if (strcmp(incoming_part.c_str(), "part_A") == 0)
	{
		cachestate = CACHE_STATE::CACHE_STATE_ONLY_PART_A; 
		cache_empty = false;
	}

	if (strcmp(incoming_part.c_str(), "part_B") == 0)
	{
		cachestate = CACHE_STATE::CACHE_STATE_ONLY_PART_B;
		cache_empty = false;
	}
	if (strcmp(incoming_part.c_str(), "part_NULL") == 0)
	{
		cachestate = CACHE_STATE::CACHE_STATE_EMPTY;
		cache_empty = true;
	}
	
}

void Worker::putItem(Conveyor& conveyor)
{
	unsigned int finished_part = 0;
	/*string partcoming;
	
	partcoming = conveyor.move();*/
	
	finished_part++;
	cout << "No of finished part = ", finished_part;


}

void Worker::assembleItem(string part_a,string part_b)
{
	string fin_part;
	unsigned int time_taken = 0;
	fin_part = part_a + part_b;
	time_taken = 5;
}

class ProductionLine {
public:
	Conveyor the_conveyor;
	std::vector<Worker> workers;
	void runprodline();
};

void ProductionLine::runprodline()
{
	string part[100];
	string finished_part;
	Worker workerone;

	CACHE_STATE state;
	unsigned int assembled_part = 0;
	the_conveyor.init();
	for (int i = 0; i < 100; i++)
	{
		part[i] = the_conveyor.move();
		if (strcmp(part[i].c_str(), "part_A") == 0)
			state = CACHE_STATE_ONLY_PART_A;
		if ((strcmp(part[i].c_str(), "part_B") == 0) && (state == CACHE_STATE_ONLY_PART_A))
			state = CACHE_STATE_BOTH_PARTA_PARTB;

		if (state == CACHE_STATE_BOTH_PARTA_PARTB)
		{
			assembled_part = assembled_part + 1;
		}
			
		if ((strcmp(part[i].c_str(), "part_NULL") == 0) && (assembled_part>0))
		{
			workerone.putItem(the_conveyor);
			assembled_part = 0;
		}

	}
}

int main()
{
	ProductionLine obj_prodline;
	obj_prodline.runprodline();
}


Stefan_Lang

Привет

Я только сейчас заметил ваш ответ и код, который вы разместили здесь.

На первый взгляд, это выглядит как хорошая отправная точка. Есть несколько вещей, которые я бы изменил, прежде чем идти дальше:

1. я бы закодировал различные части как целочисленные значения или перечисления, а не строки.
2. Вы должны реализовать функцию, которая генерирует случайную часть (A, B или ничего), а не фиксированное количество предопределенных элементов. Это делает вашу программу более гибкой, если вы хотите запустить ее в течение длительного времени.
3. конвейер должен поддерживать список позиций на своей ленте, где каждая позиция может содержать часть а, часть в, собранный элемент или ничего.
4. работник должен быть назначен на позицию на поясе. Каждый работник получает свою должность и сохраняет ее при настройке производственной линии. Каждый раз, когда ваш рабочий взаимодействует с конвейером, он должен передавать свое положение в качестве параметра функции, чтобы конвейер знал, к какому положению ленты он должен относиться.

Я немного тороплюсь прямо сейчас, но, возможно, этого достаточно, чтобы расширить вашу программу, чтобы использовать несколько рабочих.

Member 13999630

Привет Стивен

Спасибо за вашу помощь.Я завершу часть 2.Если бы вы могли помочь мне в завершении части 3,4, как вы описали, а также просмотреть код, который я разработал, это было бы здорово.Я должен представить это до понедельника.

Большое спасибо за вашу помощь и руководство мной.

Спасибо

с уважением
Маянк

Member 13999630

Привет Стефан,

Спасибо за Вашу постоянную поддержку.
Пожалуйста, помогите мне улучшить мое решение:


#include <string>
#include <iostream>
#включить <вектор>
#включать <список&ГТ;#включать<временные метки ctime&ГТ;
#включить <math.h>

использование пространства имен std;

#define NULL 0

перечисление {
STATE_WORKING = 0,
STATE_FINISHED = 1,
STATE_SUBMITTED = 2
} РАБОЧЕЕ ГОСУДАРСТВО;

перечисление CACHE_STATE {
CACHE_STATE_EMPTY = 0,
CACHE_STATE_ONLY_PART_A = 1,
CACHE_STATE_ONLY_PART_B = 2,
CACHE_STATE_BOTH_PARTA_PARTB = 3
};

классный конвейер {
общественный:
перемещение струны();
частный:
векторные<струнные> детали;


};

std::векторная<строка> рандомизация()
{
srand(time(0));
выбор строк[] = { "Part_A", "Part_B", "Part_A" };

std::вектор<строка> случайный;
for (int i = 0; i < 3; i++)
{
random.push_back(choices[rand() % 3]);
}
возврат случайный;
}

струнный конвейер::перемещение()
{

srand(time(0));

рандомизировать();
std::vector<string> randomResult = randomize();

return randomResult[0];


/*
for (iter = randomResult.begin(), iterEnd = randomResult.end();
iter != iterEnd; ++iter)
соиь <&ЛТ; *ИТЭР на << епси;

возвращение *ИТЭР;


строковое обозначение;
обозначение в = части.фасад();

parts.erase(parts.begin());

возвращение партнера;
*/

}

рабочий класс {
общественный:
пустота гетпарт(Транспортер&амп; конвейер);
пустота putItem(Транспортер&амп; конвейер);
пустота летающих(part_a строку, строку part_b);
боол isAssembling;
боол hasAllParts;
боол hasAssembly;


инт cachestate;
частный:
инт parts_reqd;
инт time_reqd;
строки раб;
инт worker_position;

};

пустота работника::гетпарт(Транспортер&амп; конвейер)
{
боол cache_empty = истина;
CACHE_STATE cachestate;
строка incoming_part;

incoming_part = конвейера.двигаться();
if (strcmp(incoming_part.c_str(), "part_A") == 0)
{
cachestate = CACHE_STATE::CACHE_STATE_ONLY_PART_A;
cache_empty = ложь;
}

if (strcmp(incoming_part.c_str(), "part_B") == 0)
{
cachestate = CACHE_STATE::CACHE_STATE_ONLY_PART_B;
cache_empty = ложь;
}
if (strcmp(incoming_part.c_str(), "part_NULL") == 0)
{
cachestate = CACHE_STATE::CACHE_STATE_EMPTY;
cache_empty = истина;
}

}

void Worker::putItem(конвейер и конвейер)
{
unsigned int finished_part = 0;

готовая деталь++;
cout << "No of finished part = ", finished_part;


}

пустота работника::летающих(part_a строку,строку part_b)
{
строка fin_part;
беззнаковый инт time_taken = 0;
fin_part = part_a + part_b;
time_taken = 5;
}

линия производства класса {
общественный:
Конвейер the_conveyor;
std::vector<worker> workers;
пустота runprodline(без знака пары, инт,инт-нет,строку АР[2]);
};

void ProductionLine::runprodline(unsigned int worker_pairs,int totalworkers,string partposns[2])
{
часть строки[100];

Workerone работник ;

Конвейер objConv;
unsigned int i = 0;


unsigned int assembled_part = 0;
unsigned int elapsed_time_part_complete = 0;

unsigned int finished_part = 0;
Рабочий workeronline[2];
Рабочий worker_two;

cout << "Part no 0 =" << partposns[0] << endl;
соиь <&ЛТ; "Часть № 1 =" &ЛТ;&ЛТ; partposns[1] &ЛТ;< епси;
соиь <&ЛТ; "Часть № 1 =" &ЛТ;&ЛТ; partposns[2] &ЛТ;< епси;

workeronline[1].hasAllParts = false;
workeronline[1].isAssembling = false;

для (i = 0; i < 3; i++)
{

for (int workerposition = 0; workerposition < 2; workerposition++)
{
if (strcmp(partposns[i].c_str(), "part_A") == 0)
{
workeronline[workerposition].cachestate = CACHE_STATE_ONLY_PART_A;

partposns[i] = "";
}
if (strcmp(partposns[i].c_str(), "part_B") == 0)
{
workeronline[workerposition].cachestate = CACHE_STATE_ONLY_PART_B;

partposns[i] = "";
}
если( (чего strcmp(partposns[я].c_str(), "part_A") == 0) &&усилителя; (workeronline[workerposition].cachestate == CACHE_STATE_ONLY_PART_B))
{
workeronline[workerposition].cachestate = CACHE_STATE_BOTH

Stefan_Lang

Привет

По какой-то причине ваши последние два комментария не появились у меня до сих пор.

Я видел другую нить, которую вы открыли. Здесь я должен отметить, что открывать несколько постов по одному и тому же вопросу противоречит правилам форума. Я полагаю, что на этот раз все не так уж плохо, поскольку теперь у вас есть гораздо больше кода для просмотра, и это меняет природу вопроса.

Однако с таким количеством кода вы начинаете напрягать пределы этого форума: вы должны задавать краткие вопросы, на которые можно ответить максимум несколькими предложениями. Однако вы просите о полномасштабном анализе и обучении. Это отнимает много времени, и никому за это не платят.

Вы не упомянули, откуда вы получили эту задачу, но где бы это ни было, разве нет людей, которых вы могли бы спросить вместо этого? Я предлагаю это потому, что эти люди на самом деле могут быть заинтересованы в том, чтобы помочь вам, или даже им платят за это.

Если вы получили эту задачу с веб-сайта, то позвольте мне сказать вам, что вместо этого вы должны начать с более простых задач. Для такого рода задач вы должны иметь хорошее представление о том, как анализировать спецификации, как идентифицировать объекты, типы и данные, которые важны для вашего проекта, и как разделить отдельные задачи по функциям и классам. Честно говоря, вы не проявляете ни одного из этих качеств. Вам явно нужно больше опыта в написании простых функций и программ.