ورود

View Full Version : راهنمایی در مورد یک الگوریتم



s.Jabbari
جمعه 03 دی 1389, 13:12 عصر
سلام
کسی ار ذوستان میتونه میتونه بگه این الگوریتم چه کاری انجام میده.یه راهنمایی کوچولو هم بکنید کافیه





#include <iostream>
using namespace std;

const int SIZE = 10;
const int MAXNUM = 6;


bool bestStrat[SIZE];
int bestStratSize = 0;

double calcProb(int n, bool correct[], bool strategy[], int num[], int likely[], double prob[])
{
double ans = 1.0, p;
for(int i=0; i<n; i++) {
if (strategy[i]) {
if (likely[i] == 0)
p = 0.0;
else
p = prob[i]/likely[i];
}
else {
if (num[i]-likely[i] == 0)
p = 0;
else
p = (1.0-prob[i])/(num[i]-likely[i]);
}
if (correct[i]) {
ans *= p;
}
else
ans *= (1.0-p);
}
return ans;
}

double bestStrategy(int n, int num[], int likely[], double prob[], int level);

double evalStrategy(int n, bool strategy[], int num[], int likely[], double prob[], int level)
{
int num2[SIZE], likely2[SIZE];
double prob2[SIZE];
int n2=0;
double total = 1.0;
bool correct[SIZE];


int count = 1;
for(int i=0; i<n; i++) {
if (strategy[i] && likely[i] == 0)
return 0.0;
if ((!strategy[i]) && (num[i]-likely[i] == 0))
return 0.0;
correct[i] = true;
count *= 2;
}
total = calcProb(n, correct, strategy, num, likely, prob); // get prob of all correct

count -= 2; // skip all correct and all incorrect cases in loop
for(;count>0; count--) {
int i=0;
while (!correct[i]) {
correct[i] = true;
i++;
}
correct[i] = false;
double thisProb = calcProb(n, correct, strategy, num, likely, prob);
if (thisProb != 0) {
int j=0;
for(int k=0; k<n; k++) {
if (!correct[k]) {
num2[j] = num[k] - 1;
if (strategy[k]) {
likely2[j] = likely[k] - 1;
prob2[j] = prob[k]*(likely[k]-1)/(likely[k]-prob[k]);
}
else {
likely2[j] = likely[k];
prob2[j] = prob[k]*(num[k]-likely[k])/(num[k]-likely[k]-(1.0-prob[k]));
}
j++;
}
}
total += thisProb*bestStrategy(j, num2, likely2, prob2, level+1);
}
}
return total;
}

double bestStrategy(int n, int num[], int likely[], double prob[], int level)
{
double best = 0.0, curr;
bool strategy[SIZE];

for(int i=0; i<n; i++) {
strategy[i] = true;
}

while(true) {
curr = evalStrategy(n, strategy, num, likely, prob, level);
if (curr >= best) {
best = curr;
if (level==0) {
bestStratSize = n;
for(int i=0;i<n;i++)
bestStrat[i] = strategy[i];
}
}
int i=0;
while (i<n && !strategy[i]) {
strategy[i] = true;
i++;
}
if (i == n)
break;
strategy[i] = false;
}
return best;
}

int main()
{
int n;
int num[SIZE], likely[SIZE];
double prob[SIZE];

cin >> n;
while (n != 0) {
for(int i=0; i<n; i++) {
cin >> num[i] >> likely[i] >> prob[i];
}
double ans = bestStrategy(n, num, likely, prob, 0);
ans = ((int)(1000*ans+0.5))/1000.0;
cout << ans << endl;;
cin >> n;
}
}

emab110
دوشنبه 04 بهمن 1389, 13:41 عصر
به نظر میرسه از مسایل acm باشه.
اگر صورت مساله رو در اختیار دارید قرار بدید تا شاید بتونیم راهنمایی کنیم.

سوالی که پرسیدی بیشتر مثل پیدا کردن پرتغال فروشه! در ضمن این سوال خیلی ربطی به MFC نداره و بهتر بود در بخش زیر میپرسیدی:
الگوریتم، کامپایلر، هوش مصنوعی و ساختمان داده ها (http://barnamenevis.org/forumdisplay.php?40-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85%D 8%8C-%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84%D8%B1%D 8%8C-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D9%88-%D8%B3%D8%A7%D8%AE%D8%AA%D9%85%D8%A7%D9%86-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7)

ویرایش______________________________________ _____________________________________
من جستجو کردم و صورت مساله رو در این لینک (http://acm.ashland.edu/2009/Problem-Set/Problems/2009.pdf) پیدا کردم.

مساله یک بازی احتمالی هست که از شما می خواد تا بهترین استراتژی برای این بازی رو پیدا کنید. با توجه به اینکه حالت ها محدوده (2*3*4*5*6 حالت)، تابع bestStrategy حالت های مختلف رو ایجاد میکنه، با کمک تابع evalStrategy احتمال موفقیت هر حالت یا استراتژی رو محاسبه می کنه و یک ماکزیمم رو پیدا میکنه.
بعد ماکزیمم رو به فرمت خروجی درمیاره و چاپ میکنه.