Lotus Connections を使用した教育産業向けのよりスマートなコラボレーション: パート 2 研究プロジェクトへの学生の割り当ての最適化

リレーショナル・データベースからのデータで IBM ILOG 最適化モデルを使用する

この記事では、研究プロジェクトのポジションへの学生の割り当てを最適化するのに役立つ、Web アプリケーションの構築方法について説明します。割り当てプロセスはリモート DB2 データベースからデータを取得し、ILOG CPLEX を使用して最適化を実行します。Web ブラウザー・ベースのクライアントは、IBM Lotus Connections から iWidgets を通じて、このアプリケーションと対話します。

Anton Zorin, Software Engineer, IBM China

Photograph of Anton ZorinAnton Zorin has been an IBM Software Engineer since 2006. His primary focus is in the areas of web development, linear optimization, and text analytics. He's also been involved in the development of multi-ware systems, image processing, and reconfigurable computing.



Carl Osipov, Software Architect, IBM

CarlCarl Osipov is an experienced software architect with the Strategy and Technology organization in IBM Software Group. His skills are in the area of distributed computing, speech application development, and computational natural language understanding. He has published and presented on Service-Oriented Architecture and conversational dialog management to peers in the industry and academia. His current focus is on design of reuse techniques for composite business services.



2011年 8月 26日

はじめに

この記事では、研究プロジェクトのポジションに学生を割り当てる際、推奨の割り当てを提示する Web アプリケーションの構築方法について説明します。このアプリケーションはリモート・データベースからデータを取得し、ILOG CPLEX を使用してデータに基づく最適化を実行します。Web インターフェースは、制約や重みパラメーターの指定、最適化の結果をユーザーに表示するのに使用します。最適化の計算はサーブレットによって要求されます。サーブレットは、最適化プロセスの入力データをリモート DB2 データベースから取得し、プロセスを起動します。計算結果を XML 出力として示し、この出力をユーザーに送り返します。サーブレットは、ILOG CPLEX 最適化エンジンのインスタンスと同じネットワーク・ノードとオペレーティング・システムにインストールされています。

この記事の最初の部分では、アプリケーションの構築に使用するツールとテクノロジーについて説明します。各ツールに関して、一般的な目的の説明とこのアプリケーションでの使い方が記載されています。

2 番目の部分では、対話型のクライアント・セッションの例を挙げ、ユーザーが入力データを指定して最適化プロセスを起動する方法について説明します。

3 番目の部分では、アプリケーション・アーキテクチャーについて高次の概要を示し、アプリケーション・アーキテクチャーにおけるサーブレット、Java API、および ILOG CPLEX 最適化エンジンの役割について説明します。また、この部分では、ユーザー対話をサポートする Web インターフェースを実装する際に使われる Dojo ライブラリー、およびサーブレットとブラウザー・クライアント間のデータ変換フォーマットについても説明します。

4 番目の部分では、最適化プロセスの各ステージの時間を測定し、これを分析する形でこの記事を締めくくります。

この記事で取り上げるソリューションのソース・コードについては、ダウンロードして参照することが可能です (リンクについては、「ダウンロード」を参照してください)。

環境、ツール、およびテクノロジー

アプリケーション内で使用するツールから始めましょう。

図 1. アプリケーションのアーキテクチャー

クリックして大きなイメージを見る

図 1. アプリケーションのアーキテクチャー

最適化の計算は、ILOG Optimization Decision Manager Enterprise 3.4 (ODME) によって行われます (トライアル・ダウンロードについては、「リソース」を参照してください)。これは、プランニングとスケジューリング用に最適化ベースのソリューションを開発および展開する強力なプラットフォームであり、コラボレーションと What-If 分析の機能を備えています。この記事では、図 1 の右側に示す IBM ILOG CPLEX (CPLEX) がアプリケーションでどのように使われるかを説明します。CPLEX は ODME の最適化エンジンの 1 つで、よりスマートでリソース効率の高い計画およびスケジュールの作成を可能にします。このプラットフォームは、C++、Java、および .Net プログラミング言語用のインターフェースを提供することにより、さまざまなアプリケーション・ドメインをサポートします。この記事では、ILOG Java API を使用した統合について説明します。

アプリケーションには、インターネット経由で HTTP 要求を通じてアクセスします。サーブレットは、アプリケーションが HTTP 要求の処理および応答を行うための機構を提供し、プラットフォームに依存しないコンポーネント・ベースの、Web ベースのアプリケーションを構築するための方法をサポートします。この記事では、WebSphere Application Server Community Edition (WASCE) を Java サーブレット用のコンテナーとして使用します。

このアプリケーションは、最適化エンジンが大量のデータ (何十万もの変数) を処理できるよう設計されているため、データを格納し、効率よくナビゲートするためのデータベースが必要になります。この記事では、IBM DB2 をデータベース管理システムとして選択しました。

Web ブラウザー・クライアントは、Web インターフェースを使用してアプリケーションと対話します。この記事では、Web アプリケーション用のランタイム環境として IBM Lotus Connections を使用します。アプリケーションのアーキテクチャーでは、サーブレットと対話し、ユーザーに Web インターフェースを配布する役割を Lotus Connections が担っています。Lotus Connections は iWidget をサポートします。iWidget はIBM の仕様で、ウィジェットの標準定義と、IBM のプラットフォーム群および製品群にわたって相互運用性をサポートします (「リソース」を参照してください)。


クライアント・セッションの例

このアプリケーションの目的は、研究プロジェクトのポジション (座席) に学生を割り当てる際に推奨の割り当てを提示することです。ポジションや学生の数が多いと、割り当ての推奨を手作業で生成するのは時間がかかります。アプリケーションは、推奨を最適化する分析を自動化することで、この問題を解決します。

推奨はプロジェクトにより生成されます (プロジェクトの例については 図 2 を参照してください)。各プロジェクトには、異なるタイプ (たとえば、遺伝科学者またはソフトウェア・エンジニア) の関連ポジションが 1 つ以上含まれています。同じタイプに複数のポジションが存在することもあります。

アプリケーションは適合スコアを使用します。これは、候補者の学生がポジション記述書にどの程度適合しているかを示すものです。スコアの値が高いほど、より適合していることになります。スコアの生成方法には、以下をはじめ多数のオプションがあります。

  • ルール・ベース — ポジション記述書で要求される Java 経験年数が 5 年で、候補者の経験年数が 4 年の場合には、スコアに 0.8 ポイントを加えるということを規定したルールを使用します。
  • グラフ・ベース — 候補者のソーシャル・グラフとセマンティック・グラフにおける関連性の強さを示すスコアを使用します。
  • テキスト分析ベース — 候補者の履歴書と職務記述書に同じ用語が使用される頻度を測定します。

適合スコアの計算方法の詳細は、この記事では取り上げません。しかし、このシリーズの他の記事に、適合スコアを導き出すのに使えるテキスト分析のアプローチが記載されています。このアプリケーションは、割り当てごとの適合スコアが可能な限り高くなるよう試しながら、できるだけ多くの座席を有効な候補者で埋める割り当て方を検出します。結果は、割り当ての推奨としてユーザーに表示されます。

配属担当者は、ポジションへの学生の割り当てを実行するアプリケーション・ユーザーです。配属担当者がアプリケーションの使用を開始する前に、システム管理者は、プロジェクト、ポジション、学生、および学生とポジション間の適合性に関する情報を使用して、アプリケーション・データベースが作成されていることを確認しなければなりません。

配属担当者は、Web ブラウザーでアプリケーション URL (この記事で使用しているのは http://<wasce_host>/smash_ilog/) を開くことによってアプリケーションを開始します。これは、iWidget がプロジェクトのリストをレンダリングする URL です (図 2参照)。担当者はプロジェクトを選択して作業を進めます。

図 2. プロジェクトの選択画面
プロジェクトの選択画面

次に、担当者は「Select seats」ボタンをクリックし、シート・データを表示して変更することができます (図 3 参照)。

図 3. 座席の選択
座席の選択

すべての変更が完了したら、担当者は「Optimization result」ボタンを押して、最適化を要求します。図 4 に示す「solution」タブには、最適化の観点からプロジェクトの座席とその座席の推奨候補者が表示されています。

図 4. ソリューション
ソリューション

calculation data」タブには、最適化プロセスで使用された内部 CPLEX 変数が表示されます (図 5 参照)。

図 5. 計算データ
計算データ

CPLEX エンジン・ログと時間の統計は「engine log」タブに表示されます (図 6 参照)。

図 6. エンジン・ログ
エンジン・ログ

アプリケーションの内部

IBM DB2 データベースの構造と統合

最適化プロセスによって使用される入力データは DB2 データベースにあります。データベース表のデータ構造は次のとおりです。

図 7. 最適化のためのデータ
最適化のためのデータ

最適化サーブレットは、DB2 インスタンスとの対話に JDBC 接続を使用します。サーブレット・コンテナー (この例では WASCE) は、jdbc/YOUR_DB_NAME を DB2 データベースのデータ・ソースとしてあらかじめ構成されているものとして、サーブレットは DB2 インスタンスへの接続を作成し、データベースからデータを取得します。

接続の作成およびクエリーを使用したデータの取得
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ilogdb = (DataSource) envCtx.lookup("jdbc/YOUR_DB_NAME");
Connection con = (Connection) ilogdb.getConnection();

long id = 10;
ArrayList<Seat> al = new ArrayList<Seatt>();
String sql = "SELECT * FROM SEATS WHERE PROJECT_ID = " + id;
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
while (rs.next())
{
	Seat sl = new Seat();
	sl.setId(rs.getLong("ID"));
	sl.setPId(rs.getLong("PROJECT_ID"));
	sl.setName(rs.getString("NAME"));
	sl.setNmb(rs.getInt("COUNT"));
	sl.setAvl(rs.getBoolean("IS_AVAILABLE"));
	al.add(sl);
}
rs.close();
st.close();

Connection の con を使用して SQL 要求を送信します。結果として得られる表は、ResultSet クラスの rs インスタンスによって表されます。

while ループで Seat インスタンスの配列が生成されます。このインスタンスのコンテンツは、DB2 データベース内の SEATS 表から取得した行に対応します。Project、Seat、Practitioner、Compatibility、および OptimizationModel の各クラスは、データベース内に格納され、最適化によって使用される他のエンティティーを記述するものです。

これらのクラスは、対応する *Peer クラス (ProjectPeer、SeatPeer など) を使用してインスタンスが作成され、コレクションへとグループ化されます。この *Peer は、データベースに対してエンティティーのライフ・サイクル・オペレーション (作成、取得、更新、削除) の SQL 要求を実行するクラスです。たとえば、データの取得には次の SQL 要求が使用されます。この場合の id は、取得メソッドに渡される Project の識別子です。

Project の情報を求めるクエリーは次のとおりです。

"SELECT * FROM PROJECTS"

Compatibility 情報を求めるクエリーは次のとおりです。

"SELECT * FROM COMP_LOSS WHERE SEAT_ID IN "
			+ "(SELECT ID FROM SEATS WHERE PROJECT_ID = "
			+ id
			+ ")"                       
			+ " ORDER BY SEAT_ID"

Practitioner の情報を求めるクエリーは次のとおりです。

“SELECT * FROM PRACTITIONERS”.

各 *Peer クラスは、取得した結果を ArrayList として返します。ArrayList 内のエンティティーは、カスタム ILOG データ・ソースを構築することにより、最適化に使用されます (次のセクションで説明します)。

IBM ILOG への Java API

サーブレットは ODME Java API を使用して、最適化を実行するよう CPLEX エンジンに要求します。Java API の観点では、最適化プロセスは次の 5 つのステージで構成されています。

  1. 環境の初期化
  2. モデルのセットアップ
  3. ソース・データのセットアップ
  4. 計算の実行
  5. 環境のクリーンアップ

Java 言語で IBM ILOG への API を使用する例を以下に示します。

IBM ILOG への Java API を使用するサンプル・コード
The complete listing should appear here

IloOplFactory.setDebugMode(false);
IloOplFactory oplF_ = new IloOplFactory();
IloOplErrorHandler errHandler_ = oplF_.createOplErrorHandler(System.err);
IloOplSettings settings_ = oplF_.createOplSettings(errHandler_);
IloCplex cplex_ = oplF_.createCplex();
cplex_.setParam(IloCplex.DoubleParam.WorkMem, 512);
String modelText = ModelPeer.getModelByName("tonkawa", con).getValue();
IloOplModelSource modelSource = 
	oplF_.createOplModelSourceFromString(modelText, “tonkawa”); 		
IloOplModelDefinition definition = oplF_.createOplModelDefinition(modelSource,settings_); 
opl_ = oplF_.createOplModel(definition, cplex_);
IloOplDataHandler handler = getDataHandler();
handler.startElement("ilog_var"
handler.addIntItem(10);
handler.endElement();
opl_.addDataSource(dataSource);
opl_.generate();
if ( cplex_.solve() == true)
	opl_.postProcess();
opl.end();
cplex.end();		
oplF.end();

ステージごとにリストを見ていきましょう。最初のステージでは、サーブレットは CPLEX 最適化エンジンのインスタンスと、いくつかの 2 次変数 (エラー処理やモデル設定を含む) を作成します。

IloOplFactory.setDebugMode(false);
IloOplFactory oplF_ = new IloOplFactory();
IloOplErrorHandler errHandler_ = oplF_.createOplErrorHandler(System.err);
IloOplSettings settings_ = oplF_.createOplSettings(errHandler_);
IloCplex cplex_ = oplF_.createCplex();
cplex_.setParam(IloCplex.DoubleParam.WorkMem, 512);

リストの最後のストリングは、最適化エンジンによって使用されるメモリーの量を設定します。これは、大量の入力データの最適化をサポートするために行われます。これで、初期化の完了です。

次のコードでは、最適化モデルをセットアップします。

String modelText = ModelPeer.getModelByName("tonkawa", con).getValue();
IloOplModelSource modelSource = 
	oplF_.createOplModelSourceFromString(modelText, “tonkawa”); 		
IloOplModelDefinition definition = oplF_.createOplModelDefinition(modelSource,settings_); 
opl_ = oplF_.createOplModel(definition, cplex_);

最初の行で、モデル定義のテキストをデータベースから取得します。モデル定義は「tonkawa」という名前で格納されています。次の 2 行で、最適化モデルの入力ソースを表すオブジェクトを作成します。その次の行で、モデル定義を作成します。これは、モデル・ソースの内部表現です。最後に、コードの最終行で、最適化モデルのインスタンスを作成します。

3 番目のステージ (ソース・データのセットアップ) で、アプリケーションは最適化の入力変数を内部 ILOG 形式で作成し、モデルに添付します。アプリケーションはモデルのカスタム・データ・ソースを使用します。これは、内部 CPLEX フォーマットでの最適化変数の割り当てと、最適化プロセスを開始する前の割り当てを意味します。

カスタム・データ・ソースを使用するには、IloCustomOplDataSource から派生したクラスと最適化プロセスで使用する変数を生成する customRead() メソッドを定義する必要があります。これによって、最適化プロセスで使用する変数が作成されます。変数の定義は、getDataHandler メソッドの呼び出しによって返される IloOplDataHander のインスタンスを使用して行います。

IloOplDataHandler handler = getDataHandler();

新しい変数は、handlerstartElement() メソッドを使用して定義できます。

handler.startElement("ilog_var");

次に、整数の場合は addIntItem() によって、実数の場合は addNumItem() によって値を割り当てます。

handler.addIntItem(10);

割り当て後、endElement() メソッドによって定義を終了します。

handler.endElement();

メモ: 変数が配列の場合は、次のように処理できます。

handler.startElement("ilog_array");
handler.startArray();
for(int i=0; i<10; ++i)
	handler.addIntItem(i);
handler.endArray();
handler.endElement();

配列はネストすることもできます。

すべての変数を定義した後、IloOplModel クラスの addDataSource() メソッドを呼び出すことによって、データ・ソースを OPL モデルに添付します。

opl_.addDataSource(dataSource);

データ・ソースの添付後、generate() メソッドによって内部 ILOG 形式の最適化の問題を生成し、抽出します。このメソッドはデータを読み込み、前処理を実行し、この問題の表現を作成します。

opl_.generate();

これで、モデルを解決できるようになりました。

if ( cplex_.solve() == true)
	opl_.postProcess();

ソリューションが見つかると、solve() メソッドが true を返し、後処理が発生します。後処理は通常、表示または他のアプリケーション (スプレッドシートなど) への送信用に、データ (結果データを含む) を集約、変換、およびフォーマットする場合に使われます。

環境をクリーンアップするには、モデル、CPLEX エンジン、およびファクトリーの各インスタンスに対して end() メソッドを呼び出す必要があります。

opl.end();
cplex.end();		
oplF.end();

ILOG 最適化エンジンと対話するクラスを 図 8 に示します。

図 8. ILOG 最適化ラッパー・クラス
ILOG 最適化ラッパー・クラス

IlogOptimizer クラスは ILOG API を用いて機能し、最適化の計算を送信します。また、最適化のデータ・ソースを表す OptimizationDataSource クラスのインスタンスを生成します。

IlogDataRendererXML クラスは、XML 形式の内部 ILOG 変数を取得し、ラップします。

ILOG 最適化エンジンとサーブレット側の対話について確認したので、今度はクライアント・サイドを確認することにしましょう。

Dojo ライブラリー

Dojo ライブラリーはハイレベルの JavaScript ライブラリーで、アプリケーションのクライアント・サイドの部分を構築するために使用されます。ユーザー・インターフェースを作成し、レンダリングします。Dojo には、以下に示すように、ユーザー・インターフェース・アイテムを記述する方法として、宣言とプログラマチックの 2 つがあります。

リスト 3: 宣言スタイル
<div id="mainTabContainer" dojoType="dijit.layout.TabContainer">
<div id="tab1" dojoType="dijit.layout.ContentPane" 
	title=" solution ">
  </div>
<div id="tab2" dojoType="dijit.layout.ContentPane"
 	title=" calculation data ">
  </div>
<div id="tab3" dojoType="dijit.layout.ContentPane"
 	title="engine log ">                        
  </div>            
</div>
リスト 4: プログラマチック・スタイル
var labelStep = new dijit.form.TextBox({value:"step:",            
                                     disabled:true,
                                     style:"width:50px;text-align:right"
                                            });        

var valEBox = new dijit.form.NumberTextBox({value:parmProps.defVal,
                                     constraints:
                                     {min:parmProps.minVal},
                                     style:"width:50px;text-align:right"
                                                });

また、アプリケーションはライブラリーを使用して、最適化サーブレットへの要求の送信、最適化サーブレットから返された XML 応答の構文解析を行います。

クライアントのユーザー・インターフェースは、静的な部分と動的な部分の 2部構成になっています。静的な部分は XML を用いて宣言スタイルで記述されるのに対し、動的な部分はプログラムでリアルタイムに生成されます。ユーザー・インターフェースは、プロジェクトの選択、シートの選択、最適化の結果表示を行う 3 つのペインを持ったスタック・コンテナー・ウィジェットに内包されています (図 2 から 図 4 参照)。ペインを内包するスタック・コンテナーは静的ですが、ペインのコンテンツは動的に作成されます。

次のクラスはコンテンツを作成し、サーブレットとの対話を実装します。

ProjectSelectionItem
SeatSelectionItem
OptimizationResultItem

これらは、サーブレットへの要求の送信とサーブレットからの応答を処理する機能をもつ IlogInterfaceItem クラスのサブクラスです。これら 3 つのサブクラスのインスタンスは、Dojo の OnLoad 関数でインスタンスが生成される IlogInterface クラスによって集約されます。

また、IlogInterface は初期要求を送信し、水平軸および垂直軸に沿って表示する項目の数をサーブレットに指示します。この要求は IlogInterfacedoRequest メソッドから呼び出します。初期要求の送信とペイン処理クラスの作成は、IlogInterface のコンストラクターによって実行されます。

クライアントとサーブレット間のデータ交換

クライアントのメッセージとサーブレットの応答を表 1 に示します。upd_seats (シートの更新) のようなサブ要求は、上位レベルの要求に添付されます。

表 1. クライアントとサーブレットとの対話
Message IDSub-message IDattributesServlet’s responseNotes
init maxNumX
maxNumY
Empty This message is to set up number of items to display in vertical and horizontal directions
sel_project positionY
List of existing projects in the database The postionY attribute is used for pagination and specifies virtual position within the PROJECTS table of the database
sel_seats projectId,
positionY
List of seats for the selected project The project to process is specified via the user interface; positionY attribute is used for pagination
sel_seats upd_seats ids[], counts[], availabilities[] empty This message is sent to update the database when some of seats data are changed by a user
opt_result calc_req projectId
Solution, engine variables, statistics This message submits the calculation process
opt_result sol_req positionY Solution Used for pagination
opt_result var_req name, positionX, positionY (optional) An engine variable’s values This message is used to navigate through the engine variables

XML は Dojo での作成と構文解析が容易であるため、サーブレットはデータを XML 形式でクライアントに送信します。

クライアントに返される XML メッセージの例
<solution objective="3054.3639800807873">
	<position title="Software engineer C++" index="0">
		<candidate index="0">
		John Doe
		</candidate>
		<candidate index="2">
		John Smith
		</candidate>
	</position>
	<position title="Software engineer Java" index="1">
		<candidate index="3">
		Jane Smith
		</candidate>
	</position>
</solution>

1 次元データのラッピングは <d1> タグによって行われます。値はスペースで区切られています。多次元配列は、各次元を dN タグでラップすることによって処理されます。N は次元を示す数字です。たとえば、2 次元配列は以下のようにラップされます。この例では、XML メッセージは、compatibility 変数の値を求める upd_var 要求への応答になっています。

<item name="compatibility" type="MAP_NUM">
	<d2>
	<d1>
	432.67874830187907 157.5568843778936
	987.0323098531833 294.0221485741561 
	</d1>
	<d1>
	441.28662423809857 606.1236490975754
	117.37416729043002 539.3803607400704 
	</d1>
	<d1>
	579.6263501729665 380.9399328362894
	826.7802763365257 65.91520976844086 
	</d1>
	<d1>
	859.9294772959771 944.3249593145671 
	857.7524070538518 443.84433586006287 
	</d1>
	</d2>
</item>

サーブレットのアーキテクチャー

サーブレットのアーキテクチャーには、クライアント要求の処理、DB2 対話、ILOG ODM 対話という 3 つの基本部分が含まれています。後者の 2 つについては、これまでに説明しました。ここでは、クライアント要求の処理におけるアーキテクチャーについて以下に説明します。

図 9. クライアント要求の処理におけるアーキテクチャー
クライアント要求の処理におけるアーキテクチャー

IlogServiceDB クラスはサーブレット機能 (たとえば、HttpServlet インターフェース) を実装し、ユーザー・インターフェース・クライアントからの HTTP GET 要求を処理する役割を担っています。

ClientRequestsHandler クラスは、クライアント・セッションがアクティブなときに、クライアントからの要求を処理します。要求をハンドラーにディスパッチし、要求は TreeMap コンテナーによってクラスのインスタンスに集約されます。

ClientRequestSession は、クライアント要求ハンドラー用の基本クラスです。要求が処理されている間、データベースへのアクティブ接続を確立し、保持します。

InitRequest クラスは、次元データ用の表示するためのアイテムの最大数を受け取り、これらのパラメーターを ClientRequestSession クラスの静的変数に格納します。

RequestProjects クラスは PROJECTS 表からデータを取得し、クライアントに送信します。

RequestSeats クラスは、SEATS 表に対し、RequestProjects と同様のことを行います。

OptimizationResultsRequest は、最適化を実行する要求、または最適化の一部の結果を取得する要求のいずれかを処理します。それぞれの要求タイプは、対応するメソッドによって処理されます。

StatisticsLog はメッセージを指定されたアウトプットに書き出し、必要に応じてタイム・スタンプを付加します。

クライアントの HTTP GET 要求がどのように処理されるのかを 図 10 および 図 11 のシーケンス図に示します。図 10 では、getAttribute メソッド呼び出しを使用して、ClientRequestHandler クラスのセッション・インスタンスを取得しています。

図 10. HTTP GET 処理の順序

図 11 のシーケンス図は、計算要求がどのように処理されるのかを示しています。また、この図は、最適化を実行するための ODME との対話も示しています。

図 11. 計算要求処理の順序

まとめ

さまざまなテスト・データのセットを使用してアプリケーションをテストし、測定された時間の特性を表 2 に示します。

計算には、データの抽出と転送よりも常に多くの時間がかかりました。その理由は、測定に使用されたデプロイメント環境で、ODME および DB2 インスタンスが、1 つの物理サーバーによってホストされる異なる仮想マシン上に存在するためです。

表 2. 最適化プロセスの時間統計
Size (seats x practitioners)Transfer of data to the JVM memoryCalculation
4x4 seatscompatibilitiespractitionersTotal
query execution 00:00,000 00:00,000 00:00,015 00:00,015 00:00,063
data transfer 00:00,000 00:00,000 00:00,000
100x100 seatscompatibilitiespractitionersTotal
query execution 00:00,016 00:00,015 00:00,015 00:00,234 00:00,594
data transfer 00:00,000 00:00,188 00:00,000
1000x1000 seatscompatibilitiespractitionersTotal
query execution 00:00,015 00:00,062 00:00,078 00:10,812 01:35,344
data transfer 00:00,063 00:10,579 00:00,015

アプリケーションの各コンポーネントと主目的の機能によって、1 つの環境へと統合する能力が提供されます。これにより、開発者は複雑な分散インフラストラクチャーを単純かつ直接的な方法で構築できます。Eclipse IDE は、各コンポーネント用の統合開発フレームワークとして使用できます。WASCE Web コンテナーとバンドルされた Eclipse IDE の使用により、Java コードをデバッグする強力な機能が得られます。

この記事では、リモート・データベースからデータを取得し、ILOG CPLEX を使用して最適化を実行する Web アプリケーションについて解説しました。


ダウンロード

内容ファイル名サイズ
Client sample source codetonkawa_iwidget_jscript.zip9.71KB
Server sample source codetonknawa_src_java.zip10KB

参考文献

学ぶために

製品や技術を入手するために

  • IBM trial software: Evaluate IBM software products in the method that suits you best. From trial downloads to cloud-hosted products, developerWorks features software especially for developers.

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Industries, Lotus
ArticleID=742491
ArticleTitle=Lotus Connections を使用した教育産業向けのよりスマートなコラボレーション: パート 2 研究プロジェクトへの学生の割り当ての最適化
publish-date=08262011