确保物体进入正确的桶中

时间:2019-08-07 21:27:47

标签: javascript constraint-programming

我有这些独特而独特的物品。

items = [1, 2, 3, 4, 5, 6, 7, 8]

当前,方桶显示每个项目可以放置的位置。物品只能放在允许的地方。

possiblebuckets = [
  [1, 6, 3, 4], [7, 3, 6], [5, 3, 1], [3, 2, 4], [2], [2], [2, 3]
]

我希望每个存储桶都有一个项目。我想确保可以将物品放入存储桶中,以便将最大数量的物品放入存储桶中。如果某些项目无法放入存储桶或某些存储桶仍然为空,则可以。

结果应为:

finalbuckets = [
  [6], [7], [1], [4], [2], [], [3]
]

例如,一种简单的方法:

      items.forEach(function (item) {
        var findMatch = possiblebuckets.filter(function (bucket, i) {
          return bucket.includes(item)
        });

        findMatch.length = 0
        findMatch.push(item);
      });

导致物品没有放入最佳存储桶中。

1 个答案:

答案 0 :(得分:0)

好的,这是我的解决方案:

      var oneLevelDeepClone = function (obj) {
        return obj.map(function (bucket) {
          return bucket.map(function (item) {
            return item
          })
        })
      }

      var maxDeployments;
      var maxDeploymentsCount = 0;

      function constraintProblem (tempBuckets) {
        const tryAgain = [];

        var iterativeTempBuckets = oneLevelDeepClone(tempBuckets)
        var innerTempBuckets = oneLevelDeepClone(iterativeTempBuckets)
        innerTempBuckets.forEach(function (bucket, bucketIndex) {
          var keep = bucket.shift();
          if (bucket.length) {
            // worth a try
            bucket.forEach(function (item) {
              var newAttempt = oneLevelDeepClone(innerTempBuckets)
              newAttempt[bucketIndex] = [item]
              tryAgain.push(newAttempt);
            })
          }

          if (keep) {
            // keep 1 and toss the others, then remove that one from the other buckets
            innerTempBuckets[bucketIndex] = [keep]
            innerTempBuckets.forEach(function (iterativeBucket, iterativeBucketIndex) {
              if (bucketIndex != iterativeBucketIndex) {
                if (iterativeBucket.indexOf(keep) != -1) {
                  iterativeBucket.splice(iterativeBucket.indexOf(keep), 1)
                }
              }
            })
          }
        })

        var counter = 0;
        innerTempBuckets.forEach(function (bucket) {
          if (bucket[0]) counter++
        })
        if (counter > maxDeploymentsCount) {
          maxDeploymentsCount = counter;
          maxDeployments = innerTempBuckets;
        }

        if (tryAgain.length) {
          tryAgain.forEach(function (anotherTry) {
            constraintProblem(anotherTry);
          })
        }
      }

possiblebuckets = [
  [1, 6, 3, 4], [7, 3, 6], [5, 3, 1], [3, 2, 4], [2], [2], [2, 3]
]
      constraintProblem(possiblebuckets)

console.log(maxDeployments);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

<pre id="results"></pre>

相关问题