Название: Задача Джонсона для 2-х станков Отправлено: alexu007 от Май 08, 2022, 10:19 Задача Джонсона для 2-х станков. Максимальное количество деталей - 10. Максимальное время обработки - 1000 минут. Ограничения условные и легко могут быть расширены коррекцией кода. Кнопка "Make" выполняет пошаговое выполнение программы. Кнопка "Run" - полное выполнение. При запуске программы таблица заполнена тестовыми значениями.
Код: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private: Ui::Widget *ui; int dt[10][3]; int data_t1[10][3]; int data_t2[10][3]; // позиция в таблице int r_min; int r_max; // количество введённых данных int cx_max; // количество ходов int cx_move; // считает максимальное время простоя void make_rating(); // void print_table(); public slots: void press_pbtn_01(); void press_pbtn_02(); void press_pbtn_03(); void press_pbtn_04(); }; #endif // WIDGET_H Код: #include "widget.h" #include "ui_widget.h" // https://math.semestr.ru/dinam/jonson.php Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); ui->tableWidget_1->setSelectionMode(QAbstractItemView::NoSelection); ui->tableWidget_2->setSelectionMode(QAbstractItemView::NoSelection); int data[6][2] = {{6,3},{8,5},{4,5},{4,2},{5,8},{8,4}}; for(int i = 0; i < 10; i++) for(int j = 0; j < 3; j++) { if(!j) data_t1[i][j] = i+1; else data_t1[i][j] = -1; if(i < 6 && j > 0) data_t1[i][j] = data[i][j-1]; data_t2[i][j] = -1; } for(int row = 0; row < 10; row++) for(int col = 0; col < 3; col++) { QTableWidgetItem *item1 = new QTableWidgetItem; item1->setTextAlignment(Qt::AlignCenter); if(!col) item1->setBackgroundColor(Qt::yellow); ui->tableWidget_1->setItem(row, col, item1); QTableWidgetItem *item2 = new QTableWidgetItem; item2->setTextAlignment(Qt::AlignCenter); if(!col) item2->setBackgroundColor(Qt::yellow); ui->tableWidget_2->setItem(row, col, item2); } print_table(); QObject::connect(ui->pbtn_01,SIGNAL(clicked()),this,SLOT(press_pbtn_01())); QObject::connect(ui->pbtn_02,SIGNAL(clicked()),this,SLOT(press_pbtn_02())); QObject::connect(ui->pbtn_03,SIGNAL(clicked()),this,SLOT(press_pbtn_03())); QObject::connect(ui->pbtn_04,SIGNAL(clicked()),this,SLOT(press_pbtn_04())); } Widget::~Widget() { delete ui; } // load void Widget::press_pbtn_01() { int x; static QString str; r_min = 0; r_max = 0; for(int row = 0; row < 10; row++) for(int col = 0; col < 3; col++) { if(col > 0) { str = ui->tableWidget_1->item(row, col)->text(); if(str == "") x = -1; else { r_max++; x = str.toInt(); } data_t1[row][col] = x; } dt[row][col] = data_t1[row][col]; data_t2[row][col] = -1; } print_table(); r_max /= 2; cx_max = r_max; cx_move = r_max--; ui->label_02->setNum(0); ui->label_03->setNum(0); if(cx_move) { ui->pbtn_02->setEnabled(true); ui->pbtn_03->setEnabled(true); } } // make void Widget::press_pbtn_02() { int x; int r = 0; int b = 0; int x_min = 1001; if(!cx_move) return; ui->pbtn_03->setEnabled(false); cx_move--; for(int row = 0; row < 10; row++) for(int col = 1; col < 3; col++) { x = dt[row][col]; if(x == -1) continue; if(x < x_min) { b = col; r = row; x_min = x; } } if(b == 1) { data_t2[r_min][0] = r+1; data_t2[r_min][1] = dt[r][1]; data_t2[r_min][2] = dt[r][2]; r_min++; } if(b == 2) { data_t2[r_max][0] = r+1; data_t2[r_max][1] = dt[r][1]; data_t2[r_max][2] = dt[r][2]; r_max--; } print_table(); dt[r][1] = -1; dt[r][2] = -1; if(!cx_move) { make_rating(); ui->pbtn_02->setEnabled(false); } } // run void Widget::press_pbtn_03() { ui->pbtn_02->setEnabled(false); ui->pbtn_03->setEnabled(false); for(int i = 0; i < cx_max; i++) { press_pbtn_02(); } } // clear void Widget::press_pbtn_04() { r_min = 0; r_max = 0; cx_move = 0; for(int row = 0; row < 10; row++) for(int col = 0; col < 3; col++) { if(col > 0) data_t1[row][col] = -1; data_t2[row][col] = -1; } print_table(); ui->label_02->clear(); ui->label_03->clear(); ui->pbtn_02->setEnabled(false); ui->pbtn_03->setEnabled(false); } void Widget::make_rating() { int k; int res_t1 = -1; int res_t2 = -1; int sum; int sum2 = 0; sum = data_t1[0][1]; if(sum > res_t1) res_t1 = sum; for(int i = 1; i < cx_max; i++) { sum += data_t1[i][1]; sum2 += data_t1[i-1][2]; k = sum - sum2; if(k > res_t1) res_t1 = k; } sum2 = 0; sum = data_t2[0][1]; if(sum > res_t2) res_t2 = sum; for(int i = 1; i < cx_max; i++) { sum += data_t2[i][1]; sum2 += data_t2[i-1][2]; k = sum - sum2; if(k > res_t2) res_t2 = k; } ui->label_02->setNum(res_t1); ui->label_03->setNum(res_t2); } void Widget::print_table() { int x; QString str; for(int row = 0; row < 10; row++) for(int col = 0; col < 3; col++) { x = data_t1[row][col]; if(x < 0) str = ""; else str = QString::number(x); ui->tableWidget_1->item(row, col)->setText(str); x = data_t2[row][col]; if(x < 0) str = ""; else str = QString::number(x); ui->tableWidget_2->item(row, col)->setText(str); } } //QMessageBox msgBox; //msgBox.setText(QString::number(r) + " " + QString::number(b)); //msgBox.exec(); |