問題は次のとおりです。
ユーザーは商品を含むショッピング バスケットを持っています。各商品には、定義された全体的なセットから選択されたサブセットである一連の利用可能な配送タイプがあります (例: [「英国第 2 クラス」、「英国第 1 クラス」、「英国記録配送」] 、しかし正確な名前にこだわりすぎないでください)。
チェックアウト プロセスを実行する際に、ユーザーに別々の配送か組み合わせた配送のオプションを提示する必要があります。
分割は簡単です。各アイテムがそれぞれの行にある表が表示され、列のセットはアイテム間で利用可能な配送タイプの結合と一致します。各行にはラジオ ボタン セットが含まれており、そのアイテムで利用可能な配信タイプの各列に 1 つのボタンがあります。
組み合わせてどうアプローチしたらいいのかわからない。アイテムをグループにまとめることができるのは、そのグループ内のすべてのアイテムが利用可能な配送タイプのサブセットを共有している場合のみです。相互に排他的な配送タイプを持つアイテムは、同じグループに属することはできません。バスケットには、複数のベンダーのアイテムを含めることができます。この場合、異なるベンダーの製品は、配送タイプが同じであっても、グループ化されない場合があります。
クライアントは、各タイプの郵便料金のコストに関係なく、グループの最小数が計算されることを要求します。はい、つまり、4 つの商品を別々に配送すると 1 ポンド + 2 ポンド + 3 ポンド + 4 ポンド (4 つの異なる配送タイプ) の費用がかかるが、すべての商品が 15 ポンドの費用がかかる 5 番目の配送タイプを共有している場合、ユーザーは次のようになります。 「組み合わせた」オプションのその単一のより高価なグループが提示されました。
アイテムの利用可能な配信タイプは、ストアド プロシージャを使用してデータベースから取得され、タイプ ID とベンダー ID から作成された一意の識別子を持っているため、タイプ間の同等性を簡単に比較できます。ただし、比較を行ってグループを生成するための効率的なアルゴリズムを思いつくことはできないようです。
データ構造に関して私が望んでいる最終結果は(疑似コード)です:
Basket { List<Item> Items }
=>
GroupsTable {
List<SelectableDeliveryType> Columns,
List<Group { List<Item> }> Rows
}
それぞれItem
に独自のものが含まれており、ラジオボタンを配置する列をList<AvailableDeliveryType>
簡単に決定するために使用できます。SelectableDeliveryType
これをカバーする一般的なアルゴリズムの概念への考え、ポインター(たとえば、セットカバーの問題ではないと思います)などは大歓迎です。