2017-11-30 3 views
0

私は、ジョブショップの問題に類似したものをモデル化しようとしています。ジョブを実行するためにさまざまな数のタスクを使用する、複数の方法で実行できる複数のジョブがあります。MiniZincに値がないオプションのパラメータ

私はその情報を表現するために、このデータ構造を設定している

enum Job; 
enum Option; 
int: maxTasks; 
set of int: TaskIndex = 1..maxTasks; 

enum Task; 

array[Job, Option, TaskIndex] of opt Task: jobOptions; 

jobOptions[j, o, index]が存在する場合、それは仕事jのオプションoindex番目のタスクです。それがない場合、そのジョブのそのオプションは最大数のタスクを使用せず、これは空のスロットの1つです。

この配列をどのように初期化することができないのですか。それは2D配列だった場合、私はそれが3Dであるので、

jobOptions = array3d(Job, Option, TaskIndex, [ 
    % Job 1 
    T1, T2, % Option 1 
    T3, <>, % Option 2 
    % Job 2 
    T2, T4, % Option 1 
    <>, <>, % No second option 
    |]; 

のような何かをしたい

jobOptions = [| 
    T1, T2 | 
    T3, <> 
    |]; 

を行うことができます配列を取るarray3d 3つのバージョンが存在するので、しかし、これは、失敗しました​​,var intおよびvar opt int.<>var opt intであるため、(par) opt intとすると4番目のバージョンが必要です。

私は当初、「非正方形」の配列を作るために

array[Job] of array[int] of array[int]: jobOptions 

ような何かをしようとしましたが、実現可能な場合、私は正しい構文を把握することができなかったということならば。

オプションの要素がない3Dパラメータ配列を初期化する方法はありますか?あるいは、このデータを提示するより良い方法はありますか?

答えて

1

更新:この問題はMiniZincコンパイラのdevelopブランチで解決されました。次のリリースである>2.1.6では、オプションのパラメータタイプとしてarray3d関数を使用することができます。 optのパラメータの


array3d機能は、現在、コンパイラに欠けている機能です。 https://github.com/MiniZinc/libminizinc/issues

通常、私は代わりに()変数の対応する型に型を変更することをお勧めします。GitHubリポジトリで問題を作成することをお勧めします。これはタイプチェックには理想的ではありませんが、引き続きパラメータバージョンのように割り当てることができます(現在のバージョンのarray3dで動作します)。さらに、割り当てられた変数は、コンパイラのパラメータとして動作します。型チェッカーに問題が発生した場合は、常にfix組み込み関数を呼び出してパラメーターにバインドすることができます。

しかし、これをローカルで試したところ、私はコンパイラのセグメンテーション違反に遭遇しているようです。私も同じことを試してみることをお勧めします。同じ問題に遭遇した場合は、GitHubリポジトリで問題を報告してください:https://github.com/MiniZinc/libminizinc/issues

関連する問題