-2

私はバイナリ線形計画問題に取り組んでいます。

私はコンピューター言語にあまり詳しくありませんが (Java と C++ を数か月学んだだけです)、問題が非常に複雑なので、とにかくコンピューターを使用する必要があるかもしれません。

最初のステップは、行列 M (少なくとも 8 X 8) のすべてのエントリに対して変数 m_ij を宣言することです。次に、行列の各要素の対応する値をこれらの変数のそれぞれに割り当てます。

次に、m_ij の値が 0 でない場合は常に、x_ij1、x_ij2、x_ij3、x_ij4、および x_ij5 の他の変数セットを生成します。x_ijk 変数の値は 0 または 1 のいずれかであり、値を割り当てる必要はありません。 x_ijk 変数。

おそらく最も簡単な方法は、各変数に値を宣言して割り当てることです。

int* m_11 = 5, int* m_12 = 2, int* m_13 = 0, ... int* m_1n = 1

int* m_21 = 3, int* m_12 = 1, int* m_13 = 2, ... int* m_2n = 3

次に、値が 0 でない変数を選択し、それに応じて x_ij1 ~ x_ij5 を宣言します。

しかし、これは大変な作業になる可能性があります。特に、この問題ではさまざまな行列を検討する必要があるためです。

これを自動的に行う方法はありますか?

私は Java と C++ を少し知っており、C++ で lp_solve パッケージを使用する (2 進整数線形プログラムの問題を解決する) ことを検討していますが、これが簡単にできるのであれば、他の言語やプログラムを使用したいと思っています。

これを行うには何らかの方法があるはずです (おそらくループを使用すると思いますか?)。これは非常に単純な作業ですが、プログラミング言語があまりないのでわかりません。

私のコホートの 1 人が、必要な条件を満たすランダムなマトリックスを生成するプログラムを作成したので、そのマトリックスを入力として使用できれば理想的かもしれませんが、今のところこれを行う方法は何でもかまいません。

たとえば、マトリックス エントリを Excel ファイルのセルに配置し、それを C++ にインポートして、変数を自動的に生成し、それらに値を割り当てるなど、MS Excel でそれを行う方法がある場合、これによりタスクが大幅に簡素化されます。対処!

4

3 に答える 3

0

実際、Matlab はこのタスクに非常に適しているようです。@Dr_Sam が提供する例では実際にその場で行列が作成されますが、値を割り当てる前に行列を初期化することをお勧めします。このようにして、ワークスペースに同じ名前のものが既に存在し、変数が常に予想されるサイズになる場合でも、コードは正しい変数で終了します。

正方形の 8x8 行列を定義するとします。

m = zeros(8)

一般に、サイズimax, jmax,の 3 次元行列を初期化したい場合kmax:

imax = 8;
jmax = 8;
kmax = 5;
x = zeros(imax,jmax,kmax);

これらの行列への代入または読み取りは非常に簡単です。長さと m は の最初の次元と同じように選択されていることに注意してくださいx

m(3,4) = 4; %Assign a value
myvalue = m(3,4) %read the value
m(:,1) = 1:8 *Assign the values 1 through 8 to the first column

x(2,4,5) = 12; %Assign a single value to the three dimensional matrix
x(:,:,2) = m+1; Assign the entire matrix plus one to one of the planes in x.
于 2013-02-15T17:42:38.593 に答える
0

私は C++ と Matlab (Python ではない) の両方を知っていますが、あなたの場合、プログラミングを開始するときに使いやすいので、Matlab を使います (ただし、Matlab の制限を見つけたら C++ に戻ることを忘れないでください)。 )。

Matlab では、行列を非常に簡単に定義できます。行列の名前と設定するインデックスを入力するだけです。

m(1,1) = 1
m(2,2) = 1

2x2単位行列を提供します(Matlabではインデックスは1から始まり、エントリはデフォルトで0です)。同じ方法で 3 次元行列を定義することもできます。

x(1,2,3) = 2

Excel からのインポートの場合、Excel ファイルを CSV 形式で保存すると、関数dlmreadを使用して Matlab で読み取ることができます。後でアルゴリズムを直接 Matlab に実装することもできます。

最後に、2 進整数プログラムを解きたい場合は、Matlab に既に組み込み関数があり、bintprogそれを解くことができます。

それが役に立てば幸い!

于 2013-02-15T16:34:11.840 に答える
0

std::vectorC++ では、次のようにベクトルの a を使用できます。

std::vector<std::vector<int>> matrix;

マトリックス値に個別の変数を使用する必要はありません。マトリックスがあるのに、なぜそうするのでしょうか?

trueまたはを評価するすべての値を取得する必要がある理由がわかりませんfalsestd::vector代わりに、条件が評価される座標に直接入れtrueます。

std::vector<std::pair<int, int> true_values;
for (int i = 0; i < matrix.size(); i++)
{
    for (int j = 0; j < matrix[i].size(); j++)
    {
        if (some_condition_for_this_matrix_value(matrix[i][j], i, j) == true)
            true_values.emplace_back(std::make_pair(i, j));
    }
}

これで、条件が であるすべての行列座標のベクトルが得られましたtrue


本当に と の両方trueの値が必要な場合は、キーと値としてマトリックス座標を含む を使用falseできます。std::unordered_mapstd::pairbool

// Create a type alias, as this type will be used multiple times
typedef std::map<std::pair<int, int>, bool> bool_map_type;
bool_map_type bool_map;

マトリックスの座標をキーとして、マトリックスのすべての値をこのマップに挿入し、条件に応じてマップ値を挿入しますtruefalse

からすべてのエントリのリストを取得するには、次のコマンドでエントリをbool_map削除できます。falsestd::remove_if

std::remove_if(bool_map.begin(), bool_map.end(),
    [](const bool_map_type::value_type& value) {
        return value.second == false;
    };

これで、値が のエントリのみを含むマップができましたtrue。このマップを反復処理して、マトリックスの座標を取得します


もちろん、私はあなたの問題を完全に誤解しているかもしれません。:)

于 2013-02-15T16:25:22.477 に答える