Диссертация (1149786), страница 19
Текст из файла (страница 19)
Ниже приводится листинг этойпрограммы, написанной на языке C++.#include <algorithm>#include <vector>#include <iostream>using namespace std;Вначале определяются две вспомогательный процедуры. Первая процедура, edge(), используется для получения идентификатора одномерного ребрасимплекса по паре идентификаторов вершин. Вторая процедура, equa(), выводит в стандартный поток вывода одну строчку расширенной матрицы, соответствующую одному линейному уравнению./*** Returns a zero-based id of the edge that* connects vertices v1 and v2.*/int edge(int v1, int v2){// Pairs of veritices that form edgesint ver[10][2] = {{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4},{3, 4}, {3, 5}, {4, 5}, {1, 5}, {2, 5}};for (int i = 0; i < 10; i++) {if ((ver[i][0] == v1 &&ver[i][1] == v2) ||(ver[i][1] == v1 &&ver[i][0] == v2)){return i;}}145return -1;// Must never happen}/*** Prints one row of the matrix.* Elements are &-separated.*/void equa(int x1, const char* coef1,int x2, const char* coef2,const char* fr){for (int i = 0; i < 11; i++) {if (i == x1)cout << coef1;else if (i == x2)cout << coef2;elsecout << "0";cout << " & ";}cout << fr << " \\\\" << endl;}Далее следует основная процедура программы.
В ней вначале инициализируется структуры данных, задающих тройку симплексов. Следом за этим,полным перебором, генерируются все возможные перестановки вершин симплексов, соответствующие предполагаемому делению бóльшего симплекса надва меньших подобных бóльшему. В процессе перебора полученные системылинейных уравнений выводятся в стандартный поток вывода.Для экономии места, если в системе уравнений встречается уравнение,содержащее при какой-либо переменной коэффициент вида (1 − kj ), где kj— коэффициент пропорциональности между бóльшим симплексом и одним изменьших, такая система отбрасывается, как заведомо не имеющая решений,удовлетворяющих поставленным ограничениям.К каждой системе добавляется еще пара уравнений, справедливых по построению.146/*** The entry point*/int main(int argc, char* argv[]){// Vertices of the simplicesvector<int> s0, s1, s2;s0.push_back(1); s0.push_back(2);s0.push_back(3); s0.push_back(4);s1.push_back(1); s1.push_back(2);s1.push_back(3); s1.push_back(5);s2.push_back(1); s2.push_back(2);s2.push_back(4); s2.push_back(5);// Indices of vertices that form edgesint idx[6][2] = {{0, 1}, {0, 2}, {0, 3},{1, 2}, {1, 3}, {2, 3}};// Statisticsint skipped = 0;int printed = 0;do {do {bool skip = false;for (int i = 0; i < 6; i++) {int e0 = edge(s0[idx[i][0]],s0[idx[i][1]]);int e1 = edge(s1[idx[i][0]],s1[idx[i][1]]);int e2 = edge(s2[idx[i][0]],s2[idx[i][1]]);if (e0 == e1 || e0 == e2) {skip = true;skipped++;break;}}// We don’t print those linear systems that// contain an equation with coefficient147// of a type (1-k_j).if (!skip) {// LaTeX header of the matrixif ((printed & 1) == 0)cout << "\\begin{tiny}"<< "\\fontsize{5}{0}{\\[\n";cout <<<<<<<<"\\left\\|\\begin{array}\n""{*{5}{c@{\\!}}""c@{\\hskip 0.8mm}*{5}""{c@{\\hskip 2.6mm}}c}\n";for (int i = 0; i < 6; i++) {int e0 = edge(s0[idx[i][0]],s0[idx[i][1]]);int e1 = edge(s1[idx[i][0]],s1[idx[i][1]]);int e2 = edge(s2[idx[i][0]],s2[idx[i][1]]);equa(e1, "1", e0, "-k_1", "0");equa(e2, "1", e0, "-k_2", "0");}// Two more equationscout << "0 & 0 & 0 & 0 & 0 & -1 &"<< " 1 & 1 & 0 & 0 & 0 & 0 \\\\\n"<< "0 & 0 & 0 & 0 & 0 & 1 &"<< " 0 & 0 & 0 & 0 & 0 & 1\n"<< "\\end{array}\\right\\|\n";if ((printed & 1) == 1)cout << "\\]}\\end{tiny}\n\n";printed++;}} while (next_permutation(s2.begin(),s2.end()));} while (next_permutation(s1.begin(),s1.end()));cout << "Printed: " << printed << endl<< "Skipped: " << skipped << endl;148return 0;}Результаты работы программы приведены в приложении А..