试图找到两个阵列的无支配解决方案

时间:2013-07-02 08:56:53

标签: c arrays


我试图在优化问题中找到两个数组的无支配值。

我有两个数组,lost_bars_arrayprices_array。我想要做的是最小化丢失的条形,并最大限度地降低价格。我想获得一个名为no_dominated的最终数组,其中包含两个数组的非支配值的索引。这很容易理解。让我用一个例子解释一下。

我们有两个阵列: enter image description here

理论过程如下:

1。获取第一个值
enter image description here

2。获取第二个(索引#1)并查看它是否比第一个更好的解决方案。这意味着我们要看第二个是否有丢失的杠杆和更大的价格。事实并非如此,它有很少的酒吧,而且价格也很低,所以我们不能说这是一个更好的解决方案。我们将其保存为可行的解决方案 enter image description here

3。现在是下一个,索引#2,这个改进了索引#1的解决方案,因为它有少量丢失的brs和更大的价格。但它并没有改善索引#0,因为它的LESS损失很少但价格也很低。因此,我们将索引#0和索引#2保存为可能的解决方案 enter image description here

4。索引#3和#4有更多丢失的条形和更低的价格,因此请将它们作为可能的解决方案拒绝。

5。最后,索引#5比索引#0有更少的条形和更多的价格,因此,索引#0的解决方案被拒绝,最终的无支配值将是索引#2和索引#5中的索引。 enter image description here

这是我到目前为止所尝试过的。

#include <stdio.h>

int main(int argc, char** argv)
{
    int lost_bars_array[] = {15, 10,  8, 15, 17,  9};
    int prices_array[]    = {35, 25, 30, 10, 15, 36};
    int no_dominated[6];
    int cont              = 6;

    for (int actual_pos = 0; actual_pos < cont; actual_pos++)
    { 
        if (actual_pos == 0)
        {
            no_dominated[actual_pos] = actual_pos; 
        } 
        else
        {
            // Here's where I've the problems, I dont know how to handle the arrays
            for (int p = 0; p < actual_pos; p++)
            {
                if (lost_bars_array[p] > lost_bars_array[p + 1] && 
                    prices_array[p] < prices_array[p + 1])
                {
                    no_dominated[p] = p;
                }

            }
        }
    }

    printf("\nThe non-dominated solutions index are: %d");
    for (int i = 0; i < 6; i++)
    {
        printf(" %d ", no_dominated[i]);
    }

    printf("\n");

    return 0;
}

代码应输出索引2 5作为解决方案。 我希望我能正确解释问题。
任何帮助表示赞赏。提前谢谢。

2 个答案:

答案 0 :(得分:1)

下面的程序可以得到你想要的,但我只针对你的具体情况进行了测试;如果只有一个主导解决方案,或者在其他一些特殊情况下,它可能会失败。但是你可以从中做到这一点。

两个注释:

  • 你忘了包含潜在的解决方案;布尔&&只会保存保证更好的解决方案

  • 最后一个双循环是一个黑客攻击;哈希会更容易(解决方案索引将是哈希),但我认为这需要c ++或额外的库。

代码:

#include <stdio.h>

int main() 
{
    int lost_bars_array[] = {15,10,8,15,17,9};
    int prices_array[] = {35,25,30,10,15,36};
    int no_dominated[6];
    int cont = 6;
    int ndom = 0;

    no_dominated[ndom] = 0;
    ndom++;
    for (int actual_pos = 1; actual_pos < cont; actual_pos++) { 
        int ntmp = ndom;
        for(int p = 0; p < ntmp; p++) {
            if (lost_bars_array[no_dominated[p]] > lost_bars_array[actual_pos] && 
                prices_array[no_dominated[p]] < prices_array[actual_pos]) {
                // Replace with a better solution
                no_dominated[p] = actual_pos;
        } else if (lost_bars_array[no_dominated[p]] > lost_bars_array[actual_pos] ||
               prices_array[no_dominated[p]] < prices_array[actual_pos]) {
                // Save as potential solution
                no_dominated[ndom] = actual_pos;
                ndom++;
            }
        }
    }
    // Remove double solutions
    for (int i = 0; i < ndom; i++) {
        for (int j = i; j < ndom; j++) {
            if (no_dominated[i] == no_dominated[j]) {
                ndom--;
            }
        }
    }
    printf("\nThe non-dominated solutions index are:");
    for(int i = 0; i < ndom; i++)
        printf(" %d ", no_dominated[i]);
    printf("\n");
    return 0;
}

答案 1 :(得分:1)

如果您有n个指标来比较您的数据(在您的实现中,n = 2个数组与数据最大化/最小化),您最多可以有n(2)个非支配元素。

因此,您可以在每个数组中找到max / min元素和索引,这些将是您的解决方案(如果两个索引相同,只添加其中一个)。

你根本不必担心统治,no_dominated不必具有输入的大小。它的大小将介于1和您的度量/数据阵列数之间(在示例中为1或2)