Задача Джонсона для 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();