unvisibleman

Распределение ресурсов для 2х производств

Mar 29th, 2015
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.13 KB | None | 0 0
  1. #include <fstream>
  2. #include <cmath>
  3. #include <iostream>
  4.  
  5. #define temp_count 251
  6.  
  7. using namespace std;
  8.  
  9. ofstream inverse("inverse.txt"); //таблицы обратного планирования
  10. ofstream direct("direct.txt"); //таблица прямого планирования и максимальная прибыль
  11.  
  12. int *x = new int[temp_count];
  13. double  *f = new double[temp_count],
  14.         *g = new double[temp_count],
  15.         *phi = new double[temp_count],
  16.         *psi = new double[temp_count];
  17. double table[5][temp_count][3];
  18. double optimize[4][8];
  19.  
  20. int k_max, step;
  21.  
  22. void reverse(int month){
  23.     cout<<"Обратное планирование для "<<month<<" месяца...\n";
  24.     double max = -1;
  25.     int var_x = 0;
  26.     int k_to = (month==1)?0:k_max;
  27.     double temp_max;
  28.    
  29.     for (int k = 0; k <= k_to; k++){
  30.         int k_mul = (month==1)?k_max:k;
  31.         for (; var_x <= k_mul; var_x++){
  32.             if(month<4){
  33.                 double tmp = phi[var_x] + psi[k_mul - var_x];
  34.                 int lower_level = (int)floor(tmp); //нижняя граница для числа
  35.                 int upper_level = (int)ceil(tmp); //верхняя граница для числа
  36.                 while ( lower_level % step ) lower_level--;
  37.                 while ( upper_level % step ) upper_level++;
  38.                 lower_level /= step; //чтобы не вылетел за границы, индекс в массиве в 4 раза меньше
  39.                 upper_level /= step;
  40.                 temp_max = f[var_x] + g[k_mul - var_x] + (table[month+1][lower_level][2] * (upper_level*step - tmp) + table[month+1][upper_level][2] * (tmp - lower_level*step)) / step;
  41.             } else
  42.                 temp_max = f[var_x] + g[k - var_x];
  43.             //если сумма больше максимума, то записываем в таблицу
  44.             if (max < temp_max){
  45.                 max = temp_max;
  46.                 table[month][k][0] = k_mul * step;
  47.                 table[month][k][1] = var_x * step;
  48.                 table[month][k][2] = max;
  49.             }
  50.         }
  51.         //т.к. функция возрастает и выпукла вверх, можно начинать с предыдущего х
  52.         if(month>1)
  53.             var_x = (int)table[month][k][1] / step;
  54.     }
  55.     inverse<<"\nk"<<month<<"\tx"<<month<<"\tP(x)\n";
  56.     for (int i = 0; i < k_to + 1; i++)
  57.         inverse<<table[month][i][0]<<"\t"<<table[month][i][1]<<"\t"<<table[month][i][2]<<"\n";
  58. }
  59.  
  60. void nline(int line){
  61.     int dir_lower_level, dir_upper_level;
  62.    
  63.     optimize[line][0] = line+1;
  64.     optimize[line][1] = optimize[line-1][6] + optimize[line-1][7];
  65.     dir_lower_level = (int)floor(optimize[line][1]);
  66.     while ( dir_lower_level % step ) dir_lower_level--;
  67.     //шаг у k и х одинаковый, целое значение + добавляем остаток
  68.     optimize[line][2] = table[line+1][(int)(dir_lower_level / step)][1] + (optimize[line][1] - dir_lower_level);
  69.     optimize[line][3] = optimize[line][1] - optimize[line][2]; //y окажется целым
  70.     dir_lower_level = (int)floor(optimize[line][2]); //верхний и нижний пределы для х, строим линейную аппроксимацию
  71.     dir_upper_level = (int)ceil(optimize[line][2]);
  72.     while ( dir_lower_level % step ) dir_lower_level--;
  73.     while ( dir_upper_level % step ) dir_upper_level++;
  74.     optimize[line][4] = (f[(int)(dir_lower_level / step)] * (optimize[line][2] - dir_lower_level) + f[(int)(dir_upper_level / step)] * (dir_upper_level - optimize[line][2])) / step;
  75.     optimize[line][5] = g[(int)(optimize[line][3] / step)];
  76.     if(line < 3){
  77.         optimize[line][6] = (phi[(int)(dir_lower_level / step)] * (optimize[line][2]-dir_lower_level) + phi[(int)(dir_upper_level / step)] * (dir_upper_level-optimize[line][2])) / step;
  78.         optimize[line][7] = psi[(int)(optimize[line][3] / step)];
  79.     }else{
  80.         optimize[line][6] = 0;
  81.         optimize[line][7] = 0;
  82.     }
  83. }
  84.  
  85. void normal(){
  86.     cout<<"Прямое планирование...\n";
  87.     // 1 строка
  88.     optimize[0][0] = 1; //i
  89.     optimize[0][1] = table[1][0][0]; //k
  90.     optimize[0][2] = table[1][0][1]; //x
  91.     optimize[0][3] = optimize[0][1] - optimize[0][2]; //y
  92.     optimize[0][4] = f[(int)(optimize[0][2] / step)]; //f(x)
  93.     optimize[0][5] = g[(int)(optimize[0][3] / step)]; //g(x)
  94.     optimize[0][6] = phi[(int)(optimize[0][2] / step)]; //phi(x)
  95.     optimize[0][7] = psi[(int)(optimize[0][3] / step)]; //psi(x)
  96.     nline(1); // 2 строка
  97.     nline(2); // 3 строка
  98.     nline(3); // 4 строка
  99.     // вывод
  100.     direct<<"i\tk\tx\ty\tf(x)\tg(y)\tphi(x)\tpsi(y)\n";
  101.     for(int i=0; i<4; i++){
  102.         direct<<i<<"\t";
  103.         for(int j=1; j<8; j++)
  104.             direct<<optimize[i][j]<<"\t";
  105.         direct<<"\n";
  106.     }
  107. }
  108.  
  109. int main(){
  110.    
  111.     ifstream input("input.txt");
  112.     if (!input.is_open()){
  113.         cout<<"Файл не найден!\n";
  114.         return 1;
  115.     }
  116.    
  117.     for(int i=0; i<temp_count; i++) input>>x[i]>>f[i];
  118.     for(int i=0; i<temp_count; i++) input>>x[i]>>g[i];
  119.     for(int i=0; i<temp_count; i++) input>>x[i]>>phi[i];
  120.     for(int i=0; i<temp_count; i++) input>>x[i]>>psi[i];
  121.  
  122.     k_max = temp_count - 1; //k1
  123.     step = x[1] - x[0]; //шаг между значениями k и x
  124.     /* ОБРАТНОЕ ПЛАНИРОВАНИЕ */
  125.     reverse(4);
  126.     reverse(3);
  127.     reverse(2);
  128.     reverse(1);
  129.     /* ПРЯМОЕ ПЛАНИРОВАНИЕ */
  130.     normal();
  131.    
  132.     cout<<"Данные сохранены в direct.txt и inverse.txt.\n";
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment