1

ブルートフォースアルゴリズムを機能させるのに問題があります。以下のコードからわかるように、構造体のベクトルを評価し、一連の時限イベントを順序付ける最も効率的な方法を見つけようとしています。「part1Vec」ベクトルにオブジェクトを配置する単純な構造体レイアウトを次に示します。

struct person
{
    float swim;
    float bike;
    float run;

    float bikeRun;

    person();

    person(float swim, float bike, float run)
    {
        this->swim = swim;
        this->bike = bike;
        this->run = run;

        this->bikeRun = bike + run;
    };
};

ただし、コンパイルすると、おそらく次の行までたどったと思われるアルゴリズムクラス内でエラーが発生します。

while (next_permutation(part1Vec.begin(), part1Vec.end()))

私が得るエラーメッセージはこれです:

//Invalid operands to binary expression ('const person' and 'const person')

next_permutation 関数が正しく実装されていると思いますが、なぜこのエラーが発生するのかわかりません。どんな助けでも感謝します、ありがとう。ここに私の完全なコードがあります:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct person
{
    float swim;
    float bike;
    float run;

    float bikeRun;

    person();

    person(float swim, float bike, float run)
    {
        this->swim = swim;
        this->bike = bike;
        this->run = run;

        this->bikeRun = bike + run;
    };
};

//function declarations and global variables
vector<person> part1Vec;
vector<person> highestVec;

float highestRating;
float tempRating;

float rating(vector<person> vector);

int main()
{
    //PART 1

    //make objects
    person one(20, 25, 20), two(35, 20, 15), three(40, 20, 30);

    //insert into vector
    part1Vec.push_back(one);
    part1Vec.push_back(two);
    part1Vec.push_back(three);

    cout << "_________swim__bike__run__" << endl;

    for (int i=0; i<part1Vec.size(); i++)
    {
        cout << "Vector #" << i+1 << ": "
        << part1Vec[i].swim << "  "
        << part1Vec[i].bike << "  "
        << part1Vec[i].run;
    }

    cout << endl << "Calculating..." << endl;

    //Next permutation function
    while (next_permutation(part1Vec.begin(), part1Vec.end())) //Invalid operands to binary expression ('const person' and 'const person')
    {
        //initialize highestVec
        if (highestVec.size() == 0)
        {
            highestRating = rating(part1Vec);
            highestVec = part1Vec;
        }
        //if Highest Rating is less than current permutation, update.
        else if (highestRating < (tempRating = rating(part1Vec)) )
        {
            highestVec = part1Vec;
            highestRating = tempRating;
        }
    }

    cout << "Best Solution:" << endl;
    for (int i=0; i<part1Vec.size(); i++)
    {
        cout << "Vector #" << i+1 << ": "
        << highestVec[i].swim << "  "
        << highestVec[i].bike << "  "
        << highestVec[i].run;
    }

    cout << endl << "Rating: " << highestRating << endl;

    return 0;
}

float rating(vector<person> thisVector)
{
    float rating = 0;
    float swimSum = 0;

    for (int i=0; i<thisVector.size()-1; i++)
    {
        swimSum += thisVector[i].swim;

        if (rating < swimSum + thisVector[i].bikeRun)
            rating = swimSum + thisVector[i].bikeRun;
    }

    return rating;
}
4

1 に答える 1

2

カイル・Y、クリスの意味がわかった?

Chris が気にしないことを願っていますが、念のため詳しく説明します。

まず、使用しているコンパイラを教えてください。理由の 1 つは、異なるエラー メッセージが表示されることです。そして、この例では、Invalid operands to binary expression ('const person' and 'const person')はちょっと役に立ちましたが、それほど役に立ちませんでした。たとえば、これを実行すると、未定義の演算子を探しているgccというよりも似たようなことがわかるでしょう。std::next_permuation

std::next_permuationは、適切な順序付けを使用して順列を生成します。したがって、それ自体に順序が定義された型の引数が必要であり、アルゴリズムが常に終了するように、一貫した順序 (a<(b) および b<(a) が可能である場合、順序付けは一貫していません。 )。

それがクリスが言及していることであり、基本クラスによって順序がまだ定義されていないあなたのような構造体型を使用してC++でそれを行う方法はbool operator<(...、構造体でオーバーライドすることです。

順列生成の順序付けだけが必要なので、上記のように、すべてが順序付けられ、順序付けが一貫している限り、古い順序付けでも問題ありません。

そのオーバーライドと、あるべき場所にいくつかの s を含むコードについては、 hereを再度参照してください。unsigned int

    bool operator<(const person& rhs) const {
    return (this->swim + this->bike + this->run) < (rhs.swim + rhs.bike + rhs.run);
}

一番。

于 2013-10-13T16:48:39.200 に答える