0

Java で Cplex を使用していますが、制約の設定に問題があります。

行列 x[n][n] があります。x は 0 または 1 です。すべての i(1..n) について、すべての j(1..n) の合計 = 1

この投稿の答え: Cplex c++ multidimensional decision variableについては、次のようにコードを設定しました。

for (int i=0; i<n; i++){
            IloNumExpr sum_over_i;
            for(int j=0; j<n; j++){
                sum_over_i += x[i][j];
            }   
            cplex.addEq(sum_over_i, 1.0);
        }

コードの 4 行目で、Java は次のエラーを表示します。

「+ =」のような代入演算子がcplex c ++では機能するが、cplex javaでは機能しない可能性はありますか?

別の方法として、私はこれを試しました:

for(int i=0; i<n; i++){
            IloNumExpr sum_over_i = null;
            for(int j=0; j<n; j++){
                cplex.eq(sum_over_i, cplex.sum(sum_over_i, x[i][j]));
            }   
            cplex.addEq(sum_over_i, 1.0);
        }

この場合、Eclipse の実行時に次のエラー ノートが表示されます。

Exception in thread "main" java.lang.NullPointerException
at ilog.cplex.CpxQextractor.visitLinkedExpr(CpxQextractor.java:73)
at ilog.cplex.CpxLinkedExpr.accept(CpxLinkedExpr.java:46)
at ilog.cplex.CpxRange.<init>(CpxRange.java:1337)
at ilog.cplex.IloCplexModeler.makeRange(IloCplexModeler.java:4316)
at ilog.cplex.IloCplexModeler.eq(IloCplexModeler.java:4902)
at TSP.main(TSP.java:57)

私のコードのどこが悪いのか誰か教えてもらえますか?

前もって感謝します。

4

1 に答える 1

1

また、CPLEX Java API で線形式を実行する方法の例を見つけるのに非常に苦労したことも覚えていますが、CPLEX の一般的なドキュメントは非常に優れています。

「すべての i(1..n) について、すべての j(1..n) の合計 = 1」という制約を実行するには、次のようにします。

for(int i=0; i < n; i++) {
  IloLinearNumExpr lhs = cplex.linearNumExpr(); //lhs as in left hand side
  for(int j=0; j < n; j++) {
    lhs.addTerm(1.0, x[i][j]);        
  }   

  IloRange con = cplex.addEq(lhs, 1);
  con.setName("yourConstraintName(" + i + ")");      
}

制約に名前を設定する必要はありませんが、常にモデルのデバッグに役立ちます。

于 2013-07-29T06:31:53.170 に答える