Здравствуйте. Нужно при разных вариантах выбора сортировать выходные данные по разному(calculateOptimalSolution здесь нужно сортировать по критерию)(calculateGreedyStrategy здесь сортировать по времени), но ничего не получается, подскажите пожалуйста, и если где еще есть ошибка, буду благодарен если укажете. Сама задачка которую решаю: В начале смены мастер обнаружил n неисправных станков. Предварительный их осмотр позволил оценить время ремонта каждого станка ti час, i=1..n. Известна производительность каждого станка Ci дет/час, i=1..n. Определить порядок ремонта станков так, чтобы потери от их простоя были минимальными. Станки ремонтируются одной бригадой последовательно.
(Создание диалоговой системы решения и анализа экономической задачи построения оптимального плана ремонта станков)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <random>
struct Stank {
int repairTime;
int productivity;
int totalRepairTime;
double criterion = (totalRepairTime - repairTime) * productivity;
};
bool sortByRepairTime(const Stank& stank1, const Stank& stank2) {
return stank1.repairTime < stank2.repairTime;
}
bool sortByCriterion(const Stank& stank1, const Stank& stank2) {
return stank1.criterion > stank2.criterion;
}
// Функция для получения рандомного числа в заданном диапазоне
int getRandomNumber(int min, int max) {
static std::random_device rd;
static std::mt19937 mt(rd());
std::uniform_int_distribution<int> dist(min, max);
return dist(mt);
}
void calculateOptimalSolution(const std::vector<Stank>& stanks) {
int totalProductivity = 0;
int totalRepairTime = 0;
int totalDowntimeLosses = 0;
for (int i = 0; i < stanks.size(); i++) {
totalProductivity += stanks[i].productivity;
totalRepairTime += stanks[i].repairTime;
totalDowntimeLosses += stanks[i].repairTime * totalProductivity;
}
std::cout << "Исходные данные станков:" << std::endl;
for (int i = 0; i < stanks.size(); i++) {
std::cout << "Станок " << i + 1 << ": Время ремонта: " << stanks[i].repairTime << ", Производительность: " << stanks[i].productivity << std::endl;
}
std::cout << "Общее время ремонта: " << totalRepairTime << std::endl;
std::cout << "Общая производительность: " << totalProductivity << std::endl;
std::cout << "Станки в порядке убывания критерия оптимальности:" << std::endl;
for (int i = 0; i < stanks.size(); i++) {
std::cout << "Станок " << i + 1 << ": Время ремонта: " << stanks[i].repairTime << ", Производительность: " << stanks[i].productivity << ", Критерий оптимальности: " << stanks[i].criterion << std::endl;
}
}
void calculateGreedyStrategy(const std::vector<Stank>& stanks) {
int totalProductivity = 0;
int totalRepairTime = 0;
int totalDowntimeLosses = 0;
for (int i = 0; i < stanks.size(); i++) {
totalProductivity += stanks[i].productivity;
totalRepairTime += stanks[i].repairTime;
totalDowntimeLosses += stanks[i].repairTime * totalProductivity;
}
std::cout << "Исходные данные станков:" << std::endl;
for (int i = 0; i < stanks.size(); i++) {
std::cout << "Станок " << i + 1 << ": Время ремонта: " << stanks[i].repairTime << ", Производительность: " << stanks[i].productivity << std::endl;
}
std::cout << "Общее время ремонта: " << totalRepairTime << std::endl;
std::cout << "Общая производительность: " << totalProductivity << std::endl;
std::cout << "Минимальные потери от простоя станков: " << totalDowntimeLosses << std::endl;
std::cout << "Станки в порядке убывания времени ремонта:" << std::endl;
for (int i = 0; i < stanks.size(); i++) {
std::cout << "Станок " << i + 1 << ": Время ремонта: " << stanks[i].repairTime << ", Производительность: " << stanks[i].productivity << std::endl;
}
}
// Функция для ручного ввода данных о станках
void manualInput(std::vector<Stank>& stanks) {
int n;
std::cout << "Введите количество станков: ";
std::cin >> n;
for (int i = 0; i < n; i++) {
Stank stank;
std::cout << "Введите время ремонта станка " << i + 1 << ": ";
std::cin >> stank.repairTime;
std::cout << "Введите производительность станка " << i + 1 << ": ";
std::cin >> stank.productivity;
stanks.push_back(stank);
}
}
// Функция для рандомного ввода данных о станках
void randomInput(std::vector<Stank>& stanks) {
int n;
std::cout << "Введите количество станков: ";
std::cin >> n;
for (int i = 0; i < n; i++) {
Stank stank;
stank.repairTime = getRandomNumber(1, 100);
stank.productivity = getRandomNumber(1, 1000);
stanks.push_back(stank);
}
}
int main() {
setlocale(0, "rus");
std::vector<Stank> stanks;
int choice;
bool validChoice = false;
while (!validChoice) {
std::cout << "Выберите способ ввода данных о станках:" << std::endl;
std::cout << "1. Ручной ввод" << std::endl;
std::cout << "2. Рандомный ввод" << std::endl;
std::cin >> choice;
if (choice == 1) {
manualInput(stanks);
validChoice = true;
}
else if (choice == 2) {
randomInput(stanks);
validChoice = true;
}
else {
std::cout << "Неверный выбор. Попробуйте снова." << std::endl;
}
}
int methodChoice;
std::cout << "Выберите метод расчета: " << std::endl;
std::cout << "1. Метод оптимальных решений" << std::endl;
std::cout << "2. Метод жадной стратегии" << std::endl;
std::cin >> methodChoice;
if (methodChoice == 1) {
// Вызов метода оптимальных решений
calculateOptimalSolution(stanks);
}
else if (methodChoice == 2) {
// Вызов жадной стратегии
calculateGreedyStrategy(stanks);
}
return 0;
}