简体   繁体   English

在不违反约束的情况下生成整数数组

[英]Generating an array of integers without violating constraints

I am struggling with a problem for hours. 我一直在为一个小时苦苦挣扎。 It is a constraint satisfaction problem. 这是一个约束满足问题。 Let me describe it on a simple example: 让我用一个简单的例子来描述它:

Assume there is an array of integers with length 8. Every cell can take certain values. 假设有一个长度为8的整数数组。每个单元格可以采用某些值。 First 4 cells can take 0, 1 or 2 and the other half can take 0 or 1. These 3 arrays can be some examples. 前四个单元可以取0、1或2,另一半可以取0或1。这3个数组可以是一些示例。

{2,1,0,2,1,1,0,1}
{2,2,1,0,0,1,0,0}
{0,0,0,2,0,0,0,1}

However there are some constraints to construct the arrays as follows: 但是,构造数组存在一些约束,如下所示:

constraint1 = {1,-,-,-,-,1,-,-}  // !(cell2=1 && cell6=1) cell2 and cell6 can not be in these format. 
constraint2 = {0,-,-,-,-,-,-,0}  // !(cell1=0 && cell8=0)
constraint3 = {-,-,-,2,1,1,-,-}  // !(cell4=2 && cell5=1 && cell6=1)
constraint4 = {1,1,-,-,-,-,-,-}  // !(cell1=1 && cell2=1)

For better understanding; 为了更好的理解;

{0,1,1,2,0,1,0,0}  // this is not valid, because it violates the constraint2
{1,1,2,2,1,1,0,1}  // this is not valid, because it violates the constraint3 and constraint4
{1,1,0,0,0,1,0,0}  // this is not valid, because it violates the constraint4

I need to generate an array of integers which does not violates any of the given constraints. 我需要生成一个不违反任何给定约束的整数数组。

In my approach; 在我的方法中

1) Create an array (called myArray) and initialize every cell to -1
2) Count the number of cells which are used in constraints. Above example, cell1 is used 3 times, cell2 is used 1 time, cell3 is not used, so on so forth.
3) Choose the cell which is used more in constraints (it is cell1, used 3 times)
4) Find the distribution of numbers in this cell. (In cell1, 1 is used 2 times and 0 is used 1 time)
5) Change this chosen cell in myArray to the number which is used less. (In cell1, since 0 is used less than 1, cell1 in myArray will be 0) 
6) Delete all the constraints from the list which has 1 or 2 in their cell1.
7) Go to step 2 and do same steps until all constraints are eliminated

The idea of this algorithm is to chose the cell and its value in such a way that it will eliminate more constraints. 该算法的思想是选择单元格及其值,以消除更多约束。

However, this algorithm is not working, when the number of constraints are higher. 但是,当约束数量更多时,该算法不起作用。

Important Note: This is just a simple example. 重要说明:这只是一个简单的示例。 In normal case, length of the array is longer (averagely 100) and number of constraints is higher (more than 200). 在正常情况下,数组的长度较长(平均为100),约束的数量较高(大于200)。 My input is length of the array, N constraints and the values each cell can take. 我的输入是数组的长度,N个约束和每个单元格可以取的值。

Is there anyone who has better idea to solve this problem? 有谁有更好的主意来解决这个问题?

Here is a code that I have written in C# to generate a random matrix and then to remove the constraint in the matrix. 这是我用C#编写的代码,用于生成随机矩阵,然后删除矩阵中的约束。

class Program
{
    static void Main(string[] args)
    {

        int[] inputData = new int[4] { 3, 7, 3, 3 };
        int matrixRowSize = 6;

        /////////////////////////// Constraints 

        int []constraint1 = new int[4] { 1, -1, -1, 2}; // here is the constaint that i want to remove.
        // note the constaints could be more than 1, so there could be a generic method

        Random r = new Random();
        int[,] Random_matrix = new int[matrixRowSize, inputData.Length];
        ///////////// generate random matrix 
        for (int i = 0; i < inputData.Length; i++)
        {
            for (int j = 0; j < matrixRowSize; j++)
            {       
                int k = r.Next(0, inputData[i]);  


                Random_matrix[j, i] = k;
            }
        }

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在不违反严格别名规则的情况下解析字节数组? - How to parse byte array without violating strict aliasing rule? `u8string_view` 转换成 `char` 数组而不违反严格混叠? - `u8string_view` into a `char` array without violating strict-aliasing? 在不违反“严格别名”的情况下使用 std::array&amp; 分配 C 样式数组的一个子部分并因此调用 UB? - Assigning a subsection of C-style array using a std::array& without violating "strict aliasing" and hence invoking UB? 如何创建一个没有边界的整数数组? - How to create an array of integers without the bounds? 在不违反信息隐藏的情况下重载流插入? - Overloading stream insertion without violating information hiding? 使用数据缓冲区而不会违反严格的别名 - Using a data buffer without violating strict aliasing 在Rcpp中生成整数样本 - Generating sample of integers in Rcpp 生成具有顺序约束的所有排列 - Generating all permutations with order constraints 如何在不使用指针的情况下编写对10个整数的数组的引用? - How to write a reference to an array of 10 integers without using pointers? 生成具有差异约束的随机整数 - Generating random integers with a difference constraint
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM