Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: alexu007 от Май 08, 2022, 10:19



Название: Задача Джонсона для 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();