Member 13999630 Ответов: 4

Как улучшить C++ реализацию конвейерного ленточного решения в C++


постановка задачи:

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

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

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

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

станции по обе стороны от пояса, расположенные на расстоянии, соответствующем размеру пояса.
прорези на поясе, вот так (шрифт фиксированной ширины ASCII pic):
в В В В В работники
---------------------
- и GT; | А | | Б | А | П | -&ГТ; ленточный конвейер

---------------------
^ ^ ^ ^ ^ рабочие

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

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


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

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

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

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

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

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


Я реализовал это решение следующим образом:

Есть ли другой лучший способ сделать это,если мы можем использовать любой шаблон дизайна или сделать его более универсальным?

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

#include <string>
#include <iostream>
#include <vector> 
#include <list>
#include<ctime>
#include <math.h>

using namespace std;

#define NULL 0

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

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

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

std::vector<string> randomize()
{
	srand(time(0));
	string choices[] = { "Part_A", "Part_B", "Part_A" };

	std::vector<string> random;
	for (int i = 0; i < 3; i++)
	{
		random.push_back(choices[rand() % 3]);
	}
	return random;
}

string Conveyor::move()
{
	srand(time(0));

	randomize();
	std::vector<string> randomResult = randomize();

	return randomResult[0];

	/*
	for (iter = randomResult.begin(), iterEnd = randomResult.end();
		iter != iterEnd; ++iter)
		cout << *iter << endl;

	return *iter;


	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;
	bool hasAllParts;
	bool hasAssembly;


	int cachestate;
private:
	int parts_reqd;
	int time_reqd;
	string slave;
	int worker_position;
};

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;
	
	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(unsigned int pairs,int no,string ar[2]);
};

void ProductionLine::runprodline(unsigned int worker_pairs,int totalworkers,string partposns[2])
{
	string part[100];

	Worker workerone;

	Conveyor objConv;
	unsigned int  i = 0;
	   

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

	unsigned int finished_part = 0;
	Worker workeronline[2];
	Worker worker_two;

	cout << "Part no 0 = " << partposns[0] << endl;
	cout << "Part no 1 = " << partposns[1] << endl;
	cout << "Part no 1 = " << partposns[2] << endl;

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

	for (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] = "";
			}
			if( (strcmp(partposns[i].c_str(), "part_A") == 0) && (workeronline[workerposition].cachestate == CACHE_STATE_ONLY_PART_B))
			{
				workeronline[workerposition].cachestate = CACHE_STATE_BOTH_PARTA_PARTB;

				workeronline[workerposition].hasAllParts = true;

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

				workeronline[workerposition].hasAllParts = true;

				partposns[i] = "";
			}
			if (workeronline[workerposition].hasAllParts == true)
			{
				workeronline[workerposition].isAssembling = true;

				elapsed_time_part_complete++;
			}
			if ((workeronline[workerposition].isAssembling == true) && (elapsed_time_part_complete % 4) == 0)
			{
				workeronline[workerposition].hasAssembly = true;

				workeronline[workerposition].isAssembling = false;

			}
			if ((strcmp(partposns[i].c_str(), "part_NULL") == 0) && (workeronline[workerposition].hasAssembly == true))
			{
				finished_part = finished_part + 1;

				workeronline[workerposition].hasAssembly = false;
			}
		}
	}		
	
	cout << "No of finished parts = " << finished_part << endl;
}

int main()
{
	ProductionLine obj_prodline;
	unsigned int pair = 3;
	unsigned int workerspositions;
	string partone;
	Conveyor conveyor;

	workerspositions = pair * 2;
	string conveyorpartposition[3];
	conveyorpartposition[0] = "";
	conveyorpartposition[1] = "";
	conveyorpartposition[2] = "";

	string part[2];

	for (int i = 0; i < 100; i++)
	{
		partone = conveyor.move();
		conveyorpartposition[0] = partone;

		obj_prodline.runprodline(pair, workerspositions, conveyorpartposition);

		conveyorpartposition[2] = conveyorpartposition[1];
		conveyorpartposition[1] = conveyorpartposition[0];		
	}
}

4 Ответов

Рейтинг:
2

Greg Utas

Несколько замечаний:


  • То choices такие дубликаты "Part_A" и опускает "Part_Null".
  • То strcmps потерпит неудачу, потому что, например, они сравнивают "Part_A" к "part_A" Этот тип ошибки менее вероятен, если вы используете константу для определения повторяющегося строкового литерала.
  • Собственно говоря, strcmp это C, а не C++. Я бы просто написал
    if(incoming_part == "Part_A")

  • Как правило, это не одобряется, чтобы комментировать код с помощью /* ... */ потому что, в зависимости от того, какой редактор кто-то использует, может быть трудно сказать, что код на самом деле не выполняется.
  • Стремитесь сделать все данные класса членами private.
  • Шаблоны проектирования вторичны по отношению к фундаментальным принципам инкапсуляции, полиморфизма и наследования. Не сосредотачивайтесь на шаблонах дизайна, пока у вас нет этих вещей пригвожденный.


Рейтинг:
0

Rick York

Я бы начал с переписывания ProductionLine::runprodline(). Вся логика доступа к членам workeronline[i] должна быть методом класса Worker. В getPart() существует почти дублирование кода, поэтому должен быть общий метод вызова, который выполняет эту логику. Кроме того, почему значение 3 в его цикле for? Вы должны избегать размещения буквенных чисел в таком коде. Он должен быть параметром метода и определяться как константа где-то еще, например в основной функции.


Рейтинг:
0

Stefan_Lang

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

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

Точка в деле:

void Worker::putItem(Conveyor& conveyor)
{
	unsigned int finished_part = 0;
	
	finished_part++;
	cout << "No of finished part = ", finished_part;
}

В моем решении здесь[^ Я объяснил, для чего предназначена эта функция: поместите собранный продукт на ленту конвейера. Вместо этого вы даже не разговариваете с конвейером! Все, что вы делаете, это объявляете локальную переменную, инициализируете ее до 0 (что вообще означает 0 в этом контексте?), увеличиваете ее до 1 (что это значит?) и отбрасываете. Обратите внимание, что строка, которую вы распечатываете, даже не печатает это число! Вы должны проверить синтаксис и значение оператора запятой в C++! Состояние конвейера и остальной части программы остается неизменным.

Эквивалентным фрагментом кода будет:
void Worker::putItem(Conveyor& )
{
    cout << "No of finished part = ";
}

Тем не менее, вы даже не вызываете функцию...

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

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


Рейтинг:
0

Member 13999630

#include <string>
#include <iostream>
#include <vector> 
#include <list>
#include<ctime>
#include <math.h>

using namespace std;

#define NULL 0



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

class Conveyor {
public:
	string move();
	void init();
	string conveyor_part_position[2];
private:
	vector<string> parts;
	//int conveyor_part_position[2];


};

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");
	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()
{


	string partno;

	if (!parts.empty())
		partno = parts.front();
	else
		partno = "part_A";

	if (!parts.empty())
		parts.erase(parts.begin());

	return partno;

}



class Worker {
public:

	bool isAssembling;
	bool hasAllParts;
	bool hasAssembly;


	int cachestate;
private:
	int parts_reqd;
	int time_reqd;
	string slave;
	int worker_position;

};




class ProductionLine {
public:
	Conveyor the_conveyor;
	std::vector<Worker> workers;
	void runprodline(unsigned int pairs, int no, string ar[2], Worker workeroneline[2]);

};

void ProductionLine::runprodline(unsigned int worker_pairs, int totalworkers, string partposns[2], Worker workeronline[2])
{
	string part[100];

	Worker workerone;

	Conveyor objConv;
	unsigned int  i = 0;


	unsigned int assembled_part = 0;
	static unsigned int elapsed_time_part_complete_worker_zero = 0;
	static unsigned int elapsed_time_part_complete_worker_one = 0;

	static unsigned int finished_part = 0;

	Worker worker_two;

	//	cout << "Part no 0 = " << partposns[0] << endl;
	//	cout << "Part no 1 = " << partposns[1] << endl;
	//	cout << "Part no 1 = " << partposns[2] << endl;



	for (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_EMPTY))
			{
				workeronline[workerposition].cachestate = CACHE_STATE_ONLY_PART_A;

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

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

				workeronline[workerposition].hasAllParts = true;

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

				workeronline[workerposition].hasAllParts = true;

				partposns[i] = "";
			}
			if (workeronline[workerposition].hasAllParts == true)
			{
				workeronline[workerposition].isAssembling = true;

				if (workerposition == 0)
					elapsed_time_part_complete_worker_zero++;
				else if (workerposition == 1)
					elapsed_time_part_complete_worker_one++;
			}
			if ((workeronline[workerposition].isAssembling == true) && (elapsed_time_part_complete_worker_zero > 1) && ((elapsed_time_part_complete_worker_zero % 4) == 0))
			{
				workeronline[workerposition].hasAssembly = true;

				workeronline[workerposition].isAssembling = false;

			}
			if ((workeronline[workerposition].isAssembling == true) && (elapsed_time_part_complete_worker_one > 1) && ((elapsed_time_part_complete_worker_one % 4) == 0))
			{
				workeronline[workerposition].hasAssembly = true;

				workeronline[workerposition].isAssembling = false;

			}
			if ((strcmp(partposns[i].c_str(), "part_NULL") == 0) && (workeronline[workerposition].hasAssembly == true))
			{
				finished_part = finished_part + 1;


				workeronline[workerposition].hasAssembly == true;
				workeronline[workerposition].isAssembling == false;
				workeronline[workerposition].hasAllParts = false;
				workeronline[workerposition].cachestate == CACHE_STATE_EMPTY;

				partposns[i] = "";

			}
			if (partposns[i] == "")
				break;


		}

		if (partposns[i] == "")
			break;

	}


	cout << "No of finished parts = " << finished_part << endl;

}

int main()
{
	ProductionLine obj_prodline;
	unsigned int pair = 3;
	unsigned int workerspositions;
	string partone;
	Conveyor conveyor;

	workerspositions = pair * 2;
	string conveyorpartposition[3];
	conveyorpartposition[0] = "";
	conveyorpartposition[1] = "";
	conveyorpartposition[2] = "";

	string coninitialposition[3];

	conveyor.init();

	string part[2];
	static Worker workeronline[2];
	workeronline[1].hasAllParts = false;
	workeronline[1].isAssembling = false;
	workeronline[0].hasAllParts = false;
	workeronline[0].isAssembling = false;
	workeronline[0].cachestate = CACHE_STATE_EMPTY;
	workeronline[1].cachestate = CACHE_STATE_EMPTY;

	conveyor.conveyor_part_position[0] = conveyorpartposition[0];

	for (int i = 0; i < 100; i++)
	{

		partone = conveyor.move();

		cout << "the part get is" << partone << endl;
		conveyorpartposition[0] = partone;


		obj_prodline.runprodline(pair, workerspositions, conveyorpartposition, workeronline);

		conveyorpartposition[2] = conveyorpartposition[1];
		conveyorpartposition[1] = conveyorpartposition[0];



	}


}


Stefan_Lang

Привет

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

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