1

わかりました、私はしばらくの間、この問題について頭を悩ませようとしてきましたが、私は疲れすぎてこれについて頭を悩ませることができないと思います。

毎週、私のスクリプトはテーブルを通過し、60 個の新製品のステータスを非アクティブからアクティブに変更します。これらの 60 個の製品がすべて 1 つのカテゴリからではなく、アクティブ化できる製品を含むすべてのカテゴリからのものであることを確認したいと思います。

製品表の例

| productid | category     | status      |
| 1         | iPad 2       | deactivated |
| 2         | iPod Touch 4 | deactivated |

配列の例では、カテゴリ名と、アクティブ化できる製品の数が表示されています。

array(9) {
  ["iPad 2"] => int(2)
  ["iPod Touch 5"] => int(2)
  ["iPod Touch 4"] => int(6)
  ["iPhone 3G/3GS"] => int(94)
  ["iPad 1"] => int(104)
  ["iPad Mini"] => int(150)
  ["iPhone 4/4S"] => int(174)
  ["iPhone 5"] => int(205)
  ["iPad 3/4"] => int(236)
}

さて、これらすべてのカテゴリから適切に分割された製品をアクティブ化するにはどうすればよいでしょうか?

結果の配列は、大まかに手動で計算できます。それは、カテゴリ名、およびアクティブ化される製品です。カテゴリ間でうまく分割された、合計 60 の製品。

array(9) {
  ["iPad 2"] => int(2)
  ["iPod Touch 5"] => int(2)
  ["iPod Touch 4"] => int(6)
  ["iPhone 3G/3GS"] => int(8)
  ["iPad 1"] => int(8)
  ["iPad Mini"] => int(8)
  ["iPhone 4/4S"] => int(8)
  ["iPhone 5"] => int(9)
  ["iPad 3/4"] => int(9)
}

しかし、私にはそのようなアルゴリズムをプログラムする能力がありません。ここにいる誰かが今日の私より少し頭が良いといいのですが?

4

2 に答える 2

0

擬似コード:

EvenlySelect(item_list):
  sorted_items = SortLowestToHighestCount(item_list)
  remaining_num_items = CountTotalNumberOfItems(item_list)
  return_list = Empty()
  while (!Empty(sorted_items)):
    desired_quantity = remaining_num_items / Size(sorted_items))
    if desired_quantity == 0:
      break
    quantity_to_add = 0
    if desired_quantity > sorted_items[0].quantity:
      quantity_to_add = sorted_items[0].quantity
    else:
      quantity_to_add = desired_quantity
    Append(Item(sorted_items[0].category, quantity_to_add), return_list)
    remaining_num_items -= quantity_to_add
    RemoveFirstElement(sorted_items)

  return return_list

アイデアは次のとおりです。最小量のカテゴリから最大量のカテゴリに移動します。各ステップで、そのカテゴリから偶数になるために必要なアイテムの数を計算します (前のステップで既に選択したものを前提とします)。カテゴリに十分なアイテムがある場合は、その数を取ります。それ以外の場合は、できるだけ多く取ります。

于 2013-02-25T16:38:09.450 に答える
0
import java.util.Arrays;
import java.util.Random;

public class Selection {
    public static void main(String[] args) {
        //input arrays
        String[] categories = {"iPad 2","iPod Touch 5","iPod Touch 4","iPhone 3G/3GS","iPad 1","iPad Mini","iPhone 4/4S","iPhone 5","iPad 3/4"};
        int[] quantities = {2,2,6,94,104,150,174,205,236};
        //ensure that there's at least one item for each category
        int[] distributions = {1,1,1,1,1,1,1,1,1};
        int[] intervals = new int[9];
        intervals[0] = 2;
        for (int i=1;i<9;i++) {
            intervals[i] = intervals[i-1]+quantities[i];
        }
        Random generator = new Random();
        int range = intervals[intervals.length-1];
        for (int j=0;j<51;j++) { //to fill the remaining 51 slots according roughly to their proportions
            int randomInt = generator.nextInt(range); //generate an integer between 0 and 2+2+6+94+104+150+174+205+236 at random
            if (randomInt < intervals[0]) {
                distributions[0]++;
            } 
            else if (randomInt >= intervals[0] && randomInt < intervals[1]) {
                distributions[1]++;
            }
            else if (randomInt >= intervals[1] && randomInt < intervals[2]) {
                distributions[2]++;
            }
            else if (randomInt >= intervals[2] && randomInt < intervals[3]) {
                distributions[3]++;
            }
            else if (randomInt >= intervals[3] && randomInt < intervals[4]) {
                distributions[4]++;
            }
            else if (randomInt >= intervals[4] && randomInt < intervals[5]) {
                distributions[5]++;
            }
            else if (randomInt >= intervals[5] && randomInt < intervals[6]) {
                distributions[6]++;
            }
            else if (randomInt >= intervals[6] && randomInt < intervals[7]) {
                distributions[7]++;
            }
            else {
                distributions[8]++;
            }
        }
        System.out.println("array(9) {");
        for (int k=0; k< 9; k++) {
            System.out.println("  [\""+categories[k]+"\"] => int("+distributions[k]+")");
        }
        System.out.println("}");
    }
}

上記の完全で機能するコードをテストしましたが、コードが一目瞭然であることを願っています。

これが私が得たサンプル出力です:

array(9) {
  ["iPad 2"] => int(1)
  ["iPod Touch 5"] => int(1)
  ["iPod Touch 4"] => int(2)
  ["iPhone 3G/3GS"] => int(6)
  ["iPad 1"] => int(7)
  ["iPad Mini"] => int(11)
  ["iPhone 4/4S"] => int(8)
  ["iPhone 5"] => int(13)
  ["iPad 3/4"] => int(11)
}

アイデアは単純です。最初に、各カテゴリに 1 つのアイテムを予約します。これにより、スロットが 9 つ減ります。残りの 51 個のスロットを 1 つずつ考えてみましょう。それぞれのスロットには、それぞれのカテゴリに進む割合に基づいたチャンスがあります。アイテムの総量が十分に大きくなく、ランダム関数を使用して整数を生成するため、結果が各カテゴリの割合に完全に一致することは保証できません。それにもかかわらず、解決策はあなたの目的には十分だと思います。

于 2013-02-25T20:05:37.923 に答える