@NoAlazar

Не работает сортировка?

Здравствуйте. Нужно при разных вариантах выбора сортировать выходные данные по разному(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;
}
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы